web-dev-qa-db-ja.com

PHP phpでキュー処理を実装する方法

クライアントから(ポスト経由で)送信されたデータをキューに入れて、サーバー上のphpスクリプトが最初にキューが空かどうかを確認します。キューが空でない場合、スクリプトはキュー内のすべてのデータを1つずつ処理します。

23
ASHUTOSH

Zero MQ のようなものを使用できます

Rasmus Lerdorfによる例 を参照してください。

Gearman を使用して負荷を分散することも検討できます。

9

これは enqueue ライブラリで簡単にできることです。まず、AMQP、STOMP、Redis、Amazon SQS、ファイルシステムなど、さまざまな transports から選択できます。

第二に、それは非常に使いやすいです。インストールから始めましょう:

enqueue/simple-clientライブラリと トランスポートの1つ をインストールする必要があります。ファイルシステムを選択すると仮定して、enqueue/fsライブラリをインストールします。要約する:

composer require enqueue/simple-client enqueue/fs 

POSTスクリプトからメッセージを送信する方法を見てみましょう:

<?php
// producer.php

use Enqueue\SimpleClient\SimpleClient;

include __DIR__.'/vendor/autoload.php';

$client = new SimpleClient('file://'); // the queue will store messages in tmp folder

$client->sendEvent('a_topic', 'aMessageData');

消費スクリプト:

<?php
// consumer.php

use Enqueue\SimpleClient\SimpleClient;
use Enqueue\Psr\PsrProcessor;
use Enqueue\Psr\PsrMessage;

include __DIR__.'/vendor/autoload.php';

$client = new SimpleClient('file://');

$client->bind('a_topic', 'a_processor_name', function(PsrMessage $psrMessage) {
   // processing logic here

   return PsrProcessor::ACK;
});

// this call is optional but it worth to mention it.
// it configures a broker, for example it can create queues and excanges on RabbitMQ side. 
$client->setupBroker();

$client->consume();

supervisord またはその他のプロセスマネージャーを使用して、consumer.phpプロセスをいくつでも実行できます。ローカルコンピューターでは、追加のライブラリやパッケージなしで実行できます。

これは基本的な例であり、エンキューには他にも便利な機能がたくさんあります。興味がある場合は、 エンキューのドキュメント を確認してください。

7
Maksim Kotlyar

this を見てください。

永続化のためにmemcachedを使用します。

3
nullpotent

Cronjobアプローチの問題は、cronjobは最大で1分の間隔に設定できるため、ジョブの実行に1分の遅延があることです。それが許容できる場合は、ポーリングスクリプトでキューを使用する必要があります。

2
Faisal Ameer

リレーショナルDB(例:MySQL)は非常に柔軟性があり、Web開発者によく理解されているため、多くのタイプのジョブキューに使用されます。多くのPHPアプリケーションは、オブジェクトキャッシュが構成されていない場合のフォールバックとしてこのソリューションを使用します。これは、キューを実装する非常にコストのかかる方法であるため、最後の手段です。

MySQLをキューとして使用する必要がある場合、Perconaエンジニアの1人が、潜在的な問題点の管理についてこれを書きました ブログエントリ

最もスケーラブルな実装が必要な場合は、ZeroMQを強くお勧めします。ただし、これはデフォルトではなく、特に一般的でもありません。PHP拡張機能です。したがって、Webサーバースタックを制御しないプロジェクトの場合:APCオブジェクト、MemcacheまたはMemcachedを使用してから、 MySQLキャッシュテーブル。

0
J. M. Becker

これは別の素晴らしいチュートリアルです:

http://squirrelshaterobots.com/programming/php/building-a-queue-server-in-php-part-1-understanding-the-project/

他の解決策は、PHPに組み込まれたと思われるGearmanを使用することです(これは私が最後に遊んだのはこれが最後ではありませんでした): http://php.net/manual /en/book.gearman.php

0
Brian