有关Beanstalkd的基本概念,编译和yum的安装方法已经在上篇文章《Beanstalkd消息/任务队列的详解》中介绍了,今天练习下PHP使用Beanstalkd的过程,我选择的是使用Pheanstalk类来连接Beanstalkd

1.使用Composer安装Pheanstalk

composer require pda/pheanstalk

2.实现代码

php查看beanstalkd状态脚本Status.php

/**

* Created by PhpStorm.

* User: jmsite.cn

* Date: 2019/1/21

* Time: 10:32

*/

require"../vendor/autoload.php";

usePheanstalk\Pheanstalk;

$pheanstalk=newPheanstalk('192.168.75.135',11300);

print_r($pheanstalk->stats());

生产者代码Producter.php

/**

* Created by PhpStorm.

* User: jmsite.cn

* Date: 2019/1/20

* Time: 16:30

*/

require"../vendor/autoload.php";

usePheanstalk\Pheanstalk;

$pheanstalk=newPheanstalk('192.168.75.135',11300);

for($i=0;$i<50;$i++){

$data=array(

'key'=>'testkey'.$i,

'value'=>'testvalue',

'time'=> time(),

//phpfensi.com

);

$ret=$pheanstalk->putInTube('test-tube', json_encode($data), Pheanstalk::DEFAULT_PRIORITY, Pheanstalk::DEFAULT_DELAY, Pheanstalk::DEFAULT_TTR);

var_dump($ret);

}

消费者代码Consumer.php

/**

* Created by PhpStorm.

* User: jmsite.cn

* Date: 2019/1/20

* Time: 16:31

*/

set_time_limit(0);

ini_set('default_socket_timeout', 900);

require"../vendor/autoload.php";

usePheanstalk\Pheanstalk;

$pheanstalk=newPheanstalk('192.168.75.135',11300);

while(true){

$job=$pheanstalk

->watch('test-tube')

->ignore('default')

->reserve();

if($job){

sleep(2);

echo$job->getData();

echo"\n";

$pheanstalk->delete($job);

}

}

打开命令行/终端窗口,执行生产者,会向tube写入50条任务

PS E:\repository\work\beanstalk> php .\Producter.php

int(101)

int(102)

int(103)

int(104)

int(105)

int(106)

int(107)

int(108)

int(109)

int(110)

int(111)

int(112)

int(113)

int(114)

……

由此可见,$pheanstalk->putInTube成功后返回的是job的id

查看状态

PS E:\repository\work\beanstalk> php Status.php

Pheanstalk\Response\ArrayResponse Object

