小编的平台是windows server 2003(32位系统) + Apache/2.2.9 (Win32) + PHP/5.2.17,在使用正则表达式 preg_match_all (如 preg_match_all("/ni(.*?)wo/", $html, $matches);)进行分析匹配比较长的字符串 $html 时(大于10万字节,一般用于分析采集回来的网页源码),Apache服务器会崩溃自动重启。
在Apache错误日志里有这样的提示:
[Thu Apr 11 18:31:31 2013] [notice] Parent: child process exited with status 128 -- Restarting. [Thu Apr 11 18:31:31 2013] [notice] Apache/2.2.9 (Win32) PHP/5.2.17 configured -- resuming normal operations [Thu Apr 11 18:31:31 2013] [notice] Server built: Jun 13 2008 04:04:59 [Thu Apr 11 18:31:31 2013] [notice] Parent: Created child process 2964 [Thu Apr 11 18:31:31 2013] [notice] Disabled use of AcceptEx() WinSock2 API [Thu Apr 11 18:31:31 2013] [notice] Child 2964: Child process is running [Thu Apr 11 18:31:31 2013] [notice] Child 2964: Acquired the start mutex. [Thu Apr 11 18:31:31 2013] [notice] Child 2964: Starting 350 worker threads. [Thu Apr 11 18:31:31 2013] [notice] Child 2964: Listening on port 80.
Stacksize pcre.recursion_limit 64 MB 134217 32 MB 67108 16 MB 33554 8 MB 16777 4 MB 8388 2 MB 4194 1 MB 2097 512 KB 1048 256 KB 524
如果你没有调整堆栈大小,就必须在使用正则的PHP页面最开头加入:
<?php ini_set("pcre.recursion_limit", "524"); // PHP default is 100,000. ?>
查看具体的错误可以使用下面的代码:
$resultsArray = preg_match_all("/table.*?<a>/isU", $html, $contents); if ($resultsArray === 0){ echo get_pcre_err(); } function get_pcre_err(){ $pcre_err = preg_last_error(); // PHP 5.2 and above. if ($pcre_err === PREG_NO_ERROR) { $msg = 'Successful non-match.'; } else { // preg_match error! switch ($pcre_err) { case PREG_INTERNAL_ERROR: $msg = 'PREG_INTERNAL_ERROR'; break; case PREG_BACKTRACK_LIMIT_ERROR: $msg = 'PREG_BACKTRACK_LIMIT_ERROR'; break; case PREG_RECURSION_LIMIT_ERROR: $msg = 'PREG_RECURSION_LIMIT_ERROR'; break; case PREG_BAD_UTF8_ERROR: $msg = 'PREG_BAD_UTF8_ERROR'; break; case PREG_BAD_UTF8_OFFSET_ERROR: $msg = 'PREG_BAD_UTF8_OFFSET_ERROR'; break; default: $msg = 'Unrecognized PREG error'; break; } } return($msg); }
对于正则的修饰符 isU 说明:
i: 表示in-casesensitive,即大小写不敏感 s: PCRE_DOTALL,表示点号可以匹配换行符。 U: 表示PCRE_UNGREEDY,表示非贪婪,相当于perl/python语言的.*?,在匹配过程中,对于.*正则,一有匹配立即执行,而不是等.*搜索了所有字符再一一返回
在使用正则表达式时,我们应该尽量避免递归调用,递归容易导致堆栈溢出。比如:
/<table((?!<table).)*?<\/a>/isU 就会发生错误,而使用 /<table.*?<\/a>/i 就正常。
那么如何增加win平台下 ThreadStackSize 的大小呢? 在apache的配置文件 httpd.conf 里启用 “Include conf/extra/httpd-mpm.conf”(删除前面的注释#),然后在 httpd-mpm.conf 文件里的 mpm_winnt_module 配置模块里设置 “ThreadStackSize 8400000”即可(大约8M)。
<IfModule mpm_winnt_module> ThreadStackSize 8400000 ThreadsPerChild 200 MaxRequestsPerChild 10000 Win32DisableAcceptEx </IfModule>
[Thu Apr 11 20:02:45 2013] [crit] (OS 8)存储空间不足,无法处理此命令。 : Child 4832: _beginthreadex failed. Unable to create all worker threads. Created 212 of the 220 threads requested with the ThreadsPerChild configuration directive.
通过上面的提示,小编可以告诉大家的是在我的这台服务器上,当线程堆栈大小设为8M时,我可以设置的线程数最多是212个。
本文向大家介绍使用innodb_force_recovery解决MySQL崩溃无法重启问题,包括了使用innodb_force_recovery解决MySQL崩溃无法重启问题的使用技巧和注意事项,需要的朋友参考一下 一 背景 某一创业的朋友的主机因为磁盘阵列损坏机器crash,重启MySQL服务时 报如下错误: 二 分析 主要关注 mysqld got signal 11 的问题,从日志内
我试图用LWJGL编写一个opengl渲染器。为了打开窗户,我用的是GLFW。但是,当我调用glfwCreateWindow时,它会崩溃,出现以下错误: Java运行时环境检测到一个致命错误: 谢了!
我正在使用内置于Web View的Android开发浏览器。其中我面临的一个问题是,当我访问http://crashmybrowser.com测试浏览器上的选项卡崩溃时,我的整个浏览器应用程序都会崩溃。但是,当在chrome或Opera上进行相同的测试时,这些浏览器会在崩溃中幸存下来,并且只有特定的选项卡崩溃是由于访问上述网站而预期的结果。有人能帮助理解我如何在使用Webview的浏览器上处理此崩
本文向大家介绍Opcache导致php-fpm崩溃nginx返回502,包括了Opcache导致php-fpm崩溃nginx返回502的使用技巧和注意事项,需要的朋友参考一下 我这个博客为了提高运行效率在vps上装了opcache扩展,结果发现有个页面返回502,其他页面正常。 检查了php-fpm日志,发现是php-fpm子进程不知道为什么会崩溃,然后把opcache关了就正常。中间折腾的过程就
如果设备Google Play services版本没有更新,在我的应用程序上使用以下代码会导致应用程序崩溃。 它在Android OS版本4.2.2和Google Play Services版本3.1.58的设备上崩溃(为了处理Google Play Services可用性检查,我特意降低了它的等级)。
我正在尝试使用、和(不使用)实现实时相机应用程序 所以,我发现这篇教程 http://altitudelabs.com/blog/real-time-filter/ 它是用Objective-C编写的,所以我在Swift4.0中重写了那个代码,xcode9 它看起来工作很好,但有时(很少),它崩溃了以下错误。调用的方法时 EXC_BAD_ACCESS(代码=1,地址+0x************)