这里先说个理解:
php的多进程任务:多个php子进程去处理任务
我们先了解一下,php进程在linux的表现形式
#查看php进程
ps -ef | grep php
- 1
- 2
上图所示 有一个php-fpm:master 这个是主进程,其他php-fpm:pool 是子进程。当一个请求进来,我们的主进程会分配一个子进程去处理相关任务。
那我们怎么去增加一个进程和对进程进行一个任务分配达到多进程处理的效果呢?
1.首先是增加一个进程,我们写段php来试下
vim test.php
- 1
<?php
sleep(10);#延迟10秒执行
- 1
- 2
#执行这个php
php test.php
- 1
- 2
这个时候,你会发现什么linux处于一个等待的情况,这个时候我们打开另外一个窗口查看php进程,这个时候就会发现进程中多出了一个进程,而且就是我们刚才执行的php test.php
但是这个时候又会出现另一个问题,当linux结束了10秒的等待时间,php进程也跟着消失了。这个时候就需要我们让这个脚本一直执行,那么进程就会一直存在了!
2.不会停止的php运行
<?php
#修改刚才的脚本,写一个死循环
while(1){
}
再执行
php test.php
- 1
这个时候php的进程就不会退出了。但是另外一个问题也来了,我们ctrl+c退出这个运行,或者是关闭这个连接窗口,我们的php进程也会随之退出。
3.守护态的php进程运行
重新执行命令 加上 >> /dev/null 就可以保持一个后台运行 的php进程了
···
php test.php >> /dev/null
···
这个时候我们已经了解怎么样启动一个在后台运行的php任务了,那我们就继续深入。
(晕,感觉写的好啰嗦,直接放代码了!!小声BB)
终极蛇皮多进程php管理
command.php
<?php
function runPHPFPM($filename,$num){
$res = exec("/bin/ps -ef|grep -v grep|grep '{$filename}'|wc -l");//获得这个执行任务名的进程次数
//开始增加进程
if($res<$num){
$off = $num - $res;
for($i=0;$i<$off;$i++){ //补全N个进程
$log_into['add_num'] = $i+1; // 再次开启数
$exec_str = '/usr/bin/php '." $filename >> /dev/null & ";
exec($exec_str);//exec() linux执行php命令
}
}
}
runPHPFPM('test.php',1);//默认启动一个
test.php
<?php
while (1){
$nowTime = date('i', time());
if ($nowTime == 59) {
exit;//为了保证进程的活跃性,每小时59分给退出一下。不设置的话,有可能导致进程长时间执行,出行异常的问题。比如:明明有数据却没有没执行(我碰见过)
}
//下面放逻辑,比如redis队列如下
$redis_key = 'redis任务队列名字';
$data = json_decode(redis()->lpop($redis_key),true);//从队列取出一条数据
//入库
//~~~~
//~~~
//等等
}
?>
设置定时任务·
crontab -e
#因为设置的脚本会自动退出,那我们用linux定时任务 一分钟给执行一次
*/1 * * * * /usr/bin/php command.php