全國服務熱線:
0791-88196636

PHP-CGI 進程CPU100%與file_get_contents函數的關系

 二維碼 16879
發表時間:2020-12-15 10:57作者:南昌莫非網絡科技公司來源:南昌莫非網絡科技公司網址:http://admin0531.cn

PHP-CGI 進程CPU100%與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://admin0531.cn/") 函數,來獲取一個 URL 的返回內容,但是,如果 admin0531.cn/ 這個網站響應緩慢,file_get_contents() 就會一直卡在那兒,不會超時。

我們知道,在 php.ini 中,有一個參數 max_execution_time 可以設置 PHP 腳本的**執行時間,但是,在 php-cgi(php-fpm) 中,該參數不會起效。真正能夠控制 PHP 腳本**執行時間的是 php-fpm.conf 配置文件中的以下參數:

The timeout (in seconds) for serving a single request after which the worker process will be terminated   

Should be used when 'max_execution_time' ini option does not stop script execution for some reason   

'0s' means 'off'   

<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://admin0531.cn/") 的習慣,而是稍微修改一下,加個超時時間,用以下方式來實現 HTTP GET 請求。要是覺得麻煩,可以自行將以下代碼封裝成一個函數。

<?php   

$ctx = stream_context_create(array(   

   'http' => array(   

       'timeout' => 1 //設置一個超時時間,單位為秒   

       )   

   )   

);   

file_get_contents("http://admin0531.cn/", 0, $ctx);   

?>   

當然,導致 php-cgi 進程 CPU 100% 的原因不只有這一種,那么,怎么確定是 file_get_contents() 函數導致的呢?

首先,使用 top 命令查看 CPU 使用率較高的 php-cgi 進程。

top - 10:34:18 up 724 days, 21:01,   3 users,   load average: 17.86, 11.16, 7.69

Tasks: 561 total,   15 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       18   0   360m   22m   12m R 100.6 0.3    0:02.60 php-cgi                                                           

10709 www       16   0   359m   28m   17m R 96.8   0.4    0:11.34 php-cgi                                                           

10745 www       18   0   360m   24m   14m R 94.8   0.3    0:39.51 php-cgi                                                           

10707 www       18   0   360m   25m   14m S 77.4   0.3    0:33.48 php-cgi                                                           

10782 www       20   0   360m   26m   15m R 75.5   0.3    0:10.93 php-cgi                                                           

10708 www       25   0   360m   22m   12m R 69.7   0.3    0:45.16 php-cgi                                                           

10683 www       25   0   362m   28m   15m R 54.2   0.4    0:32.65 php-cgi                                                           

10711 www       25   0   360m   25m   15m R 52.2   0.3    0:44.25 php-cgi                                                           

10688 www       25   0   359m   25m   15m R 38.7   0.3    0:10.44 php-cgi                                                           

10719 www       25   0   360m   26m   16m R   7.7   0.3    0:40.59 php-cgi

找其中一個 CPU 100% 的 php-cgi 進程的 PID,用以下命令跟蹤一下:

strace -p 10747

如果屏幕顯示:

select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})

poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)

select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})

poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)

select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})

poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)

select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})

poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)

select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})

poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)

select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})

poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)

select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})

poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)

select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})

poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)

select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})

poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)

select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})

poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)

那么,就可以確定是 file_get_contents() 導致的問題了。


