Swoole 在 PHP-fpm/apache 中使用 task 功能

  • 新建 RedisServer.php
  • 代码如下
    <?php
    use Swoole\Redis\Server;
    $server = new Server("127.0.0.1", 9501, SWOOLE_PROCESS );
    $server->set(array(
        'task_worker_num' => 32,
        'worker_num' => 1,
        'task_enable_coroutine' => true,
        'heartbeat_check_interval' => 5,
        'heartbeat_idle_time' => 10,
    ));
    $server->setHandler('LPUSH', function ($fd, $data) use ($server) {
        $taskId = $server->task($data);
        if ($taskId === false) {
            $server->send($fd, Server::format(Server::ERROR));
        } else {
            $server->send($fd, Server::format(Server::INT, $taskId));
        }
    });
    $server->on('Finish', function($serv, $taskID, $data) {
        $stats = $serv->stats();
        if ($stats['tasking_num'] > 10) { //tasking_num 当前正在排队的任务数
            echo "剩余任务信息:" . json_encode($serv->stats()) . "\n";
        }
    });
    $server->on('Task', function ($serv, $data) {
        go(function () {
            usleep(50000);
        });
        var_dump($data);
    });
    $server->start();

    task 里面 usleep (50000); 模拟任务执行时间

  • 新建 Queue.php
  • 代码如下
    <?php
    $redis = new Redis;
    $redis->connect('127.0.0.1', 9501);
    $x=1; 
    while($x <= 1000) {
      $redis->lpush("myqueue", json_encode(array("hello".$x, "swoole")));
      $x++;
    } 

    模拟 1000 的任务投递
    经测试,1 秒处理完毕

    可以根据 Task 任务执行的速度调节 task_worker_num 控制启动的进程数量#

  • 这些进程是由 swoole 底层负责管理的,在发生致命错误或进程退出后底层会重新创建新的任务进程

    task_worker_num#

  • 最大值不得超过 SWOOLE_CPU_NUM * 1000
  • 单个 task 的处理耗时,如 100ms,那一个进程 1 秒就可以处理 1/0.1=10 个 task
  • task 投递的速度,如每秒产生 2000 个 task
  • 2000/10=200,需要设置 task_worker_num => 200,启用 200 个 task 进程
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 1
tangq

php-fpm 也可以使用 swoole 吗?

5年前 评论
JaguarJack 5年前
php迷途小书童 (楼主) 5年前