この半月、laravel 4.2とlaravelが誇るキューサービス(queue)を初めて使用して、WeChatパブリックアカウントのバックエンドシステムの書き換えに参加しました。
システム全体で複数端末のやり取りや多数の音声送信・処理サービスが行われているため、一部の箇所で応答時間が長すぎることが判明しました。以前のシステムは、node.js と mongoDB に基づいていました。node は本質的に非同期であり、デーモン プロセスを備えているため、この問題は発生しませんでしたが、この書き換えにより、必然的に非同期プロセスが導入されます。行列が目に入る。
「中国語ドキュメント」のこのページによると、ほとんどすべて英語ですが、laravel はバージョン 4.2 でキューストレージとして redis を導入したばかりで、これは非常に良いニュースです。 OK、背景の紹介はこれで終わりです。以下、乾いた内容について話しましょう。
laravel のキュー サービスは他のキュー サービスと何ら変わりません。これらは人間の思考に最も沿った最も単純で一般的なプロセスです。キュー情報を保存する場所があり、PHP プロセスが実行時にタスクを書き込みます。デーモン プロセスはキュー情報をポーリングし、実行要件を満たすタスクを実行および削除します。 PHP は URL 駆動の同期言語であり、本質的にブロックするため、Laravel がキュー情報をクエリして実行するためのデーモン ツールを提供することは驚くことではありません。
Laravel のキュー設定ファイルは /app/config/queue.php です。 Default Queue Driver 項目では、「sync」、「beanstalkd」、「sqs」、「iron」、「redis」の 5 つのドライバーを選択できます。
1. sync はローカル デバッグ用の同期ドライバーです
2. Beanstalkd はプロフェッショナルなキュー サービス ドライバーです: http://kr.github.io/beanstalkd/
3. sqsとironは海外のサードパーティキューサービスです
4. 最後の項目 redis は、すべてのキャッシュ サービスとセッション サービスを redis に移行できるように、redis を使用する理由を示します。
0. ちなみに、1S の処理時間は夢ではありません。1S 兄弟。
キュー内のタスクは実行時に PHP デーモンによって独立して呼び出されるため、キュー サービスは独立したクラスとして新しいタスク クラスを作成する必要があります。を呼び出す前に他のクラスを使用すれば間違いありません。以前は、入力情報検証バリデーターや特別なセキュリティ検証モジュールなど、多くの追加サービスを別のフォルダー /app/services に分離しました。今回は、キュー クラスがその中に配置されます。
キューの使用は非常に簡単です。簡単な例を次に示します。
パブリック関数 fire($job, $data)
{
$url = $data['url'];
$json = $data['json'];
$job->delete();
}
}
上記のコードを実行すると、新しいタスクがキューに配置され、laravelは次のコマンドを通じてデーモンプロセスを開始します:
その後、デーモンがキューの処理を開始します。このコード内のPHPコマンドとartisanファイルのパスはご自身で調整してください。
使用するキュー システムは Redis と PHP コマンド ラインを使用していることに気づいたかもしれませんが、テスト環境ではブートを追加したり、手動で起動したりすることもできますが、運用環境ではより安定したシステムが必要です。これを保護するツールとしては、スーパーバイザを使用します。スーパーバイザのインストールと構成については、http://blog.segmentfault.com/qianfeng/1190000000532561 を参照してください。記事をご確認ください。 。 。
OK、すべての設定が完了したら、redis と PHP コマンド ラインを実行すると、システム全体が問題なく動作し始めます~
使用経験:
キュー サービスは非常に使いやすく、以前はアプリとの対話プロセスに 6 ~ 7 秒かかっていましたが、これは基本的に時間のかかる PHP コードの実行時間であり、2 秒未満に短縮されました。操作は非同期になっています。ただし、キュー サービスのデフォルトは 1S で、Alibaba Cloud サーバー上で実行できるサービスがあるかどうかを確認するプロセスを開くため、消費量はわずかに大きくなります。また、以前の同期中にファイルをロードする利点がないため、キューの処理時間は比較的長くなります。ただし、複数のタスクがある場合、PHP プロセスは 1 秒ごとに実行されるのではなく、継続的に実行されます。
落とし穴について話しましょう:
1. キューコアクラスは特殊な関数を使用しているため、明確な型を持たない変数は単一要素の配列の形式で json に格納され、その後 redis に格納されます。解決策は、入力する各データの前に「」を追加することです。上記の $url と $json はすでに引用符で囲まれて型宣言されているため、この手順は実行されませんでした。
2. URL をキューに渡す場合、システム キュー クラスは各 / の前に 2 つの \ を追加します。これは、一部の特殊な操作に致命的な影響を与える可能性があります。 (冗談ですが、上記と同じくらい致命的ですか!)
Contains(確認したい内容)を利用して判定(戻り値Boolean型)します。例: namespace TestBed 最初の式はキューのポインタを制御してキューサイズの範囲内でループ内をジャンプしますが、2 番目の式ポインタは 1 つのノードのメモリ距離だけ後方にジャンプし続けます。定義されたキューサイズの有効なメモリ範囲が未割り当てのメモリを占有している場合、コンパイラはエラーを報告します。 ? ?
{ public class MainTest
{ public static void Main()
{
int[]数値 = { 1,1,2,3,4,2,5,6,7};
Queue
foreach (数値の var item)
{
if (!q.Contains(item))
{
q.Enqueue(item);
}
}
} }
}