我开发了大约10个不同的网站,托管在下面提到的单个服务器上。
故事:
一切都很顺利,直到我决定将PHP Opcode缓存集成到系统中。我首先尝试了APC,但使用Xcache时出现了相同的问题,因此我不认为与缓存程序本身有关。
该系统在一段时间内保持稳定,时间从一天到一周不等,并且在不同的时间崩溃,但主要是在晚上23点至05点左右。如果我重新启动httpd服务,则系统在同一时期内(1天至1周)保持稳定,然后再次崩溃等等...
Bug报告:
这是我在最后一次崩溃期间的httpd全局日志报告:
[Thu Feb 18 20:00:11.270997 2016] [core:notice] [pid 24956:tid 139940499228480] AH00052: child pid 4522 exit signal Aborted (6)
httpd: hostip.c:693: Curl_resolv_unlock: Assertion `dns && (dns->inuse>0)' failed.
[Thu Feb 18 20:08:38.793218 2016] [core:notice] [pid 24956:tid 139940499228480] AH00052: child pid 6246 exit signal Aborted (6)
httpd: hostip.c:693: Curl_resolv_unlock: Assertion `dns && (dns->inuse>0)' failed.
[Thu Feb 18 22:12:33.576308 2016] [core:notice] [pid 24956:tid 139940499228480] AH00052: child pid 8362 exit signal Aborted (6)
httpd: hostip.c:693: Curl_resolv_unlock: Assertion `dns && (dns->inuse>0)' failed.
[Thu Feb 18 22:40:07.297428 2016] [core:notice] [pid 24956:tid 139940499228480] AH00052: child pid 10224 exit signal Aborted (6)
[Thu Feb 18 23:00:40.526867 2016] [core:warn] [pid 24956:tid 139940499228480] AH00045: child process 10846 still did not exit, sending a SIGTERM
...
请注意,服务器在22:41:xx左右变得阻塞。我在23:00:xx重新启动了服务器,这与此处发布的最后一行有关。
可能与curl有关,我经常使用它,特别是PHP curl_multi,以便通过同时启动它们来加速我的API调用。但是即使没有安装(或禁用)任何PHP opcode缓存,也会发生同样的错误,但不会使服务器崩溃。
服务器状态:
当“崩溃”发生时,系统仍然可以提供任何txt、image等文件,但无法提供任何PHP文件。服务器被锁定,当查看“Apache服务器状态”时,可能有数百个请求处于“W”状态,并且随着每个传入请求增加而增加。
缓存实现:
如上所述,我尝试使用APC和xCache,但两者都出现了同样的问题。我的PHP是一个编译版本(我没有编译自己)。所有网站上方都有一个Varnish缓存,只缓存一些耗时的页面。我使用Symfony2和Doctrine2,在Doctrine2和xcache/apc之间通过Symfony2配置建立了链接:
doctrine:
orm:
auto_generate_proxy_classes: prod
auto_mapping: true
metadata_cache_driver: xcache
result_cache_driver: xcache
query_cache_driver: xcache
似乎让Doctrine2可以缓存实体对象并产生更好的性能(仅启用缓存对Doctrine2来说不足够)
规格说明:
- Debian 7.8
- Apache 2.4.12
- Mysql
- PHP 5.4.38 (compiled version)
- Varnish
- Symfony 2.4.x
我已经寻找解决方案几个月了,在没有任何opcode缓存的情况下运行PHP-Symfony2网站速度非常慢,如有任何提示或帮助将不胜感激。