1

ホストされたプラットフォームに新しいユーザーを追加できる Web ポータルがあります。ユーザー情報を mysql テーブル (pdo) に保存するフォームを介してユーザーを追加すると、実際にはおそらく 3 つまたは 4 つのテーブルが挿入されます。

また、SOAP 要求が外部サイトに送信され、応答が読み取られます。ユーザー オプションによっては、さらに SOAP 要求が送信される場合があります。

また、SMS を送信するために smpp プロバイダーへの接続が確立されます。

そのため、1 人のユーザーを追加するだけで、かなりの実行時間がかかる可能性があります。一括インポート csv オプションを作成し、ファイルをアップロードして、追加する新しいユーザーとして各行を処理したいと考えています。

エラーやタイムアウトなしで 100 人のユーザーをインポートすると、どのように言うのが最良の方法でしょうか?

ここで見られるように、各php foreach値を各jquery ajaxに入れる方法を見て、ユーザーごとのajaxリクエストについて考えていました

しかし、答えた人は、「ただし、値を配列として渡し、ajax 呼び出しを 1 つだけにすることを強くお勧めします」とも述べています。しかし、これはタイムアウトになりやすいのではないでしょうか?

理想的には、一度に 1 つずつ追加して、ユーザーごとに結果を取得するのが最善の方法だと思います。

4

1 に答える 1

2

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 ハンドラーは読み取ります。これからクライアントに戻ります。

于 2013-01-26T10:44:56.743 に答える