PHP网页设计linux下创立线程内存泄露,php的json_en...
怎么样出来了吧,怎么样自己也可以写出php程序了,虽然离职业和专业的人还有很远,但是好的开始是成功的一半。这个时候改怎么做了呢。现在就是拿1本高手推荐的书,重头到尾读1遍,我说的这个读是自己看。此次仍是把碰到的几个成绩收拾整顿一下,但愿再碰到的同窗能轻松处理。别的比来博客的feeds延迟更新的缘由也会一同申明一下。
1.linux下创立线程招致内存泄露
明天在外网宣布了一个server以后,用top发明virt的利用量一向在涨,并且一次涨8m。因而可以判定有内存泄露了,经由排查,终究肯定缘由出在多线程的成绩上:
代码以下:
1 2 3 4 5 6 pthread_t thread_id; int ret=pthread_create(&thread_id, NULL, flush_thread_work, (void*)&m_sql_client); if(ret!=0){ APPSCORE_ERROR("Thread creation failed:%d",ret); return ret; }在flush_thread_work函数外部:
1 2 3 4 5 void* flush_thread_work(void* args) { //....do something return NULL; }代码中启动了一个线程以后,主历程就持续履行,任由新线程自生自灭了(没有挪用thread_join),而主历程每隔一段工夫就会拉起如许一个线程来做一些数据落地的工作。
如许的写法实践上是会形成内存泄露的.
Linux man page 里有已申明了这个成绩:
When a joinable thread terminates, its memory resources (thread descriptor and stack) are not deallocated until another thread performs pthread_join on it. Therefore, pthread_join must be called once for each joinable thread created to avoid memory leaks.
也就说线程履行完后假如不join的话,线程的资本会一向得不到释放而招致内存泄露!
处理办法有两种:
a.在线程履行的函数内手工释放
1 2 3 4 5 6 void* flush_thread_work(void* args) { //....do something pthread_detach(pthread_self()); return NULL; }b.在线程启动时,设置线程的PTHREAD_CREATE_DETACHED属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 pthread_attr_t attr; pthread_attr_init (&attr); pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED); int ret=pthread_create(&thread_id, &attr, flush_thread_work, (void*)&m_sql_client); if(ret!=0){ //记住attr也要析构,不然
又是一个内存泄露
pthread_attr_destroy (&attr); APPSCORE_ERROR("Thread creation failed:%d",ret); return ret; } //记住attr也要析构,不然
又是一个内存泄露
pthread_attr_destroy (&attr);如许成绩就能够处理了。
参考材料:
处理了一个荫蔽的内存泄露——pthread_create后没有detach招致内存延续增加
2.php的json_encode函数成绩
在公司做了一个使用,是php与c++停止收集交互,所以选择了json这类对照通用的序列化格局,但是却碰到了对照奇异的成绩。
先来看以下代码(php):
1 2 3 4 5 $objs = array(); $objs = 'a'; $objs = 'b'; $objs = 'd'; echo json_encode($objs)."\n";输入的了局以下:
pthread_t thread_id; int ret=pthread_create(&thread_id, NULL, flush_thread_work, (void*)&m_sql_client); if(ret!=0){ APPSCORE_ERROR("Thread creation failed:%d",ret); return ret; }0如许是正常的,用jsoncpp也能够准确的解析出来,php主动将$objs看成一个联系关系数组来生成json数据了。
但是当把代码换成以下:
1 2 3 4 5 6 pthread_t thread_id; int ret=pthread_create(&thread_id, NULL, flush_thread_work, (void*)&m_sql_client); if(ret!=0){ APPSCORE_ERROR("Thread creation failed:%d",ret); return ret; }2则输入了局以下:
pthread_t thread_id; int ret=pthread_create(&thread_id, NULL, flush_thread_work, (void*)&m_sql_client); if(ret!=0){ APPSCORE_ERROR("Thread creation failed:%d",ret); return ret; }3jsoncpp依照之前的解析办法是解析不出来的~
其实对php来讲,这也是公道的,成绩在于在php外面通俗数组和联系关系数组都是array,而对c++来讲,却存在vector和map之分,所以假如仍是想要json_encode生成联系关系数组的格局,那末需求如许写:
1 2 3 4 5 6 pthread_t thread_id; int ret=pthread_create(&thread_id, NULL, flush_thread_work, (void*)&m_sql_client); if(ret!=0){ APPSCORE_ERROR("Thread creation failed:%d",ret); return ret; }5了局以下:
pthread_t thread_id; int ret=pthread_create(&thread_id, NULL, flush_thread_work, (void*)&m_sql_client); if(ret!=0){ APPSCORE_ERROR("Thread creation failed:%d",ret); return ret; }63.本博feed延迟不更新的缘由
之前因为对feedsky的feed更新非常不满,所以参考网上的做法,创立了一个feed.vimer.cn,而本博地点的域名空间会主动依据域名创立一个子目次 - feed,修正这个目次下的.htaccess文件以下:
1 2 3 4 5 pthread_t thread_id; int ret=pthread_create(&thread_id, NULL, flush_thread_work, (void*)&m_sql_client); if(ret!=0){ APPSCORE_ERROR("Thread creation failed:%d",ret); return ret; }8那末当会见 feed.vimer.cn 时,会主动跳转到 http://feed.feedsky.com/vimer。
但是我疏忽了一个成绩,那就是wordpress默许的feed链接是 http://vimer.cn/feed/rss2,而/feed/rss2会被解析成子目次,从而主动跳转到 http://feed.feedsky.com/vimer ,所以feedsky就会一直的读 http://feed.feedsky.com/vimer 这个链接的feed,固然不会有任何新数据。。
所以最初仍是把这类体例放弃失落了,看来真是冤枉了feedsky呀~~~
OK,比来的总结就这么多~
从刚开始练习的PHP基础语法练习,到PHP语言在WEB中的应用,再到实际的项目开发,如留言版,相册系统,中小型公司网站系统,以及期间做过的有关团队合作的小游戏,让我受益匪浅,学到了很多。 开发工具也会慢慢的更专业,每个公司的可能不一样,但是zend studio是个大伙都会用的。 至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。 你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。 因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax 为了以后维护的方便最好是代码上都加上注释,“予人方便,自己方便”。此外开发文档什么的最好都弄齐全。我觉得这是程序员必备的素质。虽然会消耗点很多的时间。但是确实是非常有必要的。 首先声明:我是一个菜鸟,是一个初学者。学习了一段php后总是感觉自己没有提高,无奈。经过反思我认为我学习过程中存在很多问题,我改变了学习方法后自我感觉有了明显的进步。 因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax 说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。 找到的的资料很多都是在论坛里的,需要注册,所以我一般没到一个论坛都注册一个id,所有的id都注册成一样的,这样下次再进来的时候就不用重复注册啦。当然有些论坛的某些资料是需要的付费的。 学好程序语言,多些才是王道,写两个小时代码的作用绝对超过看一天书,这个我是深有体会(顺便还能练打字速度)。 这些都是最基本最常用功能,我们这些菜鸟在系统学习后,可以先对这些功能深入研究。 其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎 有位前辈曾经跟我说过,phper 至少要掌握200个函数 编起程序来才能顺畅点,那些不熟悉的函数记不住也要一拿手册就能找到。所以建议新手们没事就看看php的手册(至少array函数和string函数是要记牢的)。 多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。 有时候汉字的空格也能导致页面出错,所以在写代码的时候,要输入空格最好用引文模式。 本文当是我的笔记啦,遇到的问题随时填充 在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、 建议加几个专业的phper的群,当然啦需要说话的人多,一处一点问题能有人回答你的,当然啦要让人回答你的问题,平时就得躲在里面聊天,大家混熟啦,愿意回答你问题的人自然就多啦。
页:
[1]