Laravel 5.1 — выполнение PHP-скрипта в фоновом режиме

У меня есть веб-приложение, написанное с использованием Laravel 5.1, которое запускает скрипт, когда пользователь запрашивает определенную страницу или нажимает кнопку. Это должно активировать скрипт в фоновом режиме. Я пробовал это с помощью заданий и очередей.

Вот мой кусок кода: 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" очередь:work --queue="default" --delay=0 --memory=128 --sleep=3 --tries=0 --env="local"" превышено время ожидания 60 секунд.

Ожидается, что код обработки заданий будет выполняться несколько раз одновременно в соответствии с запросами пользователя. Поэтому у меня есть сомнения относительно того, будут ли очереди работать нормально или у меня есть другой лучший выбор. Если это так, пожалуйста, предложите.


person ba1ar    schedule 15.03.2016    source источник


Ответы (2)


Laravel Queue не запускает процессы в фоновом режиме, а дает вам возможность отложить выполнение на более позднее время. Время ожидания вашего скрипта истекло, потому что оно превышает максимальное время выполнения, указанное в вашем php.ini.

person Community    schedule 15.03.2016
comment
Что бы вы предложили, если я хочу запустить процесс в фоновом режиме? - person ba1ar; 15.03.2016
comment
Я считаю, что команды exec или shell_exec — это то, что вы хотите использовать для выполнения PHP-кода в фоновом режиме. См. это: florian.ec/articles/running-background-processes-in- php - person ; 15.03.2016
comment
Вот сообщение SO на эту тему: stackoverflow.com/questions/45953/ - person ; 15.03.2016
comment
Спасибо за быстрый ответ. Эти сообщения показывают, что они используют базовые команды PHP exec и shell exec. Есть ли другой способ сделать это в Laravel? - person ba1ar; 15.03.2016
comment
Не то, чтобы я знал, для этого нужен старый добрый обычный PHP. - person ; 15.03.2016

Первое решение, которое приходит мне на ум (возможно, не идеальное для вас), — это настроить команды ведения журнала для отдельных функций внутри контроллера, например.

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"
});

Я бы так и сделал, не уверен, что это идеально для вас?

person DLMousey    schedule 15.03.2016