企業新聞
關于南昌莫非網絡科技公司2022年元旦放假安排通知.元旦:1月1日(星期六)至1月3號(星期一)放假,共計三天(無調休),1月4日(星期二)上班。
關于南昌莫非網絡科技公司2021年國慶節放假安排通知。根據《國務院辦公廳關于2021年部分節假日安排的通知》(國辦發明電〔2020〕27號),結合我單位工作實際情況,現就2021年國慶放假的有關事項安排如下。
南昌莫非網絡科技公司2021年中秋節放假通知.一、假期從:2021年09月19日到2021年09月21日結束,假期共3天(9月18日正常上班,9月26日正常休息)。二、如有緊急情況,請各位同仁及時配合相關部門主管人員把事情處理妥善。做好防火、防盜工作并督促各部門關好辦公區域的門、窗等。
根據《國務院辦公廳關于2021年部分節假日安排的通知》(國辦發明電〔2020〕27號),結合我單位工作實際情況,現就2021年端午節放假的有關事項安排如下:一、放假時間:2021年6月12日(星期六)至2021年6月14日(星期一),共放假3天。
南昌莫非網絡科技公司2021年五一勞動節放假通知.現就2021年五一勞動節放假的有關事項安排如下:一、放假時間,2021年5月1日(星期六)至2020年5月5日(星期三),共放假5天。4月25日(星期日)上班,5月6日(星期四)正常上班。
南昌莫非網絡科技公司2021年清明節放假通知.2021年4月3日(星期六)-2021年4月5日(星期一)放假,共3天。4月6日(星期二)正常上班。放假期間,各項業務照常運行,售后問題您可以直接相關負責人提交服務單,技術人員將在12小時之內處理。
關于南昌莫非網絡科技公司2021年春節放假安排通知.一、春節放假時間:2021年2月5日(農歷臘月二十四)至2021年2月18日(農歷正月初七)放假,共13天,2月19日(星期五)開始上班,2月21日星期日(農歷正月初十)恢復正常上班。由于疫情,假期時間可能會有所變化,具體以通知為準。
關于南昌莫非網絡科技公司2021年01月01日元旦放假通知。一、放假時間:2021年1月1日(星期五)至2021年1月3日(星期日)放假,共3天;2021年1月4日(星期一)正常上班。公司放假期間如有相關業務及服務事宜敬請撥打我司24小時服務熱線:0791-8819-6636或咨詢客服QQ:2401077293,可隨時與我司進行聯系。
南昌莫非網絡科技公司2020年中秋節+國慶節放假通知。根據《國務院辦公廳關于2020年部分節假日安排的通知》,為了讓大家度過一個充實、平安的假期,現把2020年中秋國慶放假時間及溫馨提示通知如下!
南昌莫非網絡科技公司2020年五一放假通知.在過去的歲月里,南昌莫非網絡科技公司與新老客戶一直保持著愉快的合作,這離不開大家的鼎立支持和幫助。在未來的日子里還需要更多朋友們的支持與幫助,希望你們能始終如一的支持南昌莫非網絡科技,并提出您寶貴的意見及建議。
南昌莫非網絡科技公司2020年春節寒假放假安排通知。南昌莫非網絡科技公司提前祝全國合作伙伴新春快樂、闔家幸福!預祝全體員工春節快樂!
南昌莫非網絡科技公司2020年元旦節放假安排通知.元旦將至,南昌莫非網絡科技公司預祝全體員工元旦快樂!現將2020年元旦節放假安排通告如下:一、放假時間:2020年1月1日,共1天。
網站建設行業方案
網站維護知識
網站制作常見問題
SEO網站優化教程
踏上云端,轉型升級融入互聯網時代,現在就聯系我們吧!
——      我們時刻為你提供更多優質互聯網技術服務      ——
姓名:
*
聯系方式:
*
咨詢項目:
內容:
*
在線留言
關于我們:南昌莫非文化傳媒有限公司(簡稱:莫非傳媒)專注于網站建設,網站SEO優化,小程序制作。提供全方位用戶體驗規劃,品牌形象設計服務。為每一位企業客戶的成長、騰飛助力!        網站建設、網站設計、網站制作、網站開發,就選網站建設公司-南昌莫非傳媒!
掃一掃微信便捷交流
|
|
|
|
|
|
|
|
|
|
|
|
|
地址:江西省南昌市西湖區洪城路6號國貿廣場A座巨豪峰
業務咨詢  :  
272482065
售后服務 :
2401077293
服務熱線:
0791-88196636
______________________________________________________________________________________________________________________________________________________________________________________________________