2017-02-07 11 views
2

私はこれに対する答えを見つけることができません。おそらく私は正しい言葉で検索していません。PHPスクリプトが失敗したときにサーバが応答しないようにする方法

PHPスクリプトが失敗すると(スクリプト、無限ループ、無限SQL呼び出しなどのエラー)、サーバー全体が「ビジー」になります。それはすべてのリソースが取られ、そのスクリプトを実行しようとすることに焦点を当てるようなものです。 apache/nginxを再起動すると、サーバーは正常に戻ります。

これをどのように回避できますか?スクリプトのタイムアウトを設定してもそれを解決することはできません。なぜなら、タイムアウトが10秒であっても、サーバーは誰に対しても10秒間応答しないからです。

これを回避する方法はありますか?はい、スクリプトの問題を解決することで問題はなくなりますが、サーバー側でこれを防ぐ方法があると確信しています。

ちょうど今の例が私の頭に浮かびます。このスクリプトは、そのWebサイトでサービスを呼び出すことによって国コードを取得するために使用されていました。なんらかの理由でウェブサイトは私たちに無作為には提供されないので、スクリプトはファイルの内容を受け取るために永遠に待つでしょう。それはだ場合でも10秒は、サーバーが皆にそれらの10秒間irresponsiveなりタイムアウトので、スクリプトのタイムアウトを設定

$getcountry = file_get_contents('http://ip-api.com/php/'. getUserIP()); 

おかげ

答えて

3

は、それを解決することはできません。

サーバーが正しく設定されていない場合。 PHPタイムアウトを設定することは、暴走スクリプトを処理する正しい方法です(問題の実際の原因を修正することは別として)。致命的なスクリプトエラーはすぐに終了し、サーバーリソースを占有しません。

あなたの投稿は、いつでも実行しているPHPスクリプトのインスタンスが1つしかないと思われるようです。これは当てはまりません。 PHPが処理するWeb要求ごとに、Webサーバーは新しいプロセスまたはスレッドを設定された制限まで開始する必要があります。または、PHP-FPMを使用している場合は、PHPプロセスのプールに渡されます。いずれの場合も、1回のリクエストで全サーバーをロックする必要はありません。

コードやサーバーに深刻な問題がある場合は、すべてのリクエストが長時間かかる可能性があります。唯一の解決策は、問題の根本を修正し、フェールセーフとして妥当なタイムアウトを維持することです。

Apacheの場合、チェックする設定の一部は、ServerLimitStartServersMaxClientsです。 PHP-FPMの場合は、max_childrenの設定で始まります。

このスクリプトは、そのWebサイトでサービスを呼び出すことによって国コードを取得するために使用されました。なんらかの理由でウェブサイトは私たちに無作為には提供されないので、スクリプトはファイルの内容を受け取るために永遠に待つでしょう。

これは非常に一般的な問題であり、コードで説明する必要があります。サードパーティのサービスが速やかに返品されるとは決して信じられません。明らかに、このようなリクエストをバックグラウンドプロセスにロードするのが最適です(例えば、cron)。しかし、通常のページ要求の一部として実行する必要がある場合は、常に適切なタイムアウトを設定する必要があります。 file_get_contentsを使用してのあなたの具体的な例では、ソケットのタイムアウトを減らす:

ini_set('default_socket_timeout', 10); // 10 seconds 
+0

おかげで、非常に明確に説明し、あなたは私に向上させるために非常に良いのポインタを与えています。 –