GVKun编程网logo

php – 如何处理有错误的Beanstalkd作业(php错误和异常)

17

本篇文章给大家谈谈php–如何处理有错误的Beanstalkd作业,以及php错误和异常的知识点,同时本文还将给你拓展beanstalkd、Beanstalkd使用记录、beanstalkd安装和配置

本篇文章给大家谈谈php – 如何处理有错误的Beanstalkd作业,以及php错误和异常的知识点,同时本文还将给你拓展beanstalkd、Beanstalkd 使用记录、beanstalkd 安装和配置、Beanstalkd 消息队列等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

php – 如何处理有错误的Beanstalkd作业(php错误和异常)

php – 如何处理有错误的Beanstalkd作业(php错误和异常)

当我的Beanstalkd作业出现错误时,如/ var / www / mysite / app中的“异常’ErrorException’,消息’注意:未定义的索引:id /var/www/mysite/app/libraries/lib.PHP第248行’ /libraries/lib.PHP:248,Bulstalkd应该如何知道发生了错误并将其标记为失败,以便再次重试?

解决方法:

为beanstalkd安装一个监视器,这在开发/测试你的应用程序时很有用.一些使用PHP的替代方案:http://mnapoli.github.io/phpBeanstalkdAdmin/和https://github.com/ptrofimov/beanstalk_console

至于处理错误,您可以为beanstalkd作业定义自己的错误处理程序,并在该处理程序中决定是否要:

>埋葬(将工作放在一边供以后检查)
>踢(把它放回队列)
>删除(删除它,如果这对您的应用程序是安全的)

编辑 – 你有没有设法解决你的问题?
最好的方法可能是在您的作业周围使用try / catch来捕获异常,然后在工作者处引发异常时将其埋葬.如果在生产者处引发异常,它可能永远不会被添加到队列中,因此不需要bury(),但是使用监视器来确保.

如果你想尝试为你的对象定义一个自己的错误处理程序,我之前已经为你的类设置了一个自定义错误处理程序.尝试通过$errcontext获取pheanstalk(作业)对象可能是一个丑陋的黑客 – 但可能是尝试的东西..这里有一些伪代码,如果你想尝试它,我会很快拼凑起来(创建一个子类来避免将代码放入pheanstalk类中):

class MyPheanstalk extends Pheanstalk {

    function __construct() {
        //register your custom error_handler for objects of this class
        set_error_handler(array($this, 'myPheanstalk_error_handler'));

        //call parent constructor
        parent::__construct();
    }

    function myPheanstalk_error_handler($errno, $errstr, $errfile, $errline, $errcontext) {
        // get the current job that Failed
        foreach($errcontext as $val) //print_r($errcontext) to find info on the object(job) you are looking for
        {
            if(is_object($val)) {
                if(get_class($val) == 'Pheanstalk') { //and replace with correct class here
                    //optionally check errstr to decide if you want to delete() or kick() instead of bury()
                    $this->bury($val);
                }
            }
        }
    }
}

beanstalkd

beanstalkd

