首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有方法将回调作为数据参数传递给Laravel4.2队列::push()

是否有方法将回调作为数据参数传递给Laravel4.2队列::push()
EN

Stack Overflow用户
提问于 2014-09-21 21:07:43
回答 2查看 1.1K关注 0票数 1

我有一些耗时的代码来处理一系列HTTP请求的结果,我想在后台运行这些请求。我正在使用Redis商店来管理队列。以下是我尝试过的:

代码语言:javascript
复制
Queue::push( 'FetchUrls', [
    'urls'     => [ 'http://one.com', 'http://two.com', 'http://three.com' ],
    'complete' => function( $response ) { /* process data returned by URL here */ },
    'error'    => function( $error    ) { /* process HTTP errors here */ },
]);

Redis队列存储中显示的是$data参数的$data序列化:

代码语言:javascript
复制
{
    "job": "FetchUrls",
    "data": { 
        "urls": [
            "http:\/\/one.com",
            "http:\/\/two.com",
            "http:\/\/three.com"
        ],
        "complete": [],
        "error": []
    },
    "id": "aAlkNM0ySLXcczlLYho19TlWYs9hStzl",
    "attempts": 1
}

如您所见,回调只是显示为队列存储中的空数组。我以前从未使用队列类,所以我可能以错误的方式处理这个问题。我想找个解决这个问题的最佳方法。谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-22 04:31:23

您可以传递函数名并使用类似于call_user_func()的内容调用它们。

代码语言:javascript
复制
Queue::push('FetchUrls', [
    'urls'     => ['http://one.com', 'http://two.com', 'http://three.com'],
    'complete' => ['ResponseHandler', 'fetchComplete'],
    'error'    => ['ResponseHandler', 'fetchError'],
]);

class FetchUrls
{
    public function fire($job, $data)
    {
        list($urls, $complete, $error) = $data;

        foreach ($urls as $url) {
            if ($response = $this->fetch($url)) {
                $job->delete();
                call_user_func($complete, $response);
            } else {
                $job->release();
                call_user_func($error, $this->getError());
            }
        }
    }

    private function fetch($url)
    {
        // ...
    }

    private function getError()
    {
        // ...
    }
}

class ResponseHandler
{
    public static function fetchComplete($response)
    {
        // ...
    }

    public static function fetchError($error)
    {
        // ...
    }
}

这种方法有一个非基于类的版本,但这是相对干净的。

call_user_func()为第一个参数的['ResponseHandler', 'fetchComplete']将调用ResponseHandler::fetchComplete()

票数 2
EN

Stack Overflow用户

发布于 2014-09-21 22:00:08

为了安全起见,您应该只推送数组(因为序列化的问题)。

要回答您的问题-没有解决的办法,您应该重新考虑逻辑。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25963881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档