php beanstalkd使用,PHP使用Beanstalkd实例详解
有关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实例详解相关推荐
- java异常例子_java 异常的实例详解
java 异常的实例详解 1.异常的定义:程序在运行时出现不正常情况. 异常的划分: Error:严重的问题,对于error一般不编写针对性的代码对其进行处理. Exception:非严重的问题,对于 ...
- python 自动化办公 案例_python自动化工具之pywinauto实例详解
python自动化工具之pywinauto实例详解 来源:中文源码网 浏览: 次 日期:2019年11月5日 [下载文档: python自动化工具之pywinauto实例详解.txt ] (友情提示: ...
- java写exe程序实例,java实现可安装的exe程序实例详解
java实现可安装的exe程序实例详解 通过编写java代码,实现可安装的exe文件的一般思路: 1.在eclipse中创建java项目,然后编写java代码,将编写好的java项目导出一个.jar格 ...
- python多进程应用场景_python使用多进程的实例详解
python多线程适合IO密集型场景,而在CPU密集型场景,并不能充分利用多核CPU,而协程本质基于线程,同样不能充分发挥多核的优势. 针对计算密集型场景需要使用多进程,python的multipro ...
- php可以打印一个页面,利用html实现分页打印功能的实例详解
本篇介绍利用html实现分页打印功能的实例详解,有些不想打印出来的分页打印的都可以应用这类样式进行控制 在非打印时是无效的. 页面打印 /* 应用这个样式的在打印时隐藏 */ .noPrint { d ...
- python判断是否回文_对python判断是否回文数的实例详解
设n是一任意自然数.若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数.例如,若n=1234321,则称n为一回文数:但若n=1234567,则n不是回文数. 上面的解释就是说回文数和逆 ...
- python2.7除法_对python中的float除法和整除法的实例详解
从python2.2开始,便有两种除法运算符:"/"."//".两者最大区别在: python2.2前的版本和python2.2以后3.0以前的版本的默认情况下 ...
- java测试类 main方法_Java使用agent实现main方法之前的实例详解
Java使用agent实现main方法之前的实例详解 创建Agent项目 PreMainExecutor 类,在main方法之前执行此方法 public class PreMainExecutor { ...
- java中匿名内部类详解_java 中匿名内部类的实例详解
搜索热词 java 中匿名内部类的实例详解 原来的面貌: class TT extends Test{ void show() { System.out.println(s+"~~~哈哈&q ...
- 【配置映射】—Entity Framework实例详解
前两篇博文中的配置属性和配置关系都是配置映射,配置属性是属性的映射,配置关系式关系的映射,本篇从讲讲实体的映射. 首先,配置实体映射到表,使用ToTable方法,它接受两个参数,第一个参数是表的名称, ...
最新文章
- 华为消息推送 有透传通道吗_华为首款头戴耳机FreeBuds Studio正式发布,能否撑起品牌之名?...
- 机器学习算法基础——逻辑回归
- FOJ Problem 2253 Salty Fish
- ffplay SDL_OpenAudio (2 channels, 44100 Hz): WASAPI can‘t initialize audio client“
- cairosvg在linux中的安装_直接用ISO文件在linux上安装新系统
- JEECG 3.6.5版本发布,企业级JAVA快速开发平台
- bootstrapTable表格分页后,处理逻辑后刷新跳回第一页,没留在当前页的解决办法
- python安装django模块_在您的(Django)项目中使用setup.py
- canvas视频录制
- 树莓派硬件编程——(一)用RPi.GPIO库输出信号
- 电脑取消撤销快捷键是什么_撤销快捷键ctrl加什么
- Firefox,IE5,IE6,IE5.5等浏览器兼容性解决方法
- Python-温度转换
- 接待员如何向客人upsell_前厅部接待员办理入住操作步骤
- WordPress图片模糊问题
- 使用Charles和iPhone进行微信小程序抓包详解
- OpenAI baseline GAIL代码讲解及其可视化
- 了解---研究生发表论文的级别分类
- rk3288 调试dvp摄像头_RK3288 - 双路摄像头的硬件外接实现
- css3实现无限旋转360度
热门文章
- (对比PDF)Adobe Acrobat DC 离线对比PDF、draftable.com/compare 在线对比PDF
- VMD的相关命令(转载)
- ClickHouse最简单的安装方法
- [JOYOI1326] 剑人合一
- [转载]linux+nginx+python+mysql安装文档
- System.IO.Ports.SerialPort串口通信接收完整数据
- ASP.NET - 一般处理程序获取session值
- Bresenham 圆和椭圆的生成算法
- Windows+Python3.7下自动生成requirements.txt文件
- 每日算法系列【LeetCode 556】下一个更大元素 III