[share]深入探讨PHP中的内存管理问题.doc

[share]深入探讨PHP中的内存管理问题.doc

ID:51076121

大小:109.00 KB

页数:15页

时间:2020-03-18

[share]深入探讨PHP中的内存管理问题.doc_第1页
[share]深入探讨PHP中的内存管理问题.doc_第2页
[share]深入探讨PHP中的内存管理问题.doc_第3页
[share]深入探讨PHP中的内存管理问题.doc_第4页
[share]深入探讨PHP中的内存管理问题.doc_第5页
资源描述:

《[share]深入探讨PHP中的内存管理问题.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、一、内存在PHP中,填充…个字符串变量相当简单,这只需要-•个语句y?php$str='helloworld';?>”即可,并且该字符串能够被自由地修改、拷贝和移动。而在C语言中,尽管你能够编写例如"char*str=“helloworld这样的•个简单的静态字符串;但是,却不能修改该字符串,因为它生存丁程序空间内。为了创建-个对操纵的字符串,你必须分配-•个内存块,并且通过一个函数(例如strdup())来复制其内容。{char*str;str=strdup("helloworld");if(!str){fprintf(stderr,"Unabletoall

2、ocatememory!");}}由于后面我们将分析的各种原因,传统型内存管理函数(例如malloc(),free(),strdup(),realloc(),calloc(),等等)儿乎都不能直接为PHP源代码所使用。二、释放内存在几乎所有的平台上,内存管理都是通过-•种请求和释放模式实现的。首先,…个应用程序请求它下面的层(通常指”操作系统”):”我想使用-些内存空间”。如果存在可用的空间,操作系统就会把它提供给该程序并口打上-个标记以便不会再把这部分内存分配给英它程序。当应用程序使用完这部分内存,它应该被返冋到OS;这样以来,它就能够被继续分配给英它程序。

3、如果该程序不返冋这部分内存,那么OS无法知道是否这块内存不再使用并进啲再分配给另…个进程。如杲-个内存块没有释放,并II所有者应用程序丢失了它,那么,我们就说此应用程序“存在漏洞”,因为这部分内存尢法再为其它程序可用。在•个典型的客八端应用程序中,较小的不A经常的内存泄漏有吋能够为OS所“容忍”,因为在这个进程稍后结束时该泄漏内存会被隐式返冋到OS。这并没有什么,因为OS知道它把该内存分配给了哪个程序,并且它能够确信半该程序终止时不再需耍该内存。iiij对于长时间运行的服务器守护程序,包括象Apache这样的web服务器和扩展php模块来说,进程往往被设计为相

4、当长时间-直运行。因为OS不能清理内存使用,所以,任何程序的泄漏•无论是多么小■都将导致重复操作并报终耗尽所有的系统资源。现在,我们不妨考虑用八空间内的stristr()函数;为了使用大小写不敏感的搜索来查找…个字符串,它实际上创建了两个串的各自的-个小型副本,然后执行-个更传统型的大小写敏感的搜索来查找相对的偏移吊“然而,在定位该字符串的偏移吊之后,它不再使用这些小写版本的字符串。如果它不释放这吐副本,那么,每•个使用stristr()的脚本在每次调用它时都将泄漏•些内存。最后,web服务器进程将拥有所有的系统内存,但却不能够使用它。你对以理冇气壮地说,理想

5、的解决方案就是编写良好、T•净的、一致的代码。这为然不错;但是,在一个象PHP解释器这样的环境中,这种观点仅对了一半。三、错误处理为了实现“跳出“对用八空间脚本及其依赖的扩展两数的•个活动谙求,需耍使用-•种方法来完全”跳出”•个活动请求。这是在Zend引擎内实现的:在-个请求的开始设置•个”跳出”地址,然后在任何die()或exit()调用或在遇到任何关键错误(E_ERROR)时执行•个longjmp()以跳转到该”跳出”地址。尽管这个”跳出“进程能够简化程序执行的流程,但是,在绝大多数情况下,这会意味着将会跳过资源淸除代码部分(例如free()调用)并最终

6、导致出现内存漏洞。现在,让我们来不虑下面这个简化版本的处理函数调用的引擎代码:voidcall_function(constchar*fname.intfname_lenTSRMLS_DC){zend_function*fe;char*lcase_fname;/*PHP函数名是大小写不敏感的,*为了简化在函数表中对它们的定位,*所有函数名都隐含地翻译为小写的*/lcase_fname=estrndup(fname,fname_len);zend_str_tolower(lcase_fname,fname_len);if(zend_hash_find(EG(fu

7、nction_table),lcase_fname.fname_len+1,(void**)&fe)==FAILURE){zend_execute(fe->op_arrayTSRMLS_CC);}else{php_error_docref(NULLTSRMLS_CC,E_ERROR,HCalltoundefinedfunction:%s(八fname);efree(lcase_fname);}当执行到php_error_docref()这彳了时,内部错误处理器就会明门该错误级别是critical,并相应地调用longjmp()來中断当前程序流程并离开call_

8、function()函数,共至根本不会

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。