PHP异步: 利用pcntl扩展实现PHP异步处理

思路:利用pcntl生成一个子进程处理异步任务,处理完后杀掉子进程。
依赖:该功能依赖于php pcntl扩展,使用前需先安装该扩展

查看是否已经安装pcntl扩展

$ php -m |grep pcntl
pcntl

安装pcntl扩展(已经安装则忽略该步骤)

//根据自己的php版本下载源码包并解压
$ tar xvf php-7.1.27.tar.gz
$ cd php-7.1.27/ext/pcntl/

//源码编译扩展
$ phpize
$ ./configure --with-php-config=/usr/bin/php-config
$ make
$ make install

//在php.ini文件添加以下行
extension=pcntl.so

基于pcntl的异步工具类Async.php

class Async
{
    /**
     * 异步任务
     * @params $func 要异步执行的函数
     * @params $params 要传递给$func的参数
     */
    public static function asyncTask(callable $func, ...$params)
    {
        pcntl_signal(SIGCHLD, SIG_IGN); //安装监听信号
        $pid = pcntl_fork(); //生成一个线程
        if ($pid == -1) {
            exit('could not fork for client');
        }
        //父进程(pid大于0为父进程,pid为子进程的id)
        else if ($pid) {
            return $pid;
        }
        //子进程(pid为0则为子进程)
        else {
            try {
                //执行用户函数
                call_user_func_array($func, $params);
            } finally {
                //执行完后杀死进程
                posix_kill(posix_getpid(), SIGKILL);
                exit(0);
            }
        }
    }
}

main.php调用异步函数

<?php

require 'Async.php';

//需要异步执行的函数
$func = function($p1){
    //休眠1秒
    sleep(1);

    //打印参数
    echo $p1;
};

//异步执行函数
Async::asyncTask($func, "world\n");

//同步执行的操作,先于Async::asyncTask执行
echo "hello ";

sleep(1);

由于异步线程只能输出到控制台,示例采用控制台执行main.php文件:

$ php main.php

#输出结果
hello world 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,907评论 1 32
  • PHP7 已经出来1年了,PHP7.1也即将和大家见面,这么多好的特性,好的方法,为什么不使用呢,也希望PHP越来...
    梦幻_78af阅读 6,466评论 1 10
  • 出处:韩天峰 网址:rango.swoole.com/archives/508 并发IO问题一直是后端编程中的技术...
    meng_philip123阅读 6,990评论 1 38
  • 儿子的乐高课老师送给他一张星巴克买一送一的优惠券,他兴高采烈地要去品尝。 给他58元买了一杯冷咖啡,然后他告诉我说...
    清言华语阅读 3,558评论 1 1
  • 我慢慢懂了: 不是每个人都愿意陪你经历所有, 所以自己要靠自己,抵挡风雨。 命里有时终须有,命里无时莫强求, 应该...
    分享荣耀阅读 1,864评论 0 0

友情链接更多精彩内容