thinkphp6 实现php代码异步执行 (无需安装任何框架)

在php中,执行异步任务是一种很常见的需求,如批量发邮箱,短信等等执行耗时任务时,需要程序异步执行,给用户带来好的体验。

在php异步执行代码就很尬尴,不像java 可以创建多线程,在php中也可以用pcntl_fork()实现创建子进程,来实现异步,但这样可能会产生很多僵尸进程。其他的方式借助框架实现,如优秀的swoole框架,本文介绍无需安装如何框架扩展,php自带的方式处理

下面直接上代码,我用的thinkphp6

在extend下创建一个util类,代码如下

<?php

namespace util;


class AsyncHook
{
    private static $hook_list = array();
    private static $hooked = false;

    /**
     * hook函数fastcgi_finish_request执行
     *
     * @param callback $callback
     * @param array $params
     */
    public static function hook($callback, $params = [])
    {
        self::$hook_list[] = array('callback' => $callback, 'params' => $params);

        if (self::$hooked == false) {
            self::$hooked = true;
            register_shutdown_function(array(__CLASS__, '__run'));
        }
    }

    /**
     * 由系统调用
     *
     * @return void
     */
    public static function __run()
    {
        if (function_exists('fastcgi_finish_request')) {
            fastcgi_finish_request();
        }

        if (empty(self::$hook_list)) {
            return;
        }

        foreach (self::$hook_list as $hook) {
            $callback = $hook['callback'];
            $params   = $hook['params'];
            call_user_func_array($callback, $params);
        }
    }

}

调用方式

 $namespaceClass = "app\\api\\task\\Test";
 $classObj = app($namespaceClass);
 \util\AsyncHook:hook([$classObj,"index"],['name'=>1]);
 $this->success("");

执行结果,会先$this->success()返回数据,后执行hook中的Test index方法。很简单。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值