PHP-CGI 进程 CPU …

来源:互联网 发布:java 手机短信验证码 编辑:程序博客网 时间:2024/05/28 06:04

有可能是file_get_contents() 函数造成的情况。

  file_get_contents("http://www.abc.com/api.php")函数,用来获取一个URL的返回内容,但是如果http://example.com/api.php这个网站响应缓慢,file_get_contents()就会一直停在那儿,但是不会超时。
  在php.ini中,有一个参数 max_execution_time 可以设置 PHP 脚本的最大执行时间,但是,在php-cgi(php-fpm) 中,该参数不会起效。真正能够控制 PHP 脚本最大执行时间的是 php-fpm.conf配置文件中的以下参数:

0s

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

  要做到彻底解决,只能让 PHP 程序员们改掉直接使用file_get_contents("http://example.com/api.php")的习惯,而是稍微修改一下,加个超时时间,用以下方式来实现 HTTP GET请求。要是觉得麻烦,可以自行将以下代码封装成一个函数。

  
  1. \<\?php 
  2. $ctx= stream_context_create(array( 
  3. 'http'=> array( 
  4. 'timeout'=> 1 //设置一个超时时间,单位为秒  
  5. ) 
  6. ) 
  7. ); 
  8. file_get_contents("http://example.com/",0, $ctx);  
  9. \?\>
0 0