Later, I tracked the discovery that this kind of situation is closely related to PHP's file_get_contents () function.
In large and medium-sized Web sites, API interface calls based on the HTTP protocol are commonplace. PHP programmers like to use the simple and convenient file_get_contents ("http://example.com/") function to get the return content of a URL, but if http://example.com/the site responds slowly, file _get_contents () will always be stuck there and will not time out.
We know that in php.ini, there is a parameter max_execution_time can set the maximum execution time for PHP scripts, but in php-cgi (PHP-FPM), this parameter will not work. The real ability to control the maximum execution time of a PHP script is the following parameter in the php-fpm.conf configuration file: The timeout (in seconds) for serving a single request after which the Worke R process would be terminated
Should be used when ' max_execution_time ' ini option does not stop script execution for some reason
' 0s ' means ' off '
0s
The default value is 0 seconds, which means that the PHP script will continue to execute. This way, when all the php-cgi processes are stuck in the file_get_contents () function, the nginx+php WebServer can no longer process the new PHP request, and Nginx will return "502 bad Gateway" to the user. To modify this parameter, it is necessary to set the maximum execution time for a PHP script, but the symptom is not a cure. For example, to 30s, if file_get_contents () to get a slow page content, which means that 150 php-cgi process, only 5 requests per second, WebServer also difficult to avoid "502 bad Gateway."
To do a thorough solution, only PHP programmers can get rid of the habit of directly using file_get_contents ("http://example.com/"), but slightly modified, add a time-out, in the following way to implement an HTTP GET request. If you feel trouble, you can encapsulate the following code as a function yourself.
Copy CodeThe code is as follows:
$ctx = stream_context_create (Array (
' http ' = = Array (
' Timeout ' = 1//Set a time-out in seconds
)
)
);
File_get_contents ("http://example.com/", 0, $ctx);
?>
Of course, the reason that causes the php-cgi process CPU 100% is not the only one, then, how to determine the file_get_contents () function is caused?
First, use the top command to see the php-cgi process with high CPU usage.
Copy CodeThe code is as follows:
Top-10:34:18 up 724 days, 21:01, 3 users, Load average:17.86, 11.16, 7.69
tasks:561 Total, running, 546 sleeping, 0 stopped, 0 zombie
Cpu (s): 5.9%us, 4.2%sy, 0.0%ni, 89.4%id, 0.2%wa, 0.0%hi, 0.2%si, 0.0%st
mem:8100996k Total, 4320108k used, 3780888k free, 772572k buffers
swap:8193108k Total, 50776k used, 8142332k free, 412088k cached
PID USER PR NI VIRT RES SHR S%cpu%MEM time+ COMMAND
10747 www 0 360m 22m 12m R 100.6 0.3 0:02.60 php-cgi
10709 www 0 359m 28m 17m R 96.8 0.4 0:11.34 php-cgi
10745 www 0 360m 24m 14m R 94.8 0.3 0:39.51 php-cgi
10707 www 0 360m 25m 14m S 77.4 0.3 0:33.48 php-cgi
10782 www 0 360m 26m 15m R 75.5 0.3 0:10.93 php-cgi
10708 www 0 360m 22m 12m R 69.7 0.3 0:45.16 php-cgi
10683 www 0 362m 28m 15m R 54.2 0.4 0:32.65 php-cgi
10711 www 0 360m 25m 15m R 52.2 0.3 0:44.25 php-cgi
10688 www 0 359m 25m 15m R 38.7 0.3 0:10.44 php-cgi
10719 www 0 360m 26m 16m R 7.7 0.3 0:40.59 php-cgi
Find the PID of one of the CPU 100% php-cgi processes to follow the command:
Copy CodeThe code is as follows:
Strace-p 10747
Select (7, [6], [6], [], {, 0}) = 1 (out [6], left {15, 0})
Poll ([{fd=6, Events=pollin}], 1, 0) = 0 (Timeout)
Select (7, [6], [6], [], {, 0}) = 1 (out [6], left {15, 0})
Poll ([{fd=6, Events=pollin}], 1, 0) = 0 (Timeout)
Select (7, [6], [6], [], {, 0}) = 1 (out [6], left {15, 0})
Poll ([{fd=6, Events=pollin}], 1, 0) = 0 (Timeout)
Select (7, [6], [6], [], {, 0}) = 1 (out [6], left {15, 0})
Poll ([{fd=6, Events=pollin}], 1, 0) = 0 (Timeout)
Select (7, [6], [6], [], {, 0}) = 1 (out [6], left {15, 0})
Poll ([{fd=6, Events=pollin}], 1, 0) = 0 (Timeout)
Select (7, [6], [6], [], {, 0}) = 1 (out [6], left {15, 0})
Poll ([{fd=6, Events=pollin}], 1, 0) = 0 (Timeout)
Select (7, [6], [6], [], {, 0}) = 1 (out [6], left {15, 0})
Poll ([{fd=6, Events=pollin}], 1, 0) = 0 (Timeout)
Select (7, [6], [6], [], {, 0}) = 1 (out [6], left {15, 0})
Poll ([{fd=6, Events=pollin}], 1, 0) = 0 (Timeout)
Select (7, [6], [6], [], {, 0}) = 1 (out [6], left {15, 0})
Poll ([{fd=6, Events=pollin}], 1, 0) = 0 (Timeout)
Select (7, [6], [6], [], {, 0}) = 1 (out [6], left {15, 0})
Poll ([{fd=6, Events=pollin}], 1, 0) = 0 (Timeout)
Then, you can be sure that file_get_contents () is causing the problem.
http://www.bkjia.com/PHPjc/324141.html www.bkjia.com true http://www.bkjia.com/PHPjc/324141.html techarticle later, I tracked the discovery that this kind of situation is closely related to PHP's file_get_contents () function. In large, medium-sized Web sites, API interface calls based on the HTTP protocol, ...