PHP非阻塞异步任务调用函数代码

本文介绍了一个基于PHP的异步非阻塞任务处理方案,利用多进程和信号处理实现任务的并发执行,并详细解释了非阻塞与异步的概念及其实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

哪里非阻塞了,为什么非阻塞?

主进程非阻塞了,因为本代码在运行的过程中不需要等待。所以本代码主进程非阻塞,再说一遍,是主进程非阻塞。

哪里异步了,为什么异步?

本代码利用了多进程fork产生了很多子进程,本人认为异步应该有参考,才能看出本进程是否同步还是异步。由于产生了很多子进程,子进程工作有快有慢,估任一子进程相对于其他子进程是异步的。相对于主进程也是异步的。故子进程异步了,因为工作有快有慢。

异步为什么要回调或者使用信号、或者使用状态来通知?

本代码中利用了fork产生多个进程,由于进程之间的上下文(上下代码的变量值)各不相同。所以进程之间不得传递数据。只能利用奇巧淫技来处理子进程的结果。常用的可以使用callback函数、LINUX系统的进程之间传递信号、状态。

1、传递callback:
传递给子进程,子进程得到结果后给callback函数处理,其实还是使用了cpu给子进程分配的运行时间片。
2、LINUX信号:
简单说就是子进程通过信号,通知主进程,说我完成了。那么数据怎么传?可以通过有名管道(比如用子进程的pid命名)、内存共享等等。得到子进程的结果。
3、状态:
可以利用redis的sub\pub来模拟linux信号进行通知,用redis的特性来传递数据。跟linux的信号无异。

<?php
pcntl_signal(SIGCHLD, SIG_IGN);
function asynchronousTask(callable $functionName, $params) {
    $apid = pcntl_fork();
    if ($apid == -1) {
        exit('could not fork for client ' . $client);
    } else if ($apid) {
        return;
    } else {
        call_user_func_array($functionName, $params);
        exit();
    }
}

function httpCurl($url, $data, $requestType = 'get', $callback = '') {
    //初始化curl
    $ch = curl_init();
    //设置超时
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    if (strtolower($requestType) == 'post') {
        curl_setopt ( $ch, CURLOPT_POST, 1 );
        curl_setopt ( $ch, CURLOPT_POSTFIELDS, $data );
    }
    $return = curl_exec($ch);
    curl_close($ch);

    if (is_callable($callback)) {
        $callback($return);
    }
    return;
}

for($i = 0; $i <= 10; $i++) {
    asynchronousTask('httpCurl', ['http://www.baidu.com', '', 'get', function ($data) {
        sleep(rand(1, 3)); // 用于卡住本子进程,模拟子进程不同的工作效率。
        echo strlen($data) . "\n";
    }]);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值