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

方式一:使用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';
posted @   小信吖  阅读(148)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示