PHP在处理一些耗时任务时的处理方式

这篇博客介绍了在PHP中实现并发处理的两种方式。第一种是使用`pcntl_fork`函数创建子进程,适用于Linux环境,需要安装pcntl扩展。第二种是利用Symfony的Process组件,通过`proc_open`函数在子进程中执行命令,支持Windows和Linux系统。示例代码展示了如何使用这两种方法启动子进程执行耗时任务。

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

方式一:使用pcntl_fork

PHP是支持并发的,只是平时很少使用。创建进程需要使用php的一个函数pcntl_fork(),Linux下有个叫fork()的函数,
用来创建子进程。这个函数和Linux下这个函数类似。需要注意的是,这个函数在Linux下才能使用,而且需要安装pcntl的扩展。

函数的具体使用可以查阅官方文档:http://php.net/manual/zh/function.pcntl-fork.php

示例

<?php

$pid = pcntl_fork();

//父进程和子进程都会执行下面代码

if ($pid == -1) {

    //错误处理:创建子进程失败时返回-1.

    die('could not fork');

} else if ($pid) {

    //父进程会得到子进程号,所以这里是父进程执行的逻辑

    //发送邮件等,这里使用sleep模拟

    sleep(10);

    error_log($pid.'---'.time()."\r\n",3,'1.txt');

    pcntl_wait($status); //等待子进程中断,防止子进程成为僵尸进程。

} else {

    //子进程得到的$pid为0, 所以这里是子进程执行的逻辑。

    echo 'child';

}

方式二:Process组件

Symfony的Process组件用于在子进程中执行命令,其原理是使用PHP的proc_open函数来运行进程。支持Windows和Linux系统。

官网地址:https://github.com/symfony/process

需要去安装组件库

composer require symfony/process

使用方法

//新建cli.php
<?php
//模拟耗时任务,10秒后,在log.txt中输出当前时间
sleep(10);
error_log(time()."\r\n",3,'log.txt');
echo time();die;

新建index.php,内容如下:

use Symfony\Component\Process\Exception\ProcessFailedException;
use Symfony\Component\Process\Process;
$process = new Process(['php','cli.php']); //等同于在命令行窗口执行:php cli.php
$process->setOptions(['create_new_console' => true]);
$process->start();
echo 'ok';
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小信啊啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值