PHP-CGI 进程 CPU …

有可能是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 Bad Gateway”。修改该参数,设置一个 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. \?\>

你可能感兴趣的:(PHP-CGI 进程 CPU …)