- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
一、 内存在PHP中,填充一个字符串变量相当简单,这只需要一个语句<?php $str = hello world ; ?>即可,并且该字符串能够被自由地修改、拷贝和移动。而在C语言中,尽管你能够编写例如char *str = hello world ;这样的一个简单的静态字符串;但是,却不能修改该字符串,因为它生存于程序空间内。为了创建一个可操纵的字符串,你必须分配一个内存块,并且通过一个函数(例如strdup())来复制其内容。
{char *str;str = strdup(hello world);if (!str) {fprintf(stderr, Unable to allocate memory!);}}
由于后面我们将分析的各种原因,传统型内存管理函数(例如malloc(),free(),strdup(),realloc(),calloc(),等等)几乎都不能直接为PHP源代码所使用。二、 释放内存在几乎所有的平台上,内存管理都是通过一种请求和释放模式实现的。首先,一个应用程序请求它下面的层(通常指操作系统):我想使用一些内存空间。如果存在可用的空间,操作系统就会把它提供给该程序并且打上一个标记以便不会再把这部分内存分配给其它程序。当应用程序使用完这部分内存,它应该被返回到OS;这样以来,它就能够被继续分配给其它程序。如果该程序不返回这部分内存,那么OS无法知道是否这块内存不再使用并进而再分配给另一个进程。如果一个内存块没有释放,并且所有者应用程序丢失了它,那么,我们就说此应用程序存在漏洞,因为这部分内存无法再为其它程序可用。在一个典型的客户端应用程序中,较小的不太经常的内存泄漏有时能够为OS所容忍,因为在这个进程稍后结束时该泄漏内存会被隐式返回到OS。这并没有什么,因为OS知道它把该内存分配给了哪个程序,并且它能够确信当该程序终止时不再需要该内存。而对于长时间运行的服务器守护程序,包括象Apache这样的web服务器和扩展php模块来说,进程往往被设计为相当长时间一直运行。因为OS不能清理内存使用,所以,任何程序的泄漏-无论是多么小-都将导致重复操作并最终耗尽所有的系统资源。现在,我们不妨考虑用户空间内的stristr()函数;为了使用大小写不敏感的搜索来查找一个字符串,它实际上创建了两个串的各自的一个小型副本,然后执行一个更传统型的大小写敏感的搜索来查找相对的偏移量。然而,在定位该字符串的偏移量之后,它不再使用这些小写版本的字符串。如果它不释放这些副本,那么,每一个使用stristr()的脚本在每次调用它时都将泄漏一些内存。最后,web服务器进程将拥有所有的系统内存,但却不能够使用它。你可以理直气壮地说,理想的解决方案就是编写良好、干净的、一致的代码。这当然不错;但是,在一个象PHP解释器这样的环境中,这种观点仅对了一半。三、 错误处理为了实现跳出对用户空间脚本及其依赖的扩展函数的一个活动请求,需要使用一种方法来完全跳出一个活动请求。这是在Zend引擎内实现的:在一个请求的开始设置一个跳出地址,然后在任何die()或exit()调用或在遇到任何关键错误(E_ERROR)时执行一个longjmp()以跳转到该跳出地址。尽管这个跳出进程能够简化程序执行的流程,但是,在绝大多数情况下,这会意味着将会跳过资源清除代码部分(例如free()调用)并最终导致出现内存漏洞。现在,让我们来考虑下面这个简化版本的处理函数调用的引擎代码:
void call_function(const char *fname, int fname_len TSRMLS_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(function_table),lcase_fname, fname_len + 1, (void **)fe) == FAILURE) {zend_execute(fe->op_array TSRMLS_CC);} else {php_error_docref(NULL TSRMLS_CC, E_ERROR,Call to undefined function: %s(), fname);}efree(lcase_fname);}
当执行到php_error_docref()这一行时,内部错误处理器就
您可能关注的文档
最近下载
- 一种酿酒酵母培养物及其应用.pdf VIP
- 消防增压稳压设备的维护保养保养内容和方法.docx VIP
- 乡村振兴与乡村教育事业.pptx VIP
- 标准图集-20S515-钢筋混凝土及砖砌排水检查井.pdf VIP
- 文书工作与档案管理教学课件作者第三版赵映诚12第十二章专门档案的管理与利用(3333KB).ppt VIP
- 矿用自救器的使用方法.ppt VIP
- NC6相对NC5给客户带来的新价值.pptx VIP
- 公司廉政风险防控手册模板.pdf VIP
- 2025届高中英语外研版高考复习课件:The world of science.ppt VIP
- 自觉遵守课堂纪律 班会课件(共23张PPT).pptx VIP
文档评论(0)