PHP-Swoole 异步执行任务 task

EN
EN
2023-05-02 / 0 评论 / 33 阅读 / 正在检测是否收录...

在 Server 程序中如果需要执行很耗时的操作,比如一个聊天服务器发送广播,Web 服务器中发送邮件。如果直接去执行这些函数就会阻塞当前进程,导致服务器响应变慢。

Swoole 提供了异步任务处理的功能,可以投递一个异步任务到 TaskWorker 进程池中执行,不影响当前请求的处理速度。

<?php

$http = new Swoole\Http\Server('0.0.0.0', 9501);

//设置异步任务的工作进程数量
$http->set([
    'task_worker_num' => 4
]);

////此回调函数在worker进程中执行
$http->on('Request', function ($request, $response) use($http) {
    echo "来了!".PHP_EOL;
    $response->header('Content-Type', 'text/html; charset=utf-8');
    
    $http->task("广播任务");
    $http->task("列队任务");
    $http->task("邮件任务");
    
    $response->end('<h1>Hello Swoole. #' . rand(1000, 9999) . '</h1>');
});

//处理异步任务(此回调函数在task进程中执行)
$http->on('Task', function ($serv, $task_id, $reactor_id, $data) {
   
    $sle = rand(1,5);
    echo "New AsyncTask[id={$task_id}] sleep:{$sle}".PHP_EOL;
    sleep($sle);
    
    //返回任务执行的结果
    $serv->finish("{$data} -> OK");
});

//处理异步任务的结果(此回调函数在worker进程中执行)
$http->on('Finish', function ($serv, $task_id, $data) {
    echo "AsyncTask[{$task_id}] Finish: {$data}".PHP_EOL;
});

$http->start();

在终端中运行该php文件 php test.php
在浏览器访问 IP:9501 即可。

浏览器显示 <h1>Hello Swoole. #8511</h1>
终端显示:
lte3hfxy.png

当 任务数量 大于 异步任务的工作进程数量 时

在上面设置的 异步任务的工作进程数量 = 4,当执行的任务数量多于4时,是怎样的呢?

$http->on('Request', function ($request, $response) use($http) {
    echo "来了!".PHP_EOL;
    $response->header('Content-Type', 'text/html; charset=utf-8');

    //6个任务
    
    $http->task("广播任务");
    $http->task("列队任务");
    $http->task("邮件任务");
    
    $http->task("广播任务2");
    $http->task("列队任务2");
    $http->task("邮件任务2");
    
    $response->end('<h1>Hello Swoole. #' . rand(1000, 9999) . '</h1>');
});

执行结果
lte3vere.png

0

评论 (0)

取消