Вернуть ответ клиенту перед запуском события Laravel - PullRequest
0 голосов
/ 21 февраля 2019

Есть ли менее уродливый способ сделать это:

ignore_user_abort(true);
set_time_limit(0);

ob_start();
echo $response; // send the response
header('Connection: close');
header('Content-Length: '.ob_get_length());
ob_end_flush();
ob_flush();
flush();

в Laravel?По сути, мне нужно, чтобы сервер возвратил ответ пользователю перед запуском событий, я не могу сделать это с помощью очереди, потому что есть много вещей, которые будут выполнены, и множество клиентов одновременно выполняют это действие, и эти вещи должны быть выполнены.мгновенно, поэтому они не могут быть выполнены один за другим.События состоят в отправке писем, предупреждений, обновлении данных в таблицах веб-сайтов и т. Д.

1 Ответ

0 голосов
/ 22 февраля 2019

У меня аналогичная потребность в проекте, где я создавал пиксель отслеживания.Я хотел немедленно вернуть им ответ, а затем Ларавел продолжил бежать.Я ставлю это как самое первое, что есть в index.php:

if($_SERVER['REQUEST_URI'] == '/pixel'){
    require "pixel.php";
}

Затем в этом файле (кое-что из этого может не относиться к вам, мне нужно было убедиться, что они не кэшировали его, поэтому он продолжаетзагрузить пиксель:

ignore_user_abort(true);

// turn off gzip compression
if ( function_exists( 'apache_setenv' ) ) {
    apache_setenv( 'no-gzip', 1 );
}

ini_set('zlib.output_compression', 0);

// turn on output buffering if necessary
if (ob_get_level() == 0) {
    ob_start();
}

// removing any content encoding like gzip etc.
header('Content-encoding: none', true);
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    echo ' ';
} else {
    header("Content-type: image/gif");
    header("Content-Length: 42");
    header("Cache-Control: private, no-cache, no-cache=Set-Cookie, proxy-revalidate");
    header("Expires: Wed, 11 Jan 2000 12:59:00 GMT");
    header("Last-Modified: Wed, 11 Jan 2006 12:59:00 GMT");
    header("Pragma: no-cache");

    echo sprintf('%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%',71,73,70,56,57,97,1,0,1,0,128,255,0,192,192,192,0,0,0,33,249,4,1,0,0,0,0,44,0,0,0,0,1,0,1,0,0,2,2,68,1,0,59);
}

// flush all output buffers. No reason to make the user wait for OWA.
ob_flush();
flush();
ob_end_flush();

Вот и все. Теперь Laravel продолжает работать, но браузер пользователя завершил свой запрос. Итак, я добавил маршрут, как обычно, в /pixel и выполнил всеМне нужно было сделать (добавить в базу данных, события пожара и т. Д.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...