(

[_name:Pheanstalk\Response\ArrayResponse:private] => OK

[storage:ArrayObject:private] => Array

(

[current-jobs-urgent] => 0

[current-jobs-ready] => 50

[current-jobs-reserved] => 0

[current-jobs-delayed] => 0

[current-jobs-buried] => 0

……

结果中显示处于ready待读取状态的job是50个

打开两个或以上命令行/终端窗口,执行消费者,模拟多消费者竞争

消费者1

PS E:\repository\work\beanstalk> php .\Consumer.php

{"key":"testkey0","value":"testvalue","time":1548039103}

{"key":"testkey1","value":"testvalue","time":1548039103}

{"key":"testkey2","value":"testvalue","time":1548039103}

{"key":"testkey4","value":"testvalue","time":1548039103}

{"key":"testkey6","value":"testvalue","time":1548039103}

{"key":"testkey8","value":"testvalue","time":1548039103}

{"key":"testkey10","value":"testvalue","time":1548039103}

{"key":"testkey12","value":"testvalue","time":1548039103}

{"key":"testkey14","value":"testvalue","time":1548039103}

{"key":"testkey16","value":"testvalue","time":1548039103}

{"key":"testkey18","value":"testvalue","time":1548039103}

{"key":"testkey20","value":"testvalue","time":1548039103}

{"key":"testkey22","value":"testvalue","time":1548039103}

{"key":"testkey24","value":"testvalue","time":1548039103}

{"key":"testkey26","value":"testvalue","time":1548039103}

{"key":"testkey28","value":"testvalue","time":1548039103}

{"key":"testkey30","value":"testvalue","time":1548039103}

{"key":"testkey32","value":"testvalue","time":1548039103}

{"key":"testkey34","value":"testvalue","time":1548039103}

{"key":"testkey36","value":"testvalue","time":1548039103}

{"key":"testkey38","value":"testvalue","time":1548039103}

{"key":"testkey40","value":"testvalue","time":1548039103}

{"key":"testkey42","value":"testvalue","time":1548039103}

{"key":"testkey44","value":"testvalue","time":1548039103}

{"key":"testkey46","value":"testvalue","time":1548039103}

{"key":"testkey48","value":"testvalue","time":1548039103}

消费者2

PS E:\repository\work\beanstalk> php .\Consumer.php

{"key":"testkey3","value":"testvalue","time":1548039103}

{"key":"testkey5","value":"testvalue","time":1548039103}

{"key":"testkey7","value":"testvalue","time":1548039103}

{"key":"testkey9","value":"testvalue","time":1548039103}

{"key":"testkey11","value":"testvalue","time":1548039103}

{"key":"testkey13","value":"testvalue","time":1548039103}

{"key":"testkey15","value":"testvalue","time":1548039103}

{"key":"testkey17","value":"testvalue","time":1548039103}

{"key":"testkey19","value":"testvalue","time":1548039103}

{"key":"testkey21","value":"testvalue","time":1548039103}

{"key":"testkey23","value":"testvalue","time":1548039103}

{"key":"testkey25","value":"testvalue","time":1548039103}

{"key":"testkey27","value":"testvalue","time":1548039103}

{"key":"testkey29","value":"testvalue","time":1548039103}

{"key":"testkey31","value":"testvalue","time":1548039103}

{"key":"testkey33","value":"testvalue","time":1548039103}

{"key":"testkey35","value":"testvalue","time":1548039103}

{"key":"testkey37","value":"testvalue","time":1548039103}

{"key":"testkey39","value":"testvalue","time":1548039103}

{"key":"testkey41","value":"testvalue","time":1548039103}

{"key":"testkey43","value":"testvalue","time":1548039103}

{"key":"testkey45","value":"testvalue","time":1548039103}

{"key":"testkey47","value":"testvalue","time":1548039103}

{"key":"testkey49","value":"testvalue","time":1548039103}

两个消费者竞争着完成了全部任务,由于我的beanstalkd启动时开启了binlog持久,所以beanstalkd重启后任务也不会丢失

3.需要注意的事项

1.创建job时,设置的超时时间Pheanstalk::DEFAULT_TTR一定要比消费者处理一个job的时间要长,否则job在超时之后会被tube更改为ready状态,被其他消费者获取,而此时当前消费者还在处理该job,这就出现了一个job被多个消费者重复执行的可怕现象

2.Pheanstalk的维护者发生了变化,在新版的Pheanstalk中是不支持长连接的,当客户端socket连接服务器时间超过php.ini中设置的default_socket_timeout时,如果未能从服务端tube获得job,连接将会被断开,所以消费者进程需要维护,以便在退出后可以重新开启进程,推荐使用supervisord维护消费者进程。

判断socket超时的代码

publicfunctiongetLine($length= null)

{

$timeout=ini_get('default_socket_timeout');

$timer= microtime(true);

do{

$data= isset($length) ?

$this->_wrapper()->fgets($this->_socket,$length) :

$this->_wrapper()->fgets($this->_socket);

if($this->_wrapper()->feof($this->_socket)) {

thrownewException\SocketException('Socket closed by server!');

}

if(($data=== false) && microtime(true) –$timer>$timeout) {

$this->disconnect();

thrownewException\SocketException('Socket timed out!');

}

} while($data=== false);

returnrtrim($data);

}

php beanstalkd使用,PHP使用Beanstalkd实例详解相关推荐

  1. java异常例子_java 异常的实例详解

    java 异常的实例详解 1.异常的定义:程序在运行时出现不正常情况. 异常的划分: Error:严重的问题,对于error一般不编写针对性的代码对其进行处理. Exception:非严重的问题,对于 ...

  2. python 自动化办公 案例_python自动化工具之pywinauto实例详解

    python自动化工具之pywinauto实例详解 来源:中文源码网 浏览: 次 日期:2019年11月5日 [下载文档: python自动化工具之pywinauto实例详解.txt ] (友情提示: ...

  3. java写exe程序实例,java实现可安装的exe程序实例详解

    java实现可安装的exe程序实例详解 通过编写java代码,实现可安装的exe文件的一般思路: 1.在eclipse中创建java项目,然后编写java代码,将编写好的java项目导出一个.jar格 ...

  4. python多进程应用场景_python使用多进程的实例详解

    python多线程适合IO密集型场景,而在CPU密集型场景,并不能充分利用多核CPU,而协程本质基于线程,同样不能充分发挥多核的优势. 针对计算密集型场景需要使用多进程,python的multipro ...

  5. php可以打印一个页面,利用html实现分页打印功能的实例详解

    本篇介绍利用html实现分页打印功能的实例详解,有些不想打印出来的分页打印的都可以应用这类样式进行控制 在非打印时是无效的. 页面打印 /* 应用这个样式的在打印时隐藏 */ .noPrint { d ...

  6. python判断是否回文_对python判断是否回文数的实例详解

    设n是一任意自然数.若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数.例如,若n=1234321,则称n为一回文数:但若n=1234567,则n不是回文数. 上面的解释就是说回文数和逆 ...

  7. python2.7除法_对python中的float除法和整除法的实例详解

    从python2.2开始,便有两种除法运算符:"/"."//".两者最大区别在: python2.2前的版本和python2.2以后3.0以前的版本的默认情况下 ...

  8. java测试类 main方法_Java使用agent实现main方法之前的实例详解

    Java使用agent实现main方法之前的实例详解 创建Agent项目 PreMainExecutor 类,在main方法之前执行此方法 public class PreMainExecutor { ...

  9. java中匿名内部类详解_java 中匿名内部类的实例详解

    搜索热词 java 中匿名内部类的实例详解 原来的面貌: class TT extends Test{ void show() { System.out.println(s+"~~~哈哈&q ...

  10. 【配置映射】—Entity Framework实例详解

    前两篇博文中的配置属性和配置关系都是配置映射,配置属性是属性的映射,配置关系式关系的映射,本篇从讲讲实体的映射. 首先,配置实体映射到表,使用ToTable方法,它接受两个参数,第一个参数是表的名称, ...

最新文章

  1. 华为消息推送 有透传通道吗_华为首款头戴耳机FreeBuds Studio正式发布,能否撑起品牌之名?...
  2. 机器学习算法基础——逻辑回归
  3. FOJ Problem 2253 Salty Fish
  4. ffplay SDL_OpenAudio (2 channels, 44100 Hz): WASAPI can‘t initialize audio client“
  5. cairosvg在linux中的安装_直接用ISO文件在linux上安装新系统
  6. JEECG 3.6.5版本发布,企业级JAVA快速开发平台
  7. bootstrapTable表格分页后,处理逻辑后刷新跳回第一页,没留在当前页的解决办法
  8. python安装django模块_在您的(Django)项目中使用setup.py
  9. canvas视频录制
  10. 树莓派硬件编程——(一)用RPi.GPIO库输出信号
  11. 电脑取消撤销快捷键是什么_撤销快捷键ctrl加什么
  12. Firefox,IE5,IE6,IE5.5等浏览器兼容性解决方法
  13. Python-温度转换
  14. 接待员如何向客人upsell_前厅部接待员办理入住操作步骤
  15. WordPress图片模糊问题
  16. 使用Charles和iPhone进行微信小程序抓包详解
  17. OpenAI baseline GAIL代码讲解及其可视化
  18. 了解---研究生发表论文的级别分类
  19. rk3288 调试dvp摄像头_RK3288 - 双路摄像头的硬件外接实现
  20. css3实现无限旋转360度

热门文章

  1. (对比PDF)Adobe Acrobat DC 离线对比PDF、draftable.com/compare 在线对比PDF
  2. VMD的相关命令(转载)
  3. ClickHouse最简单的安装方法
  4. [JOYOI1326] 剑人合一
  5. [转载]linux+nginx+python+mysql安装文档
  6. System.IO.Ports.SerialPort串口通信接收完整数据
  7. ASP.NET - 一般处理程序获取session值
  8. Bresenham 圆和椭圆的生成算法
  9. Windows+Python3.7下自动生成requirements.txt文件
  10. 每日算法系列【LeetCode 556】下一个更大元素 III