ホームページ >バックエンド開発 >PHPチュートリアル >PHPでExcelファイルを非同期的に生成してサーバーに保存する方法

PHPでExcelファイルを非同期的に生成してサーバーに保存する方法

WBOY
WBOYオリジナル
2016-08-04 09:22:253201ブラウズ

まず私の現在のニーズと困難について話させてください:

  • 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スクリプトを呼び出して実行することもできます

キューを通じてエクスポートできます
あなたのニーズを満たすことができます、下の写真は私のエクスポートですPHPでExcelファイルを非同期的に生成してサーバーに保存する方法

または、より単純なものを選択し、Linux を使用してタスクの実行をスケジュールすることもできます

フロント デスクでエクスポート リクエストを送信します。エクスポート リクエストをデータベース タスク テーブルに追加し、エクスポートが実行されているという情報をクライアントに返します。その後、Linux のスケジュールされたタスクがタスク テーブルをクエリして新しいタスクを見つけてエクスポートします。エクスポートが完了したら、現在のタスクが変更されます。これは特に複雑ではありません。

学生の皆さん、cron ジョブについて聞いたことがありますか?

非同期処理にはgearman、rabbitmqなどの分散タスクキュー

を使用できます

本質的に非同期である Nodejs 実装を使用してみてはいかがでしょうか?

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。