[北京網(wǎng)站制作]PHP-CGI 進程 CPU 100% 與 file_get_contents 函數(shù)的關(guān)系
PHP-CGI 進程 CPU 100% 與 file_get_contents 函數(shù)的關(guān)系
大、中型網(wǎng)站中,基于 HTTP 協(xié)議的 API 接口調(diào)用,是家常便飯。PHP 程序員們喜歡使用簡單便捷的 file_get_contents("http://example.com/") 函數(shù),來獲取一個 URL 的返回內(nèi)容,但是,如果 http://example.com/ 這個網(wǎng)站響應(yīng)緩慢,file_get_contents() 就會一直卡在那兒,不會超時。
我們知道,在 php.ini 中,有一個參數(shù) max_execution_time 可以設(shè)置 PHP 腳本的最大執(zhí)行時間,但是,在 php-cgi(php-fpm) 中,該參數(shù)不會起效。真正能夠控制 PHP 腳本最大執(zhí)行時間的是 php-fpm.conf 配置文件中的以下參數(shù):
- 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>
默認(rèn)值為 0 秒,也就是說,PHP 腳本會一直執(zhí)行下去。這樣,當(dāng)所有的 php-cgi 進程都卡在 file_get_contents() 函數(shù)時,這臺 Nginx+PHP 的 WebServer 已經(jīng)無法再處理新的 PHP 請求了,Nginx 將給用戶返回“502 Bad Gateway”。修改該參數(shù),設(shè)置一個 PHP 腳本最大執(zhí)行時間是必要的,但是,治標(biāo)不治本。例如改成 30s,如果發(fā)生 file_get_contents() 獲取網(wǎng)頁內(nèi)容較慢的情況,這就意味著 150 個 php-cgi 進程,每秒鐘只能處理 5 個請求,WebServer 同樣很難避免“502 Bad Gateway”。
要做到徹底解決,只能讓 PHP 程序員們改掉直接使用 file_get_contents("http://example.com/") 的習(xí)慣,而是稍微修改一下,加個超時時間,用以下方式來實現(xiàn) HTTP GET 請求。要是覺得麻煩,可以自行將以下代碼封裝成一個函數(shù)。
- <?php
- $ctx = stream_context_create(array(
- 'http' => array(
- 'timeout' => 1 //設(shè)置一個超時時間,單位為秒
- )
- )
- );
- file_get_contents("http://example.com/", 0, $ctx);
- ?>
當(dāng)然,導(dǎo)致 php-cgi 進程 CPU 100% 的原因不只有這一種,那么,怎么確定是 file_get_contents() 函數(shù)導(dǎo)致的呢?
首先,使用 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() 導(dǎo)致的問題了。
建站流程
-
網(wǎng)站需求
-
網(wǎng)站策劃方案
-
頁面設(shè)計風(fēng)格
-
確認(rèn)交付使用
-
資料錄入優(yōu)化
-
程序設(shè)計開發(fā)
-
后續(xù)跟蹤服務(wù)
-
聯(lián)系電話
010-60259772
熱門標(biāo)簽
- 網(wǎng)站建設(shè)
- 食品網(wǎng)站建設(shè)
- 微信小程序開發(fā)
- 小程序開發(fā)
- 無錫網(wǎng)站建設(shè)
- 研究所網(wǎng)站建設(shè)
- 沈陽網(wǎng)站建設(shè)
- 廊坊網(wǎng)站建設(shè)
- 鄭州網(wǎng)站建設(shè)
- 婚紗攝影網(wǎng)站建設(shè)
- 手機端網(wǎng)站建設(shè)
- 高校網(wǎng)站制作
- 天津網(wǎng)站建設(shè)
- 教育網(wǎng)站建設(shè)
- 品牌網(wǎng)站建設(shè)
- 政府網(wǎng)站建設(shè)
- 北京網(wǎng)站建設(shè)
- 網(wǎng)站設(shè)計
- 網(wǎng)站制作
最新文章
推薦新聞
更多行業(yè)-
網(wǎng)站關(guān)鍵字排名下降和解決方法
網(wǎng)站關(guān)鍵字排名下降和解決方法關(guān)鍵字"北京網(wǎng)站建設(shè)"...
2012-01-25 -
百度算法更新 要告訴我們下一步如何走
網(wǎng)站制作公司尚品中國(m.xmjiujiu.cn):對于百度搜索...
2012-05-18 -
新手須要知道網(wǎng)站建設(shè)流程和步驟
現(xiàn)在網(wǎng)站建設(shè)已經(jīng)成為很普遍的一項工作了,而且現(xiàn)在市場上的建站公司也有很...
2019-07-29 -
網(wǎng)站建設(shè)的發(fā)展現(xiàn)狀和趨勢
現(xiàn)在互聯(lián)網(wǎng)上有超過一半以上的中小企業(yè)網(wǎng)站依然是擺設(shè),一方面因為企業(yè)對于...
2020-04-03 -
網(wǎng)站營銷策劃是網(wǎng)上線前須做好的一件事
網(wǎng)絡(luò)非常發(fā)達(dá)的今天,網(wǎng)上創(chuàng)業(yè)已經(jīng)是一個大的趨勢,現(xiàn)在的網(wǎng)站、商城等多如...
2013-03-29 -
網(wǎng)站設(shè)計中的網(wǎng)站色系運用有哪些?
在網(wǎng)站設(shè)計中,網(wǎng)站的色系是直接刺激用戶的的視覺觀感。因此,網(wǎng)站的色系更...
2018-08-20
預(yù)約專業(yè)咨詢顧問溝通!
免責(zé)聲明
非常感謝您訪問我們的網(wǎng)站。在您使用本網(wǎng)站之前,請您仔細(xì)閱讀本聲明的所有條款。
1、本站部分內(nèi)容來源自網(wǎng)絡(luò),涉及到的部分文章和圖片版權(quán)屬于原作者,本站轉(zhuǎn)載僅供大家學(xué)習(xí)和交流,切勿用于任何商業(yè)活動。
2、本站不承擔(dān)用戶因使用這些資源對自己和他人造成任何形式的損失或傷害。
3、本聲明未涉及的問題參見國家有關(guān)法律法規(guī),當(dāng)本聲明與國家法律法規(guī)沖突時,以國家法律法規(guī)為準(zhǔn)。
4、如果侵害了您的合法權(quán)益,請您及時與我們,我們會在第一時間刪除相關(guān)內(nèi)容!
聯(lián)系方式:010-60259772
電子郵件:394588593@qq.com