搬家后Discuz积分兑换突然出了问题,表现在点击兑换后无响应,用抓包工具查得1多分钟后返回500错误。
这可急坏了,这功能可是俺用来赚钱的。。
经过很久很久,通过在各个php文件中插入file_put_contents("debug.txt","xxxxxxxxxx");跟踪,从memcp.php,到uc_client/client.php,最终查得阻塞在通过HTTP调用ucenter/index.php中网络文件的fget上。
开始以为是不是ucenter出问题了,然而输出到debug然后用nc手动请求ucenter却是一切正常。
到这里就突然想起,我在调用php的fastcgi中设置php的子进程数为2,也就是服务器只能同时处理两个php请求,而进行积分兑换时浏览器请求memcp,memcp通过uc_client请求ucenter,ucenter又会请求被兑换端的api,这样一来就三个了,于是第三个被阻塞,程序陷入deadlock。
更改fastcgi脚本,进程数设为8,问题解决。
之所以不弄那么多进程是因为vps内存实在是太小了,当时用apache的fork模式,那真是F5就能把服务器刷死,现在改成worker模式+fastcgi,却又发现php-cgi又常驻内存了。
依旧有待研究优化。。。