CSV ファイルをアップロードし、アップロードが成功した場合にサーバーをすぐに応答させることができます。サーバーは CSV をキューに保持し、スケジューラーにキューからファイルをプルさせ、別のプロセスですべての操作を実行させることができます。クライアントは定期的に ajax リクエストを送信して、サーバーが一括操作を完了したかどうかを確認します。完了すると、サーバーは ajax 呼び出しに応答して、CSV 内のすべての項目に対するすべての操作の概要とエラーを返します。アイテムをバッチ処理するという全体の目的を無効にする CSV のアイテムごとに ajax 呼び出しを送信しません。
Linux で実行していますか? その場合の例は、cronを使用してバッチ処理 php スクリプトを毎分実行することです。たとえば、crontabファイルで:
* * * * * php /path/batch_processor.php
ファイルのキューは、アップロード時間、処理の開始と終了などを記録する DB テーブルに格納でき、php スクリプトは最初の未処理のファイルを取得して処理を開始します。
または、スケジューラを使用する代わりに、execを使用して CSV ファイルをアップロードするときに、バックグラウンド プロセスをすぐに開始することもできます。PHP のマニュアルには次のように書かれています。
プログラムがこの関数で開始された場合、バックグラウンドで実行を継続するには、プログラムの出力をファイルまたは別の出力ストリームにリダイレクトする必要があります。そうしないと、プログラムの実行が終了するまで PHP がハングアップします。
したがって、アップロード ハンドラでそのようなものを使用できます。
exec("nohup php /path/batch_processor.php 1 > batch_output.txt 2 > batch_error.txt &");
スクリプトの出力とエラー1 >
を2 >
リダイレクトします。&
バックグラウンドで実行することを示します。nohup
プロセス所有者のセッションが終了した場合などのハングアップ シグナルを無視します。
Windows を使用している場合は、検索してみると、バックグラウンド プロセスの実行に関する情報がたくさんあります。
バッチ スクリプトが完了すると、db テーブルまたは別の共有リソースで csv ファイルに完了フラグが設定される可能性があるため、ajax 呼び出しを処理して csv バッチのステータスを確認するときに、完了フラグを検索して確認し、終了した場合、クライアントへのバッチ出力。
機能を改善し、バッチが終了したかどうかに関係なく、各 ajax 呼び出しの段階的なステータス更新を行いたい場合、バッチ プロセスは、処理したアイテムごとに共有リソース (db またはファイルなど) に書き込み、ajax ハンドラーは読み取ります。これからクライアントに戻ります。