安装:

  1. You need to have the EPEL repo (http://www.servermom.org/2-cents-tip-how-to-enable-epel-repo-on-centos-6-and-5/894/)

  2. yum install beanstalkd

  3. chkconfig beanstalkd on

  4. service beanstalkd start

  5. service beanstalkd status

  6. by default beanstalkd is open for all IPs on the server on port 11300. edit config file at nano /etc/sysconfig/beanstalkd to restrict

  7. fin!

使用:

http://kr.github.io/beanstalkd/ 看官网

Beanstalkd 使用记录

Beanstalkd 使用记录

一、安装

1、官网

https://kr.github.io/beanstalkd/

2、安装

yum install beanstalkd --enablerepo=epel

3、启动

/usr/bin/beanstalkd -l 0.0.0.0 -p 11300 -b /var/lib/beanstalkd/binlog -F

-b 开启binlog,断电后重启会自动恢复任务。

4、配置文件

/etc/sysconfig/beanstalkd

二、基本概念

1、Beanstalkd设计里面的核心概念:

  • job:一个需要异步处理的任务,是 Beanstalkd 中的基本单元,需要放在一个 tube 中。

  • tube:一个有名的任务队列,用来存储统一类型的 job,是 producer 和 consumer 操作的对象。

  • producer:Job 的生产者,通过 put 命令来将一个 job 放到一个 tube 中。

  • consumer:Job的消费者,通过 reserve/release/bury/delete 命令来获取 job 或改变 job 的状态。

2、job 的生命周期

图片描述

当producer直接put一个job时,job就处于READY状态,等待consumer来处理,如果选择延迟put,job就先到DELAYED状态,等待时间过后才迁移到READY状态。consumer获取了当前READY的job后,该job的状态就迁移到RESERVED,这样其他的consumer就不能再操作该job。当consumer完成该job后,可以选择delete, release或者bury操作;delete之后,job从系统消亡,之后不能再获取;release操作可以重新把该job状态迁移回READY(也可以延迟该状态迁移操作),使其他的consumer可以继续获取和执行该job;有意思的是bury操作,可以把该job休眠,等到需要的时候,再将休眠的job kick回READY状态,也可以delete BURIED状态的job。正是有这些有趣的操作和状态,才可以基于此做出很多意思的应用,比如要实现一个循环队列,就可以将RESERVED状态的job休眠掉,等没有READY状态的job时再将BURIED状态的job一次性kick回READY状态。

  • READY - 需要立即处理的任务,当延时 (DELAYED) 任务到期后会自动成为当前任务;

  • DELAYED - 延迟执行的任务, 当消费者处理任务后, 可以用将消息再次放回 DELAYED 队列延迟执行;

  • RESERVED - 已经被消费者获取, 正在执行的任务。Beanstalkd 负责检查任务是否在 TTR(time-to-run) 内完成;

  • BURIED - 保留的任务: 任务不会被执行,也不会消失,除非有人把它 "踢" 回队列;

  • DELETED - 消息被彻底删除。Beanstalkd 不再维持这些消息。

3、一些特性

优先级

任务 (job) 可以有 0~2^32 个优先级, 0 代表最高优先级,默认优先级为1024。

持久化

可以通过binlog将job及其状态记录到文件里面,在Beanstalkd下次启动时可以通过读取binlog来恢复之前的job及状态。

分布式容错

分布式设计和Memcached类似,beanstalkd各个server之间并不知道彼此的存在,都是通过client来实现分布式以及根据tube名称去特定server获取job。

超时控制

为了防止某个consumer长时间占用任务但不能处理的情况,Beanstalkd为reserve操作设置了timeout时间,如果该consumer不能在指定时间内完成job,job将被迁移回READY状态,供其他consumer执行。

三、Client Libraries For PHP

项目地址:https://github.com/pda/pheanstalk/

1、Producer 示例:向队列中添加job

$pheanstalk = new Pheanstalk_Pheanstalk(''127.0.0.1'');

$pheanstalk ->useTube(''tubeName'') ->put($jobData);

2、Consumer 示例:从队列中取出job

$job = $pheanstalk ->watch(''tubeName'') ->ignore(''default'') ->reserve();

echo $job->getData();

$pheanstalk->delete($job);

3、检查服务状态

$isAlive = $pheanstalk->getConnection()->isServiceListening(); //返回 true 或 false

4、获取某一 tube 的数据

try{
    $tubeStatus = $pheanstalk->statsTube(''tubeName'');
} catch (Exception $e){
    if($e->getMessage()==''Server reported NOT_FOUND''){     //tube 不存在
        $current_jobs_ready = 0;
    }
}

四、其他

1、PHP 版控制台

https://github.com/ptrofimov/beanstalk_console

2、Chrome 插件

https://chrome.google.com/webstore/detail/beanstalkd-dashboard/dakkekjnlffnecpmdiamebeooimjnipm

五、参考资料

  1. https://github.com/kr/beanstalkd/wiki/faq

  2. http://csrd.aliapp.com/?p=1201

beanstalkd 安装和配置

beanstalkd 安装和配置

安装
安装以centos为例

yum install beanstalkd

 

配置

使用centos yum安装,通过查看服务脚本发现有这个配置文件

cat /etc/sysconfig/beanstalkd

主要修改几个地方
BEANSTALKD_ADDR=0.0.0.0
BEANSTALKD_PORT=11300
BEANSTALKD_USER=beanstalkd

 

客户端连接问题:

Connection error 113: No route to host

解决办法:防火墙开放对应端口

性能:

$start = microtime(true);
for ($i = 0; $i < 100000; $i ++) {
    $beansClient->useTube(''myAwesomeTube'')->put("哈哈哈job''s payload呵呵呵呵");
}
echo microtime(true) - $start, "\n";

beanstalkd 启动跟停止

启动命令: 
nohup /usr/bin/beanstalkd -l xxx.xxx.xxx.xxx -p 11300 & >> /dev/null 2>&1

正常启动后,利用 【lsof -i:11300】查看 该服务是否正常启动

停止命令:
/etc/init.d/beanstalkd stop

启动:

/etc/init.d/beanstalkd start

正常停止后,利用 【lsof -i:11300】查看 该服务是否正常停止

 

Beanstalkd 消息队列

Beanstalkd 消息队列

 

 

安装beanstalkd与pheanstalk类(不支持windows系统)

 

PHP类pheanstalk

PHP连接测试下类

文件

 

方法分为三类:生产、消费、维护

生产:生产者用到的方法;

消费:消费者用到的方法;

维护:平时用来管理pheanstalk的命令方法。

beanstalkd维护类有以下几种方法

 

beanstalkd生产类的方法(往队列里添加任务的)

 

beanstalkd的消费类

 

 

1、beanstalkd是什么:是一个高性能、轻量级的分布式内存队列

2、常用的队列服务:RabbitMQ、Kafka 3、生产者与消费者模式:

  生产者--》job--》消费者

4、特性:优先级、延迟、持久化、预留、任务超时重发

5、核心元素: 1、管道与任务: 生产者--》管道--》任务--》消费者

6、只支持linux,不支持window:安装beanstalkd与pheanstalk类

7、$pheanstalk=require 'beanstalkd.PHP';

   print_r($pheanstalk->status);

        维护类: stats:当前的状态

                        listTubes:当前的管道

                       statsTube:查看管道详细信息

                       useTube:指定要使用的管道

                       statsJob:任务的详细信息

                       peek:通过id取任务

       生产类:  putInTube:封装的

                       put:没有封装的

       消费类:  watch:设置监听的管道

                       ignore:去掉监听的管道

       reserve:监听阻塞的管道

       listTubesWatched:把监听的管道列出来

       reserveFromTube:把watch和reserve的方法合并起来

       release:重置任务,等下次执行

       bury:封存一个任务,等条件允许了,再消费

      peekBuried:读取预留任务

       kickJob:读取预留任务,变成ready,

      kick:可以输入数值,批量把小于这个值的变为buried--》ready peekReady: peekDelay: pauseTube:管道设置延迟

      resumeTube:取消管道延迟

       touch:让任务重新计算给任务续命的

我们今天的关于php – 如何处理有错误的Beanstalkd作业php错误和异常的分享已经告一段落,感谢您的关注,如果您想了解更多关于beanstalkd、Beanstalkd 使用记录、beanstalkd 安装和配置、Beanstalkd 消息队列的相关信息,请在本站查询。

本文标签: