zoukankan      html  css  js  c++  java
  • PHP实现队列的原理

    关于的队列的介绍,我这里就不多讲了,随便百度一下都很多

    用过laravel框架的童鞋都知道其自带队列功能,之前我很费解,PHP只是一个脚本,有超时机制

    为什么能不停的去执行队列呢?

    带着这个问题,在网上找了一下相关的介绍,这里我没有研究透laravel的队列,而且用这么高大上的实例来给大家讲,我估计自己都云里雾里

    所以我就其原理说明一下

    我们新建一个文件queue

    <?php
    while(true){
      echo 1;
      sleep(1);    
    }

    然后中 命令行里面 执行 php queue

    你会发现每秒钟输出一个1;等了很久,咦,很神奇,为什么php没有超时呢?

    对,就是不会超时,Why?

    答:实际上PHP执行脚本是不会超时的,我们在网页中看到的诸如504等超时,是由Apache,Nginx,PHP配置文件设置的超时时间决定的,因为PHP命令行执行文件没有使用PHP配置文件,所以默认是不超时的。

    ps -ef|grep php

    会发现有一个 php queue进程


    php超时的疑惑我们解决了

    再来看一下队列的原理

    新建一个文件 artisan

    <?php
    $redis = new Redis();
    $redis->connect('127.0.0.1',6379);
    while(1){
            $res = $redis->lpop('listname');
            if($res){echo $res."
    ";}
            sleep(1);
    }

    然后php artisan 执行队列

    我们来新建一个窗口,进入redis客户端输入以下命令【不会redis的可以在我的博客中找相关资料】

    lpush listname a b c d e f g

    会发现php artisan这个队列会不断的把redis里我刚刚push进去的值打出来

    其实laravel的队列就是这个原理,只不过,它不仅支持redis作为载体,还可以使用其他更多的数据库


    有人就要问了,我这php artisan启动了,如果我把窗口关了不就没用了吗,

    不不不,Linux 还是可以在后台运行的

    只要在命令后面加个 &

    php artisan &

    就可以啦

    这些是PHP队列的基本原理,当然我们还可以去执行对象的队列及更复杂的情况,更多的请研究Laravel吧,由于笔者水平有限,不对的地方还望指正;谢谢

  • 相关阅读:
    spring boot2X集成spring cloud config
    Spring boot配置文件application.properties和bootstrap.properties的区别
    (原)linux下caffe模型转tensorflow模型
    (原)torch7中指定可见的GPU
    (原)使用tensorboard显示loss
    (原)tensorflow保存模型及载入保存的模型
    (原)ubuntu挂载及开机自动挂载网络端的文件夹的方法
    (原+转)win7上编译caffe支持python及matlab
    (原)ubuntnu中anaconda的g++提示crtbeginS.o:unrecognized relocation
    (原)PyTorch中使用指定的GPU
  • 原文地址:https://www.cnblogs.com/xiaozong/p/5668174.html
Copyright © 2011-2022 走看看