php实现队列的方法:首先新建一个文件“artisan.php”;然后通过“php artisan”执行队列;最后进入redis客户端输入命令“lpush listname a b c d e f g”即可。
PHP实现队列的原理(laravel)
用过laravel框架的童鞋都知道其自带队列功能,之前我很费解,PHP只是一个脚本,有超时机制。为什么能不停的去执行队列呢?
我们新建一个文件queue.php<?php
while(true){
echo 1;
sleep(1);
}
然后中 命令行里面 执行 php queue.php
你会发现每秒钟输出一个1;等了很久,咦,很神奇,为什么php没有超时呢?
对,就是不会超时,Why?
答:实际上PHP执行脚本是不会超时的,我们在网页中看到的诸如504等超时,是由Apache,Nginx,PHP配置文件设置的超时时间决定的,因为PHP命令行执行文件没有使用PHP配置文件,所以默认是不超时的。ps -ef | grep php
会发现有一个 php queue进程
php超时的疑惑我们解决了
再来看一下队列的原理
新建一个文件 artisan.php<?php
$redis = new Redis();
$redis->connect('127.0.0.1',6379);
while(1){
$res = $redis->lpop('listname');
if($res){echo $res."\r\n";}
sleep(1);
}
然后php artisan 执行队列
我们来新建一个窗口,进入redis客户端输入以下命令lpush listname a b c d e f g
会发现php artisan这个队列会不断的把redis里我刚刚push进去的值打出来
其实laravel的队列就是这个原理,只不过,它不仅支持redis作为载体,还可以使用其他更多的数据库
有人就要问了,我这php artisan.php启动了,如果我把窗口关了不就没用了吗?不不不,Linux 还是可以在后台运行的
只要在命令后面加个 &,或者nohup ... $ 放到后台运行即可,当然也可以加入crontab定时任务里去执行。nohup php artisan.php &