MENU 辦事 案例
咱們經由過程擁抱變更締造
360°的品牌代價__
簡體
簡體中文 English

一杯寶醞酒,醬香敬古今!尚品簽約寶醞團體官網扶植

范例:團體官網 領會更多

[北京網站建造]PHP-CGI 過程 CPU 100% 與 file_get_contents 函數的干系

來歷:尚品中國| 范例:網站百科| 時候:2012-10-23

PHP-CGI 過程 CPU 100% 與 file_get_contents 函數的干系

偶然候,運轉 Nginx、PHP-CGI(php-fpm) Web辦事的 Linux 辦事器,俄然體系負載回升,利用 top 號令檢查,良多 php-cgi 過程 CPU 利用率靠近100%。厥后,我經由過程跟蹤發明,這類環境的呈現,跟 PHP 的 file_get_contents() 函數有著緊密親密的干系。(北京網站扶植)

  大、中型網站中,基于 HTTP 和談的 API 接口挪用,是屢見不鮮。PHP 法式員們喜好利用簡略便利的 file_get_contents("http://example.com/") 函數,來獲得一個 URL 的前往內容,可是,若是 http://example.com/ 這個網站呼應遲緩,file_get_contents() 就會一向卡在那邊,不會超時。

  咱們曉得,在 php.ini 中,有一個參數 max_execution_time 能夠或許設置 PHP 劇本的最大履行時候,可是,在 php-cgi(php-fpm) 中,該參數不會起效。真正能夠或許節制 PHP 劇本最大履行時候的是 php-fpm.conf 設置裝備擺設文件中的以下參數:

  1. The timeout (in seconds) for serving a single request after which the worker process will be terminated    
  2. Should be used when 'max_execution_time' ini option does not stop script execution for some reason    
  3. '0s' means 'off'    
  4. <value name="request_terminate_timeout">0s</value>   

  默許值為 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/") 的習氣,而是略微點竄一下,加個超不時候,用以下體例來完成 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 100% 的緣由不只要這一種,那末,怎樣肯定是 file_get_contents() 函數致使的呢?

  起首,利用 top 號令檢查 CPU 利用率較高的 php-cgi 過程。

  1. top - 10:34:18 up 724 days, 21:01,  3 users,  load average: 17.86, 11.16, 7.69 
  2. Tasks: 561 total,  15 running, 546 sleeping,   0 stopped,   0 zombie 
  3. 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 
  4. Mem:   8100996k total,  4320108k used,  3780888k free,   772572k buffers 
  5. Swap:  8193108k total,    50776k used,  8142332k free,   412088k cached 
  6.   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                            
  7. 10747 www       18   0  360m  22m  12m R 100.6 0.3    0:02.60 php-cgi                                                            
  8. 10709 www       16   0  359m  28m  17m R 96.8  0.4    0:11.34 php-cgi                                                            
  9. 10745 www       18   0  360m  24m  14m R 94.8  0.3    0:39.51 php-cgi                                                            
  10. 10707 www       18   0  360m  25m  14m S 77.4  0.3    0:33.48 php-cgi                                                            
  11. 10782 www       20   0  360m  26m  15m R 75.5  0.3    0:10.93 php-cgi                                                            
  12. 10708 www       25   0  360m  22m  12m R 69.7  0.3    0:45.16 php-cgi                                                            
  13. 10683 www       25   0  362m  28m  15m R 54.2  0.4    0:32.65 php-cgi                                                            
  14. 10711 www       25   0  360m  25m  15m R 52.2  0.3    0:44.25 php-cgi                                                            
  15. 10688 www       25   0  359m  25m  15m R 38.7  0.3    0:10.44 php-cgi                                                            
  16. 10719 www       25   0  360m  26m  16m R  7.7  0.3    0:40.59 php-cgi 

  找此中一個 CPU 100% 的 php-cgi 過程的 PID,用以下號令跟蹤一下:

  1. strace -p 10747 

  若是屏幕顯現:

  1. select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0}) 
  2. poll([{fd=6events=POLLIN}], 1, 0)     = 0 (Timeout) 
  3. select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0}) 
  4. poll([{fd=6events=POLLIN}], 1, 0)     = 0 (Timeout) 
  5. select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0}) 
  6. poll([{fd=6events=POLLIN}], 1, 0)     = 0 (Timeout) 
  7. select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0}) 
  8. poll([{fd=6events=POLLIN}], 1, 0)     = 0 (Timeout) 
  9. select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0}) 
  10. poll([{fd=6events=POLLIN}], 1, 0)     = 0 (Timeout) 
  11. select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0}) 
  12. poll([{fd=6events=POLLIN}], 1, 0)     = 0 (Timeout) 
  13. select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0}) 
  14. poll([{fd=6events=POLLIN}], 1, 0)     = 0 (Timeout) 
  15. select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0}) 
  16. poll([{fd=6events=POLLIN}], 1, 0)     = 0 (Timeout) 
  17. select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0}) 
  18. poll([{fd=6events=POLLIN}], 1, 0)     = 0 (Timeout) 
  19. select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0}) 
  20. poll([{fd=6events=POLLIN}], 1, 0)     = 0 (Timeout) 

  那末,就能夠或許肯定是 file_get_contents() 致使的題目了。

來歷申明:本文章系尚品中國編輯首創或采編清算,如需轉載請說明來自尚品中國。以上內容局部(包羅圖片、筆墨)來歷于收集,若有侵權,請實時與本站接洽(010-60255689)。
TAG標簽:

若是您的網站能夠或許增添轉化次數并進步客戶對勁度,該怎樣辦?

預定專業征詢參謀相同!

*尚品專業參謀將盡快與您接洽

免責申明

很是感激您拜候咱們的網站。在您利用本網站之前,請您細心瀏覽本申明的一切條目。

1、本站局部內容來歷自收集,觸及到的局部文章和圖片版權屬于原作者,本站轉載僅供大師進修和交換,切勿用于任何貿易勾當。

2、本站不承當用戶因利用這些資本對本身和別人形成任何情勢的喪失或危險。

3、本申明未觸及的題目參見國度有關法令律例,當本申明與國度法令律例抵觸時,以國度法令律例為準。

4、若是損害了您的正當權利,請您實時與咱們,咱們會在第臨時候刪除相干內容!

接洽體例:010-60255689
電子郵件:394588593@qq.com

此刻就與專業征詢參謀相同!

  • 北京

    010-60259772

  • 天津

    13264060713

信息掩護中請安心填寫
在線征詢

免責申明

很是感激您拜候咱們的網站。在您利用本網站之前,請您細心瀏覽本申明的一切條目。

1、本站局部內容來歷自收集,觸及到的局部文章和圖片版權屬于原作者,本站轉載僅供大師進修和交換,切勿用于任何貿易勾當。

2、本站不承當用戶因利用這些資本對本身和別人形成任何情勢的喪失或危險。

3、本申明未觸及的題目參見國度有關法令律例,當本申明與國度法令律例抵觸時,以國度法令律例為準。

4、若是損害了您的正當權利,請您實時與咱們,咱們會在第臨時候刪除相干內容!

接洽體例:010-60255689
電子郵件:394588593@qq.com