当我尝试在我的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