2

我有一个使用 Laravel 5.1 编写的 Web 应用程序,它在用户请求某个页面或单击按钮时运行脚本。这应该在后台激活脚本。我已经尝试过使用作业和队列。

这是我的代码块:myjob.php

class myjob extends Job implements SelfHandling, ShouldQueue {
use InteractsWithQueue, SerializesModels;

/**
 * Create a new job instance.
 *
 * @return void
 */
public function __construct()
{
    //
}

/**
 * Execute the job.
 *
 * @return void
 */
public function handle()
{
    //
    set_time_limit(0);
    $this->writeJobLogs('Error', 'Start Execution');
    //Job Processing Code
    $this->writeJobLogs('Error', 'End Execution');
}
}

控制器.php

class ManageController extends Controller {
    public function testJob(){
        $this->dispatch(new myjob());
    }
}

作业处理代码预计至少需要 10 分钟才能执行。现在,当我运行代码时,它会引发错误,之后给出如下:

[Symfony\Component\Process\Exception\ProcessTimedOutException] 进程 ""C:\wamp\bin\php\php5.5.12\php.exe" "artisan" queue:work --queue="default" --delay=0 --memory=128 --sleep=3 --tries=0 --env="local"" 超过了 60 秒的超时时间。

& 作业处理代码预计将根据用户请求同时执行多次。所以我怀疑队列是否可以正常工作,或者我还有其他更好的选择。如果是这样,请建议。

4

2 回答 2

1

Laravel 队列不会在后台运行进程,而是让您能够推迟执行直到稍后时间。您的脚本超时,因为它超过了 php.ini 中指定的最大执行时间。

于 2016-03-15T13:23:24.903 回答
0

我想到的第一个解决方案(可能不适合您)是在控制器内部的单独功能上设置日志记录命令,例如。

public function writeLog()
{
    // Do your logging here
}

并对指向这些函数的路由进行 AJAX 调用,例如;

// Laravel Route
Route::get('ajaxDoStuff', 'FooController@writeLog');

// AJAX on Blade Template
$.ajax({
//all the usual stuff for an AJAX call
url: "/ajaxDoStuff"
});

反正我就是这样做的,不确定它是否适合你?

于 2016-03-15T13:48:20.980 回答