現在、PHP スクリプトを使用して外部インターフェイスに電子メールを送信するリクエストを実行し、電子メールが返されるのを待ち、処理結果を取得して、その結果を自分のデータベース レコードに送信しています。 。
1時間で約20,000項目を処理できますが、これは遅すぎます。 。
上司はスレッドプールを使用してそれを行うように言いましたが、今また混乱しています。 。具体的な方法がわかりません。一般的なプロセスを説明できる人はいますか? Thread 拡張機能を使用していますか?
現在、PHP スクリプトを使用して外部インターフェイスに電子メールを送信するリクエストを実行し、電子メールが返されるのを待ち、処理結果を取得して、その結果を自分のデータベース レコードに送信しています。 。
1時間で約20,000項目を処理できますが、これは遅すぎます。 。
上司はスレッドプールを使用してそれを行うように言いましたが、今また混乱しています。 。具体的な方法がわかりません。一般的なプロセスを説明できる人はいますか? Thread 拡張機能を使用していますか?
私もたまたま同じようなことをしたことがあり、アドバイスをいただけます。
2w/h ≈ 5.55 QPS、これは確かに高くありません。
上司の考えに従って、シングルスレッドのスクリプトの実行が遅い場合は、さらにいくつかのスクリプトを使用してください。その場合、必要なのは、pthreads 拡張機能 (マルチスレッド)、または複数のプロセスを直接開いて処理することです (pcntl 拡張機能、または直接 exec を使用することもできます)。
しかし、ニーズから判断すると、処理時間を費やす主なものは外部 IO の待機です。複数のメールを同時に送信すること (multi_curl など)、メールを非同期で送信すること (curl の async など)、または非同期サービス全体 (swoole 拡張機能など) を使用することを検討できます
データテーブルに process_id フィールドを追加します
データベースレコードを挿入するとき、値 mt_rand(1,10) を process_id にランダムに割り当てます
10 個の PHP スクリプトを開きます。
最初のスクリプトは process_id 1: select * from send_email_list where process_id= でレコードを処理します1 および status=0
2 番目のスクリプトは process_id 2 のレコードを処理します: select * from send_email_list where process_id=2 および status=0
このようにして、10 個のプロセスが同時に処理されます。これは最も単純で直接的な方法です。処理速度が直接的に10倍向上します。
マルチスレッド、multi_curl 同時実行、および swoole 非同期はすべて実現可能なソリューションです。ただし、上記の解決策は既存のベースに簡単な変更を加えるだけで済み、主題により適している可能性があります。
nodejsを使用してバックグラウンドメールサービスを実行する