设置内存GC提高IIS+PHP运行稳定性

IIS配置php提供web服务. 短期访问正常,长时间高压力访问容易崩溃.
表现为IIS提示500错误,php-cgi.exe崩溃. 此时在php日志中看不到任何异常,但windows事件日志记录下了php-cgi.exe应用程序错误. 其原因和php内存管理有关.有以下改善方法

1. 服务器配置足够物理内存.
根据任务管理器界面的物理内存数据,保留更多的空闲物理内存给php-cgi.exe使用. 避免总内存占用超过物理内存.

2. 给php-cgi.exe配置足够内存.
php内存回收机制决定了达到一半的内存占用时就会运行gc. 频繁的gc造成php崩溃(windows版php的bug)

1
2
;根据实际情况可以改大些. 最好超过实际占用值的两倍以上(任务管理器可以查看php-cgi进程得知实际占用值)
memory_limit = 128M

程序中如下代码,效果和更改php.ini相同.

1
ini_set('memory_limit','128M');

3. fastcgi配置请求超过一定数量(例如1000) 就重启进程.

1
2
3
       MaxInstances=64   #根据内存和CPU情况配置最大php-cgi.exe进程数. 不要服务器压力过大.
       InstanceMaxRequests=1000  #每处理1000个请求则重启实例. 
       EnvironmentVars=PHP_FCGI_MAX_REQUESTS:1000 #同上

如果64/1000还不行,可以配置更少

4.减少请求处理内存占用和处理时长.
优化PHP代码,提高程序性能和减少内存占用。比如使用php完成采集任务时避免一次采集过多内容(那样会占用大量的内存和单次cpu处理时间).

5. 可以考虑在php处理过程中关闭gc.

虽然关闭gc会造成php内存占用增大,但可以避免频繁运行gc造成php-cgi.exe崩溃.

1
2
3
4
gc_collect_cycles();
gc_disable();
....php业务代码.
gc_enable();

以上方法可以极大的改善windows版php的运行稳定性. 总结就是以下几点:
1. 不要让PHP服务器满负荷运行.
2. 尽可能减少PHP引擎的内存回收次数(通过优化代码降低内存占用或关闭gc实现)

Proudly powered by WordPress   Premium Style Theme by www.gopiplus.com