次のコラム workerman の使い方チュートリアル では、workerman を使って非同期タスクを実装する方法を紹介します。
1. 問題
問題が発生しました。PHP はシングルスレッドなので、マルチスレッドを実現できません。糸通しです。次に、複数のリンクが 1 つのスレッド、つまり 1 つの接続プロセスを使用し、それを処理するプロセスを開く
##2 というシナリオを使用する必要があります。 #workerman はどうでしょうか 非同期タスクを実装します。 Workerman は、問題の解決とドキュメントへの回答を手伝ってくれます。質問:
主要なビジネスが長時間ブロックされるのを避けるために、大量のビジネスを非同期で処理する方法。たとえば、1,000 人のユーザーに電子メールを送信したいと考えています。このプロセスは非常に遅いため、数秒間ブロックされる可能性があります。このプロセス中はメイン プロセスがブロックされるため、後続のリクエストに影響します。このような重いタスクをどのようにしてユーザーに引き継ぐことができますか?非同期処理のための他のプロセス。
回答:
このマシン、他のサーバー、さらにはサーバー クラスター上にいくつかのタスク プロセスを事前に確立して、負荷の高いビジネスを処理することができます。タスク プロセスの数は、たとえば 10 個に増やすことができます。当事者は、AsyncTcpConnection を使用して、非同期処理のためにこれらのタスク プロセスにデータを非同期に送信し、処理結果を非同期で取得します。
タスク プロセス サーバーuse Workerman\Worker; require_once __DIR__ . '/Workerman/Autoloader.php'; // task worker,使用Text协议 $task_worker = new Worker('Text://0.0.0.0:12345'); // task进程数可以根据需要多开一些 $task_worker->count = 100; $task_worker->name = 'TaskWorker'; //只有php7才支持task->reusePort,可以让每个task进程均衡的接收任务 //$task->reusePort = true; $task_worker->onMessage = function($connection, $task_data) { // 假设发来的是json数据 $task_data = json_decode($task_data, true); // 根据task_data处理相应的任务逻辑.... 得到结果,这里省略.... $task_result = ...... // 发送结果 $connection->send(json_encode($task_result)); }; Worker::runAll();
ワーカーマンを呼び出す
use Workerman\Worker; use \Workerman\Connection\AsyncTcpConnection; require_once __DIR__ . '/Workerman/Autoloader.php'; // websocket服务 $worker = new Worker('websocket://0.0.0.0:8080'); $worker->onMessage = function($ws_connection, $message) { // 与远程task服务建立异步连接,ip为远程task服务的ip,如果是本机就是127.0.0.1,如果是集群就是lvs的ip $task_connection = new AsyncTcpConnection('Text://127.0.0.1:12345'); // 任务及参数数据 $task_data = array( 'function' => 'send_mail', 'args' => array('from'=>'xxx', 'to'=>'xxx', 'contents'=>'xxx'), ); // 发送数据 $task_connection->send(json_encode($task_data)); // 异步获得结果 $task_connection->onMessage = function($task_connection, $task_result)use($ws_connection) { // 结果 var_dump($task_result); // 获得结果后记得关闭异步连接 $task_connection->close(); // 通知对应的websocket客户端任务完成 $ws_connection->send('task complete'); }; // 执行异步连接 $task_connection->connect(); } Worker::runAll();
このようにして、重いタスクはローカルマシンまたは他のサーバーのプロセスに引き継がれ、タスク完了後に結果が非同期で受信されます。ビジネスプロセスがブロックされることはありません。 Workerman 関連の技術記事の詳細については、
Workerman チュートリアル列にアクセスして学習してください。
以上がWorkerman が非同期タスクを実装する方法 (コード付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。