ホームページ >バックエンド開発 >PHPチュートリアル >PHPでExcelファイルを非同期的に生成してサーバーに保存する方法
1. 注文のエクスポート機能は、データ量が多く、業務が複雑であることは誰もがよく知っていると思います。この製品では、1 か月分の約 20,000 個のデータをエクスポートする必要があり、クエリ インターフェイスは Java によって提供される API を呼び出します。
2. このインターフェースを介して 2000 個のデータをクエリするには 30 秒以上かかり、サーバーのタイムアウトは 30 秒であるため、タイムアウトは避けられません。 1000 個ごとに 1w 個のデータが送信されます。curl リクエストには 60 ~ 78 秒かかります。curl_multi リクエストには 45.78 ~ 52 秒かかります。
3. 現時点ではビジネス ロジックが完了していないため、返された結果の uid に基づいてユーザーの情報を照会する必要があります。結果を残り、ロジックを処理します。
4. 処理されたデータの結果は、走査後に Excel のセルにまとめられるため、大量のメモリを消費します。
1. クライアントは「エクスポート」アクションを開始し、サービスはクエリ操作を送信し、Excel ファイルを生成してサーバーに保存します。
2. クライアントがアクションを送信した後、結果が顧客にフィードバックされるのを待たずにすぐに戻り、30 分後に再度ダウンロードするように顧客に直接伝えることが最善です。
3. サーバーから直接生成された Excel ファイルをダウンロードします。
クライアントがリクエストを開始してすぐに返すようにし、サーバーにビジネス ロジック、クエリの処理、フィールド アセンブリ、その他のプロセスの実行を要求するにはどうすればよいですか?アドバイスをお願いします、ありがとうございます!
追加点:
もともと cron ジョブを使用したかったのですが、ものが増えてきており、サーバーにあまり余裕がありません。これらは内部で使用されており、効率はあまり高くありません。 。
アプリ上に表示されるものはプロダクトの改良などのスケジュールされたタスクが多いので、多すぎるので現時点ではcronジョブは使いたくないです。さらに、Spring タスクは Java コードで多くのタスクを実行するために使用されます。
1. 注文のエクスポート機能は、データ量が多く、ビジネスが複雑であることは誰もがよく知っていると思います。この製品では、1 か月分の約 20,000 個のデータをエクスポートする必要があり、クエリ インターフェイスは Java によって提供される API を呼び出します。
2. このインターフェイスを介して 2000 個のデータをクエリするには 30 秒以上かかり、サーバーのタイムアウトは 30 秒であるため、タイムアウトは避けられません。 1000 個ごとに 1w 個のデータが送信されます。curl リクエストには 60 ~ 78 秒かかります。curl_multi リクエストには 45.78 ~ 52 秒かかります。
3. 現時点ではビジネス ロジックが完了していないため、返された結果の uid に基づいてユーザーの情報を照会する必要があります。結果を残り、ロジックを処理します。
4. 処理されたデータの結果は、走査後に Excel のセルにまとめられるため、大量のメモリを消費します。
1. クライアントは「エクスポート」アクションを開始し、サービスはクエリ操作を送信し、Excel ファイルを生成してサーバーに保存します。
2. クライアントがアクションを送信した後、結果が顧客にフィードバックされるのを待たずにすぐに戻り、30 分後に再度ダウンロードするように顧客に直接伝えることが最善です。
3. サーバーから直接生成された Excel ファイルをダウンロードします。
クライアントがリクエストを開始してすぐに返すようにし、サーバーにビジネス ロジック、クエリの処理、フィールド アセンブリ、その他のプロセスの実行を要求するにはどうすればよいですか?アドバイスをお願いします、ありがとうございます!
追加点:
もともと cron ジョブを使用したかったのですが、ものが増えてきており、サーバーにあまり余裕がありません。これらは内部で使用されており、効率はあまり高くありません。 。
アプリ上に表示されるものはプロダクトの改良などのスケジュールされたタスクが多いので、多すぎるので現時点ではcronジョブは使いたくないです。さらに、Spring タスクは Java コードで多くのタスクを実行するために使用されます。
2 つのタイプがあり、1 つはスクリプトを使用して実行する方法です。別のオプションは、フロントエンドリクエストを受信した後に直接戻るか、PHP が表示設定スクリプト set_time_limit(0); の実行を継続することです。 . Apache は、ignore_user_abort() を設定できます。
ただし、後者の方法である php-fpm は、php によるリクエストの受信をブロックします。これにより、通常のユーザーが Web サイトにアクセスできなくなる可能性があります。これは、この方法がランダムに割り当てられ、nginx がその長期プロセスに接続されている場合、Web サイトにアクセスできなくなる可能性があります。ブロックされます。PHPスクリプトを使用して実行することをお勧めします。キューを使用することも、シェルを使用してPHPスクリプトを呼び出して実行することもできます
キューを通じてエクスポートできます
あなたのニーズを満たすことができます、下の写真は私のエクスポートです
または、より単純なものを選択し、Linux を使用してタスクの実行をスケジュールすることもできます
フロント デスクでエクスポート リクエストを送信します。エクスポート リクエストをデータベース タスク テーブルに追加し、エクスポートが実行されているという情報をクライアントに返します。その後、Linux のスケジュールされたタスクがタスク テーブルをクエリして新しいタスクを見つけてエクスポートします。エクスポートが完了したら、現在のタスクが変更されます。これは特に複雑ではありません。
学生の皆さん、cron ジョブについて聞いたことがありますか?
非同期処理にはgearman、rabbitmqなどの分散タスクキュー
を使用できます
本質的に非同期である Nodejs 実装を使用してみてはいかがでしょうか?