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
二维码
共有 0 条评论