php 使用 ftp_put 上传文件异常,没有具体错误信息,初步判断应该是程序执行超时,修改php中的 max_execution_time 和 max_input_time 为 300 后再次测试,仍然报错。

经过一番搜索,通过增加 max_children 参数解决问题,具体说明如下:

php执行时间长,导致进程不够用

request_terminate_timeout 的值如果设置为0或者过长的时间,可能会引起 file_get_contents,fsockopen 的资源问题,如果 file_get_contents 请求的远程资源如果反应过慢,file_get_contents 就会一直卡在那里不会超时

php.ini 里面 max_execution_time 可以设置 PHP 脚本的最大执行时间,但是,在 php-cgi(php-fpm)  中,该参数不会起效。真正能够控制 PHP 脚本最大执行时间的是 php-fpm.conf 配置文件中的 request_terminate_timeout 参数

参数优先级 nginx >  php-fpm > php

request_terminate_timeout 默认值为 0 秒,也就是说,PHP 脚本会一直执行下去。当所有的 php-fpm 进程都卡在 file_get_contents() 函数时,这台 Nginx+PHP 的 WebServer 已经无法再处理新的 PHP 请求了,Nginx 将给用户返回 502 Bad Gateway。修改该参数,设置一个 PHP 脚本最大执行时间是必要的;但是,治标不治本,例如改成 30s,如果发生 file_get_contents() 获取网页内容较慢的情况,这就意味着 150 个 php-fpm 进程,每秒钟只能处理 5 个请求,WebServer 同样很难避免”502 Bad Gateway”。

解决办法是增大 php-fpm 数量,增大 request_terminate_timeout ,设置为300s或者一个合理的值,或者给 file_get_contents 加一个超时参数