ホームページ  >  記事  >  バックエンド開発  >  スレッドプール - PHP を使用してメールを送信し、送信結果を記録したいのですが、現在、スクリプトを使用して送信と記録の操作を実行しています。何か良い方法はありますか?

スレッドプール - PHP を使用してメールを送信し、送信結果を記録したいのですが、現在、スクリプトを使用して送信と記録の操作を実行しています。何か良い方法はありますか?

WBOY
WBOYオリジナル
2016-09-27 14:18:11958ブラウズ

現在、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を使用してバックグラウンドメールサービスを実行する

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