编程语言
首页 > 编程语言> > php – 如何处理有错误的Beanstalkd作业

php – 如何处理有错误的Beanstalkd作业

作者:互联网

当我的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);
                }
            }
        }
    }
}

标签:php,queue,laravel,laravel-4,beanstalkd
来源: https://codeday.me/bug/20190529/1178806.html