2016-11-14 7 views
1

ajaxを使用して複数のリクエスト(たとえば100件)を送信しています。 私はこれらの時間のかかるリクエストをサーバー側(PHP)で並列処理することを希望します。 したがって、消費時間要求を実行する前にPHP側でセッションを終了しています。PHP session_write_closeは、ホストサーバー上で同時に並列リクエストを実行しません。

if (session_status() == PHP_SESSION_NONE) { 
    session_start(); 
} 
ob_start(); 
ignore_user_abort(true); 
session_write_close(); 
header("Content-Encoding: none"); 
header("Content-Length: 0"); 
header("Connection: close"); 
ob_end_flush(); 
flush(); 
// time consuming request 
... 

これは、ローカルホストで完璧に動作しますが、私は、セッションを閉じていなかったかのようにサーバーをホスティングする上では動作します私はちょうど同じ時間で働いて6つの要求を持っています。 localhostとホスティングサーバーの間のこのような動作の違いを説明することができますか?どのように私はこれらの要求をホスティングサーバー上で並行して実行させることができますか? ありがとう!

+0

localhostとホスティングサーバーにはどのようなPHPバージョンを使用しますか? –

+0

なぜ並列要求を制御するためにセッションを終了したいのですか? バックグラウンドでプロセスを制御するのにQUEUEサービスを使用しないのはなぜですか? 問題が多くの要求の潜在性である場合は、キューシステムを1つずつ要求を処理するようにし、要求による要求を処理した後、プッシュ通知でユーザーにメッセージを送信するか、セッションを更新します。 –

+0

私はlocalhostでPHP 5.4.3を実行しており、ホスティングサーバーでPHP 5.4.45を使用しています – user2708647

答えて

1

おそらく、サーバにdifferent session handlerが設定されている可能性があります(共有ホスティングプロバイダの場合、重くて高価なディスクI/Oを避けるためにメモリ内セッション記憶域がある可能性があります)。つまり、session_write_closeの動作が常に期待どおりになるとは限りません。

複数のジョブを並行して実行する場合は、キューBeanstalkdなど)を使用し、要求にセッション記憶域を使用しないことをお勧めします。あなたのAJAXスクリプトは、ジョブの詳細をキューにプッシュし、コマンドラインで実行されているワーカースクリプトは、これらのジョブをキューから取り出して処理します。作業員にとっては、Supervisordや定期的なcronジョブを使用することができます。

+0

ありがとうDfKimera。私は共有ホスティングを使用していますが、ホストされているWebサイトでphpinfoをチェックすると、 "session.save_handler property"が "files"に設定されます。私が 'session_write_close'からどのような振る舞いを期待するべきかを知るためにチェックしなければならない設定はありますか? – user2708647

+0

私はちょうど回避策をテストしました:私は私のrequester.phpファイルからクローズセッションコードを削除し、非常に短いタイムアウト( 'curl_setopt($ ch、CURL_OPT_TIMEOUT_MS、10)'でrequester.phpを呼び出すrequester.phpファイルを作成しました。 )。私はrequester.phpの代わりにrequesterProxy.phpに私のAjax呼び出しを行います。私はそれが非常にきれいな解決策であるかどうかはわかりませんが、それは私の100の要求を私のホストサーバーで並行して実行することができます。 – user2708647

関連する問題