调用调度时,流明会耗尽内存

时间:2018-05-14 11:32:42

标签: php laravel laravel-5 lumen

当我尝试在我的Lumen项目中调用dispatch时出现以下错误:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 262144 bytes) in /var/www/vendor/illuminate/container/Container.php on line 707

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 262144 bytes) in Unknown on line 0

我的第一个想法是将php.ini中的内存限制提升到1G,但是该过程继续耗尽所有应用程序内存,然后抛出上述错误。

在我的控制器内部,我有以下代码片段:

private function attemptCapture(array $options = [])
{
    $response = array_merge(
        [
            'code' => 200,
            'message' => '',
        ],
        []
    );

    dispatch(new ExampleJob());

    return $response;
}

ExampleJob.php

namespace App\Jobs;

use Illuminate\Support\Facades\Log;

class ExampleJob extends Job
{
    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct()
    {
        // dd('got here');  // this gets called
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        Log::info('got here');
    }
}

我在我的queue.php文件中使用默认的Laravel /config/queue.php,我使用redis作为QUEUE_DRIVER,我正在使用default作为QUEUE_REDIS_CONNECTION,我假设将使用我在redis['default']database.php设置的连接

我很困惑为什么这会失败,即使我使用sync驱动程序也得到相同的结果,调度似乎搞砸了

编辑经过一些进一步的实验,似乎当我从控制器调用dispatch(从HTTP路由传递)时,调度将尝试再次调用路由而不是运行工作或将工作推到队列中。

此代码在调度链中调用:

protected function callActionOnArrayBasedRoute($routeInfo)
{
    $action = $routeInfo[1];

    if (isset($action['uses'])) {
        return $this->prepareResponse($this->callControllerAction($routeInfo));
    }

        foreach ($action as $value) {
            if ($value instanceof Closure) {
                $closure = $value->bindTo(new RoutingClosure);
                break;
            }
        }

        try {
            return $this->prepareResponse($this->call($closure, $routeInfo[2]));
        } catch (HttpResponseException $e) {
            return $e->getResponse();
        }
}

其中有array(1) { ["uses"]=> string(52) "App\Http\Controllers\Operator\CaptureController@test" }作为其接收的有效负载。

我不是要发送新的@test动作,我想发送ExampleJob

0 个答案:

没有答案