[北京網站制作]PHP-CGI 進程 CPU 100% 與 file_get_contents 函數的關系
PHP-CGI 進程 CPU 100% 與 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 配置文件中的以下參數:
- 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://example.com/") 的習慣,而是稍微修改一下,加個超時時間,用以下方式來實現 HTTP GET 請求。要是覺得麻煩,可以自行將以下代碼封裝成一個函數。
- <?php
- $ctx = stream_context_create(array(
- 'http' => array(
- 'timeout' => 1 //設置一個超時時間,單位為秒
- )
- )
- );
- file_get_contents("http://example.com/", 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() 導致的問題了。
推薦新聞
更多行業-
綜合規劃與提升:打造企業網站建設方案的優化策略
對于企業網站建設方案,我會為您提供一個綜合的計劃,涵蓋網站首頁規劃、內...
2024-01-12 -
建設網站如何找一家靠譜的網建公司
對于沒有專業網絡部門的企業,企業網站一般選擇與專業的第三方網站建設公司...
2020-05-20 -
seo未來發展的前景
優劣還真的很難區分,搜索引擎的職責就是反饋最好的資訊給用戶,因此,認為...
2012-06-19 -
網站的主頁設計
主頁是網站制作的第一步。網頁設計作為一種視覺語言,要講究編排和布局,應...
2015-01-09 -
中國網站建設應該怎么做?
想做好的企業網站就要找團隊制作了,做好網站定位,讓設計師做好版面,再讓...
2018-10-15 -
網站建設公司可以提供哪些服務?
網站建設公司大家并不算陌生,但是具體關于網站建設公司可以提供哪些服務亦...
2022-09-07
預約專業咨詢顧問溝通!
免責聲明
非常感謝您訪問我們的網站。在您使用本網站之前,請您仔細閱讀本聲明的所有條款。
1、本站部分內容來源自網絡,涉及到的部分文章和圖片版權屬于原作者,本站轉載僅供大家學習和交流,切勿用于任何商業活動。
2、本站不承擔用戶因使用這些資源對自己和他人造成任何形式的損失或傷害。
3、本聲明未涉及的問題參見國家有關法律法規,當本聲明與國家法律法規沖突時,以國家法律法規為準。
4、如果侵害了您的合法權益,請您及時與我們,我們會在第一時間刪除相關內容!
聯系方式:010-60259772
電子郵件:394588593@qq.com