使用:
PHP 5.5.10 nginx 1.5.10 Centos 6.5 a xen-based 4GB VPS
我的网站使用encryption的贝宝button。 这种encryption是由以下代码完成的:
$openssl_cmd = "($OPENSSL smime -sign -signer $MY_CERT_FILE -inkey $MY_KEY_FILE " . "-outform der -nodetach -binary <<_EOF_\n$data\n_EOF_\n) | " . "$OPENSSL smime -encrypt -des3 -binary -outform pem $PAYPAL_CERT_FILE"; exec($openssl_cmd, $output, $error);
现在几次(相隔几天)button开始无法编码。 如果我运行“service php-fpm restart”,那么一切都很好。
这是给出的错误:
PHP Warning: exec(): Unable to fork [(/usr/bin/openssl smime -sign -signer /var/www/my-pubcert.pem -inkey /var/www/my-prvkey.pem -outform der -nodetach -binary <datasnipped>) | /usr/bin/openssl smime -encrypt -des3 -binary -outform pem /var/www/paypal_cert.pem]
一旦发生,它似乎不断发生,直到我重新启动php-fpm。
任何想法什么路线我应该去debugging/解决这个问题?
谢谢
很可能PHP进程在某个时候开始使用大量内存(可以在顶部检查,按M按内存对进程进行sorting)。 尝试设置“pm.max_requests = 100”,或者,无论如何,你现在拥有的值要低得多(或者如果是0,就意味着无限大约在100左右)。
顺便说一句,更好的方法是使用PHP OpenSSL库而不是执行OpenSSL的命令行界面。
编辑:
根据你的要求(即使是部分题外话),你可以在这里和这里find2个OpenSSL函数的文档和示例代码。 您可能需要使用OpenSSL支持重新编译PHP,或者安装所需的模块(通常应该内置它)。
我会看看你打开了多less个文件句柄,以及最大的设置。 sysctl fs.file-nr是一个很好的开始。 如果第一个数字接近最后一个,那么您的文件句柄已经用完了! 你可以通过在systcl.conf中设置它们,或者通过sysctl -w fs.file-max=100000来设置它们。 如果是这样的话,我会在你的代码的其他地方看看为什么文件处理不被closures。
在CentOS 6.3上使用PHP 5.3.3,这是我遇到的错误,因为web服务器用户没有有效的shell。 添加.bashrc到nginx用户的主目录为我们修复了它。
看到这个愚蠢的问题的答案: https : //stackoverflow.com/questions/20648949/php-warning-exec-unable-to-fork/24517481#24517481