如果你還沒有安裝hhxsv5/laravel-s,可以跳轉去安裝
laravel下安裝laravels以及websocket的使用
此特性依賴Swoole的AsyncTask,必須先設定config/laravels.php的
swoole.task_worker_num,異步任務的處理能力受Task行程數影響,需合理設定task_worker_num,
創建任務類
<?php
/**
* Created by PhpStorm.
* User: wxiangqian
*/
namespace App\Tasks;
use Hhxsv5\LaravelS\Swoole\Task\Task;
use Illuminate\Support\Facades\Log;
class TestTask extends Task
{
private $data;
private $result;
public function __construct($data)
{
$this->data = $data;
}
// 處理任務的邏輯,運行在Task行程中,不能投遞任務
public function handle()
{
Log::info(__CLASS__ . ':handle start', [$this->data]);
sleep(2);// 模擬一些慢速的事件處理
// 此處拋出的例外會被上層捕獲并記錄到Swoole日志,開發者需要手動try/catch
$this->result = 'the result of ' . $this->data;
}
// 可選的,完成事件,任務處理完后的邏輯,運行在Worker行程中,可以投遞任務
public function finish()
{
\Log::info(__CLASS__ . ':finish start', [$this->result]);
Task::deliver(new TestTask2('task2')); // 投遞其他任務
}
}
投遞任務
// 實體化TestTask并通過deliver投遞,此操作是異步的,投遞后立即回傳,由Task行程繼續處理TestTask中的handle邏輯
use Hhxsv5\LaravelS\Swoole\Task\Task;
$task = new TestTask('task data');
// $task->delay(3); // 延遲3秒投遞任務
// $task->setTries(3); // 出現例外時,累計嘗試3次
$ret = Task::deliver($task);
var_dump($ret);// 判斷是否投遞成功
常見問題
報錯:Class swoole does not exist
- 在LaravelS中,Swoole是以cli模式啟動的Http Server,替代了FPM,
- 投遞任務、觸發異步事件都會呼叫app(‘swoole’),從Laravel容器中獲取Swoole\http\server實體,只有在LaravelS啟動時,才會注入這個實體到容器中,
- 所以,一旦脫離LaravelS,由于跨行程,以下情況,你將無法成功呼叫app(‘swoole’):
- 以各種命令列方式運行的代碼,例如Artisan命令列、PHP腳本命令列;
- 運行在FPM/Apache PHP Module下的代碼,查看SAPI Log::info(‘PHP SAPI’, [php_sapi_name()]);,
ps: 應通過websocket連接的形式去投遞任務
websocket的使用跳轉上篇文章:laravel下安裝laravels以及websocket的使用
修改onMessage中的代碼即可測驗
public function onMessage(Server $server, Frame $frame)
{
$task = new TestTask('task data');
// $task->delay(3); // 延遲3秒投遞任務
// $task->setTries(3); // 出現例外
$ret = Task::deliver($task);
$server->push($frame->fd, $ret);
}
結束語
希望本文可以幫助大家學習如何使用異步任務佇列,👍
CSDN認證博客專家
PHP開發工程師
分享實戰經驗
作業地點:北京
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/245253.html
標籤:其他
