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

方式一:使用pcntl_fork

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

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

示例

$pid = pcntl_fork();

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

if ($pid == -1) {

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

    die('could not fork');

} else if ($pid) {

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

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

    sleep(10);

    error_log($pid.'---'.time()."rn",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()."rn",3,'log.txt');
echo time();die;

新建index.php,内容如下:

use SymfonyComponentProcessExceptionProcessFailedException;
use SymfonyComponentProcessProcess;
$process = new Process(['php','cli.php']); //等同于在命令行窗口执行:php cli.php
$process->setOptions(['create_new_console' => true]);
$process->start();
echo 'ok';

版权声明:
作者:linrux
链接:https://www.tot7.cn/technology/php/126.html
来源:Code林
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>