クライアントから(ポスト経由で)送信されたデータをキューに入れて、サーバー上のphpスクリプトが最初にキューが空かどうかを確認します。キューが空でない場合、スクリプトはキュー内のすべてのデータを1つずつ処理します。
これは 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
プロセスをいくつでも実行できます。ローカルコンピューターでは、追加のライブラリやパッケージなしで実行できます。
これは基本的な例であり、エンキューには他にも便利な機能がたくさんあります。興味がある場合は、 エンキューのドキュメント を確認してください。
this を見てください。
永続化のためにmemcachedを使用します。
Cronjobアプローチの問題は、cronjobは最大で1分の間隔に設定できるため、ジョブの実行に1分の遅延があることです。それが許容できる場合は、ポーリングスクリプトでキューを使用する必要があります。
リレーショナルDB(例:MySQL)は非常に柔軟性があり、Web開発者によく理解されているため、多くのタイプのジョブキューに使用されます。多くのPHPアプリケーションは、オブジェクトキャッシュが構成されていない場合のフォールバックとしてこのソリューションを使用します。これは、キューを実装する非常にコストのかかる方法であるため、最後の手段です。
MySQLをキューとして使用する必要がある場合、Perconaエンジニアの1人が、潜在的な問題点の管理についてこれを書きました ブログエントリ 。
最もスケーラブルな実装が必要な場合は、ZeroMQを強くお勧めします。ただし、これはデフォルトではなく、特に一般的でもありません。PHP拡張機能です。したがって、Webサーバースタックを制御しないプロジェクトの場合:APCオブジェクト、MemcacheまたはMemcachedを使用してから、 MySQLキャッシュテーブル。
これは別の素晴らしいチュートリアルです:
他の解決策は、PHPに組み込まれたと思われるGearmanを使用することです(これは私が最後に遊んだのはこれが最後ではありませんでした): http://php.net/manual /en/book.gearman.php