ホームページ > バックエンド開発 > PHPチュートリアル > PHP-CGI処理CPU100%とfile_get_contents関数の関係解析_PHPチュートリアル

PHP-CGI処理CPU100%とfile_get_contents関数の関係解析_PHPチュートリアル

WBOY
リリース: 2016-07-21 15:25:10
オリジナル
755 人が閲覧しました

その後、追跡を通じて、この種の状況の発生は PHP の file_get_contents() 関数と密接に関係していることがわかりました。
大規模および中規模の Web サイトでは、HTTP プロトコルに基づく API インターフェイス呼び出しが一般的です。 PHP プログラマーは、URL の返されたコンテンツを取得するために、シンプルで便利な file_get_contents("http://example.com/") 関数を使用することを好みますが、Web サイト http://example.com/ の応答が遅い場合は、file_get_contents(. " ) は常にそこでスタックし、タイムアウトしません。
php.iniにはPHPスクリプトの最大実行時間を設定できるパラメータmax_execution_timeがあることはわかっていますが、php-cgi(php-fpm)ではこのパラメータは有効になりません。 PHP スクリプトの最大実行時間を実際に制御できるのは、php-fpm.conf 構成ファイル内の次のパラメーターです: ワーカー プロセスが終了するまでの 1 つのリクエストを処理するためのタイムアウト (秒単位)
次の場合に使用する必要があります。 'max_execution_time' ini オプションは何らかの理由でスクリプトの実行を停止しません
'0s' は 'off' を意味します
0s デフォルト値は 0 秒で、これは PHP がスクリプトは引き続き実行されます。このように、すべての php-cgi プロセスが file_get_contents() 関数でスタックすると、この Nginx+PHP Web サーバーは新しい PHP リクエストを処理できなくなり、Nginx はユーザーに「502 Bad Gateway」を返します。 PHP スクリプトの最大実行時間を設定するにはこのパラメータを変更する必要がありますが、根本的な原因ではなく症状を治療するだけです。たとえば、これを 30 秒に変更すると、file_get_contents() が Web ページのコンテンツを取得するのが遅い場合、これは 150 の php-cgi プロセスが 1 秒あたり 5 つのリクエストしか処理できないことを意味し、Web サーバーが「502 Bad」を回避することも困難になります。ゲートウェイ"。
完全な解決策を達成するには、PHP プログラマに file_get_contents("http://example.com/") を直接使用する習慣をなくしてもらい、わずかに変更してタイムアウトを追加し、次のように実装するだけです。 HTTP GET リクエストの方法。それが面倒な場合は、次のコードを自分で関数にカプセル化することもできます。

コードをコピー コードは次のとおりです:
$ctx = stream_context_create(array(
'http' => array(
'timeout' => 1 //Set a timeout, 単位は秒です
)
)
);
file_get_contents("http://example.com/", 0, $ctx)


もちろん、php-cgi の理由はprocess CPU is 100% is not これしかないので、file_get_contents() 関数が原因であると判断するにはどうすればよいでしょうか
まず、top コマンドを使用して、CPU 使用率が高い php-cgi プロセスを確認します。


コードをコピー コードは次のとおりです:
top - 10:34:18 up 724 days、21:01、3 ユーザー、負荷平均: 17.86、11.16、7.69
タスク: 合計 561、15実行中、546 睡眠、0 停止、0 ゾンビ
Cpu: 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、使用済み 4320108k、空き 3780888k、バッファー 772572k
スワップ: 合計 8193108k、使用済み 50776k、空き 8142332k、キャッシュ済み 412088k
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+マンド
1074 7 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 php-cgi
107 07 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 5.16 php-cgi
106 83 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 0.3 0:10.44 php-cgi
1 0719 www 25 0 360m 26m 16m R 7.7 0.3 0:40.59 php-cgi


CPU が 100% の php-cgi プロセスの 1 つの PID を見つけて、次のコマンドを使用して追跡します:


コードをコピーします コードは次のとおりです:

strace -p 10747
select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15, 0})
poll([{fd= 6, events=POLLIN}], 1, 0) = 0 (タイムアウト)
select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15) , 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (タイムアウト)
select(7, [6], [6], [], {15, 0}) = 1 (出力 [6]、左 {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (タイムアウト)
select(7, [6], [6 ], [], {15, 0}) = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (タイムアウト)
select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN} ], 1, 0) = 0 (タイムアウト)
select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15, 0})
poll ([{fd=6, events=POLLIN}], 1, 0) = 0 (タイムアウト)
select(7, [6], [6], [], {15, 0}) = 1 (out [6 ], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (タイムアウト)
select(7, [6], [6], [], { 15, 0}) = 1 (出力 [6]、左 {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (タイムアウト)
select(7, [ 6], [6], [], {15, 0}) = 1 (出力 [6]、左 {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (タイムアウト)
select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15, 0})
poll([{fd=6 , events=POLLIN}], 1, 0) = 0 (タイムアウト)

那么、それが file_get_contents() の結果であることを確認できます。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/324141.html技術記事その後、このような状況が判明し、PHP の file_get_contents() 関数には密接な関係があることがわかりました。
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート