ホームページ > php教程 > php手册 > PHP-CGI処理CPU100%とfile_get_contents関数の関係の解析

PHP-CGI処理CPU100%とfile_get_contents関数の関係の解析

WBOY
リリース: 2016-06-13 12:05:59
オリジナル
924 人が閲覧しました

その後、追跡を通じて、この種の状況の発生は 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 設定ファイル内の次のパラメータです: ワーカー プロセスが終了するまでの単一リクエストの処理のタイムアウト (秒単位)
である必要があります。 '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 //タイムアウトを秒単位で設定します
)
)
);
file_get_contents("http:// 例。 com/", 0, $ctx);
?>

もちろん、php-cgi プロセスの CPU が 100% である理由はこれだけではありません。 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
メモリ: 合計 8100996k、使用済み 4320108k、空き 3780888k、バッファー 772572k
スワップ: 合計 8193108k、使用済み 50776k、 332k 無料、412088kキャッシュされた
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 プロセスの 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 (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 (タイムアウト)


なら、file_get_contents() の結果として問題が解決されたことを確認できます。
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート