Swoft源码之Swoole和Swoft的分析(life)

这篇文章给大家分享的内容是关于Swoft 源码剖析之Swoole和Swoft的一些介绍(Task投递/定时任务篇),有一定的参考价值,有需要的朋友可以参考一下。

前言

Swoft的任务功能基于SwooleTask机制,或者说SwoftTask机制本质就是对SwooleTask机制的封装和加强。

我的官方群点击此处。

任务投递

//Swoft\Task\Task.php

class Task

{

    /**

     * Deliver coroutine or async task

     *

     * @param string $taskName

     * @param string $methodName

     * @param array  $params

     * @param string $type

     * @param int    $timeout

     *

     * @return bool|array

     * @throws TaskException

     */

    public static function deliver(string $taskName, string $methodName, array $params = [], string $type = self::TYPE_CO, $timeout = 3)

    {

        $data   = TaskHelper::pack($taskName, $methodName, $params, $type);

 

        if(!App::isWorkerStatus() && !App::isCoContext()){

            return self::deliverByQueue($data);//见下文Command章节

        }

 

        if(!App::isWorkerStatus() && App::isCoContext()){

            throw new TaskException('Please deliver task by http!');

        }

 

 

        $server = App::$server->getServer();

        // Delier coroutine task

        if ($type == self::TYPE_CO) {

            $tasks[0]  = $data;

            $prifleKey = 'task' . '.' . $taskName . '.' . $methodName;

 

            App::profileStart($prifleKey);

            $result = $server->taskCo($tasks, $timeout);

            App::profileEnd($prifleKey);

 

            return $result;

        }

 

        // Deliver async task

        return $server->task($data);

    }

}

 

【社群福利】30G-PHP进阶资料,助力大家都能30K

 

任务投递Task::deliver()将调用参数打包后根据$type参数通过Swoole$server->taskCo()$server->task()接口投递到Task进程
Task本身始终是同步执行的,$type仅仅影响投递这一操作的行为,Task::TYPE_ASYNC对应的$server->task()是异步投递,Task::deliver()调用后马上返回;Task::TYPE_CO对应的$server->taskCo()是协程投递,投递后让出协程控制,任务完成或执行超时后Task::deliver()才从协程返回。

任务执行

//Swoft\Task\Bootstrap\Listeners\TaskEventListener 

/**

 * The listener of swoole task

 * @SwooleListener({

 *     SwooleEvent::ON_TASK,

 *     SwooleEvent::ON_FINISH,

 * })

 */

class TaskEventListener implements TaskInterface, FinishInterface

{

    /**

     * @param \Swoole\Server $server

     * @param int            $taskId

     * @param int            $workerId

     * @param mixed          $data

     * @return mixed

     * @throws \InvalidArgumentException

     */

    public function onTask(Server $server, int $taskId, int $workerId, $data)

    {

        try {

            /* @var TaskExecutor $taskExecutor*/

            $taskExecutor = App::getBean(TaskExecutor::class);

            $result = $taskExecutor->run($data);

        } catch (\Throwable $throwable) {

            App::error(sprintf('TaskExecutor->run %s file=%s line=%d ', $throwable->getMessage(), $throwable->getFile(), $throwable->getLine()));

            $result = false;

 

            // Release system resources

            App::trigger(AppEvent::RESOURCE_RELEASE);

 

            App::trigger(TaskEvent::AFTER_TASK);

        }

        return $result;

    }

}

此处是swoole.onTask的事件回调,其职责仅仅是将将Worker进程投递来的打包后的数据

你可能感兴趣的:(PHP学习,PHP开发,PHP)