File_get_contents 関数はタイムアウト設定を追加します

巴扎黑
リリース: 2016-11-24 13:56:15
オリジナル
1391 人が閲覧しました

実際の PHP 開発では、リモート ページから返されるコンテンツを取得するために file_get_contents 関数を使用することがよくありますが、リモートの応答時間が非常に遅い場合、file_get_contents() は常にそこでスタックし、タイムアウトしません。 Web サービスの Linux サーバーのシステム負荷が突然増加することがあります。top コマンドを使用して、多くの php-cgi プロセスの CPU 使用率が 100% に近いことを確認します。

php.ini には、PHP スクリプトの最大実行時間を設定できるパラメータ max_execution_time があることはわかっていますが、php-cgi (php-fpm) では、このパラメータは有効になりません。 PHP スクリプトの最大実行時間を実際に制御できるのは、php-fpm.conf 設定ファイル内の次のパラメータです:

C コード

ワーカー プロセスが終了するまでの単一リクエストの処理のタイムアウト (秒単位)

「max_execution_time」ini オプションが何らかの理由でスクリプトの実行を停止しない場合に使用する必要があります

「0s」は「オフ」を意味します

0s

デフォルト値は 0 秒です。つまり、PHP スクリプトは実行を続けます。このように、すべての php-cgi プロセスが file_get_contents() 関数でスタックすると、この Web サーバーは新しい PHP リクエストを処理できなくなります。ただし、このパラメータを変更して PHP スクリプトの最大実行時間を設定する必要があります。症状を治療するだけで、根本的な原因は治療しません。たとえば、30s に変更された場合、file_get_contents() が Web コンテンツの取得に遅い場合、これは 150 php-cgi プロセスが 1 秒あたり 5 ファイルしか処理できないことを意味します。 .リクエストの場合、Webサーバーでも「502 Bad Gateway」を回避するのは困難です。

完全な解決策を達成するには、PHP プログラマーが file_get_contents("http://example.com/") を直接使用する習慣を変更できるようにするだけですが、それをわずかに変更し、タイムアウトを追加し、次のメソッドを使用して HTTP を実装します。 GET リクエスト。それが面倒な場合は、次のコードを自分で関数にカプセル化することもできます。

りー


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