web-dev-qa-db-ja.com

PHPのスレッド?

私はzendを使用してWebアプリケーションを作成しています。ここでは、ユーザーAが複数のユーザーにメールを送信できるインターフェースを作成しています。これは優れた動作をしますが、ユーザーAが待機する時間が長すぎるため、実行時間が遅くなります「確認応答」(メールの送信後に表示されます。)

Javaには、そのタスクを実行(メールを送信)できる「スレッド」があり、残りのアプリケーションの速度を低下させません。

Javaのように、PHP/Zendでテクニックを使用して、タスクの分割を行うことができます。たとえば、電子メールの送信など、かなりの時間がかかる可能性があります。

29
PHP Ferrari

編集(@Efazatiに感謝、この方向に新しい開発があるようです)

http://php.net/manual/en/book.pthreads.php
注意:(下部の ここ から):

pthreadsは、非常に良い結果をもたらす実験でした。その制限や機能はいつでも変更される可能性があります。 [...]

/編集

PHPにはスレッドはありません。

回避策は、ジョブをキューに保存し(たとえば、電子メールを含むテーブルの行)、cronjobに指定された間隔でphpスクリプトを呼び出します( 2分と言います)、ジョブをポーリングします。ジョブが存在する場合、いくつかを取得し(phpのインストールタイムアウトに応じて)、メールを送信します。

実行を延期する主なアイデア:

  • メインスクリプトはジョブをキューに追加します
  • cronスクリプトはそれらを小さなスライスで送信します

落とし穴:

  • キューから削除せずにメールを送信しないようにしてください(最悪のケースは、ユーザーが2分間隔でスパムを受信した場合です...)
  • 最初に実行せずにジョブを削除しないようにしてください...
  • スコアアルゴリズムを使用してバウンスメールを処理する
41
clyfe

fork のように、複数のプロセスを使用することを検討できます。それらの間の通信はスレッドの場合ほど単純ではありません(しかし、その場合、すべての落とし穴が付属するわけではありません)が、電子メールを送信するだけの場合は、あまり通信する必要はないかもしれません。すべて。

5
Doug Kavendek

Apacheプロセスでフォークを行うことに注意してください。予期しない動作が発生する可能性があります。なんらかの非同期実行を行う場合は、なんらかのキューイングメカニズムを使用する必要があります。 Gearmanは1つです。 Zend Serverのジョブキューもその1つです。 キューに入れますか?Zend Serverジョブキューの概要 にデモコードがあります。 cronを使用できますが、cronスケジューラーに依存してタスクを実行するという問題がありますが、非同期コンピューティングはすぐに実行する必要があることがよくあります。キューシステムを使用すると、スレッド化せずにそれを行うことができます。

3
Kevin Schroeder

https://github.com/krakjoe/pthreads で有望に見えるPThreadsに基づいて開発されているスレッディング拡張機能があります

3
JasonDavis

pcntl があり、サブプロセスを作成できますが、phpはこの種のアーキテクチャではうまく機能しません。おそらく、実行時間の長いスクリプト(デーモン)を作成し、それらを複数生成するほうがよいでしょう。

1
troelskn

PHPには、スレッドの一部が言語の一部として含まれていません。スレッドをエミュレートできるいくつかのメソッドがありますが、それらは確実ではありません。

このGoogle検索 は、いくつかの潜在的な回避策を示しています

0
Neil Aitken

PHPの時点ではスレッドはありません。ただし、phpの場合は、このラウンドアバウトの方法を見ることができます http://www.alternateinterior.com/2007/05/ multi-threading-strategies-in-php.html

0
manugupt1

メールの送信にキューシステムを使用し、スレッドをサポートする別のシステムからメールを送信することができます。 PHPは単なるツールであり、ジョブに最適なツールを使用する必要があります。

0
Elzo Valugi