2017-11-13 2 views
0

PHPのfile_get_contents関数に問題があります。 - > phpページ(これをa.phpと呼ぶ)から、POSTリクエストはfile_get_contentsを通して別のphpページ(b.php)に送られます。PHPのfile_get_contentsがクラッシュを引き起こす

- > b.php POST入力にいくつかのものを行い、次いで、それ自体(b.php)へのfile_get_contentsを介して別のPOST要求を送信

- >これが数回繰り返される(例えば4回)これは基本的には次のようになります:

a.php - > file_get_contents - > b.php - > b.php - > POSTリクエストfile_get_contents - > b.php - > POSTリクエストfile_get_contents - > b.php - > POSTリクエストからfile_get_contents - > b.php

最後のb.phpへのリクエストで、スクリプトは「ポスター」に何かをエコーし​​ますそれまでのddsのようなものなどすべての方法をa.phpに戻します。

明快にするために:プロダクションでは、これらのすべてのphpファイルは異なるサーバーにあり、各サーバーには追加された価値があります。

しかし、すべてのページは同じサーバーにあります(また、 "?server = x"をURLに追加することで、同じファイルが "call"ごとに異なるデータベースを使用します)。

これは魔法のように動作します:) ... 5つ以上のfile_get_contentsがない限りは、同時に "アクティブ" です... これは正常に動作します: a.php-> b.php-> b.php-> b.php-> b.php これはしません: a.php-> b.php-> b.php-> b.php-> b.php-> b.php 実際には私のサーバをクラッシュさせます(もう何のHTTPリクエストにも応答しません)。そして、Apacheを再起動するだけで "デブロック"します。 ブラウザから「回路」a.php-> b.php-> b.php-> b.php-> b.phpの作業時間を別々に読み込んで同じことが起こります。

Apacheのエラーログにエラー:

failed to open stream: HTTP request failed! 

私はそれがPOSTのサイズが大きすぎることに関連するかもしれないと思ったが、a.php-を通じて巨大なPOSTリクエストを送信> b.php-> b.php-> b.php-> b.php回路が正常に動作します....

だから、何とかのみ5同時のfile_get_contentsが許可されているように...

誰もがいくつかのアイデアを持っているに見えますか?

EDIT:実際の問題はデッドロックだと思われます。デッドロックは同じサーバー上に「ループ」が存在しないため発生しません。代わりにCURLを使用してこの問題を解決しました。タイムアウトデッドロックが発生する危険がある場合、カール要求はサーバをフリーズすることなく単にタイムアウトするだけです。 私はまだこの質問への答えを得ることに興味があります:Apache2で同時リクエストの量を確認/再設定するにはどうしたらいいですか? confファイルafaikにはありません。 ありがとうございます!

+0

追加情報:私は現在、file_get_contentsの代わりにcurlを使用しているかどうか試しています...しかし、もしそれがあったとしても、> 5 file_get_contentsを私のサーバに同時に送信することで誰もが私のサーバをクラッシュさせる可能性があります。 –

+2

Apacheが5つ以上の同時リクエスト(単純なローカル開発サーバーの可能性があります)を処理するように設定されていない場合、記述しているものがデッドロックになります。 – deceze

+0

@deceze Apache2で同時リクエスト数を確認/再設定する方法を教えていただけますか? Thx –

答えて

0

この場合、file_get_contentsの代わりにCURLを使用することをお勧めします。ただし、セッションを閉じるときにプロセスをロックするので、セッションを使用するときはこれを除いて(!)という問題は一度もありませんでした。

+0

私は言いましたが、私が言ったように:追加情報:私は現在、file_get_contentsの代わりにcurlを使用しているかどうか試しています...しかし、もしそうなら、誰も私のサーバーに> 5 file_get_contentsを同時に送信して、どのような解決策も大いに評価されるでしょう!私はセッションを使用していません。 –

関連する問題