запуск фоновой задачи веб-клиентом без потери сеанса - PullRequest
1 голос
/ 20 мая 2019

У меня есть веб-приложение, которое должно запускать ресурсоемкую задачу (функцию), выполнение которой займет некоторое время. Я запускаю эту задачу, вызывая URL;

http://app.domain.com/process_file/@fileid

Однако, как и ожидалось, веб-клиент ожидает завершения задачи (функции). Это может вызвать тайм-ауты.

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

До сих пор я пробовал следующее:

1. JQuery/ajax
2. Redirecting to a _blank page 

NB. У меня нет доступа к crontab или планировщику. Я использую PHP, JavaScript и обезжиренный фреймворк

Ответы [ 2 ]

1 голос
/ 20 мая 2019

Я полагаю, вы ищете функцию abort :

function (Base $f3) {
  // process request and send response to client (could be a redirect status)
  $f3->abort(); // disconnect the client
  // perform consuming task here
}

Это в основном решение, предложенное Павлом Тржупеком, для удобства обернутое в метод.

0 голосов
/ 20 мая 2019

Попробуйте вызвать страницу с помощью curl, как:


$curl = curl_init();                
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt ($curl, CURLOPT_POST, FALSE);
curl_setopt($curl, CURLOPT_TIMEOUT, 1); 
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl,  CURLOPT_RETURNTRANSFER, false);
curl_setopt($curl, CURLOPT_FORBID_REUSE, true);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 1);
curl_setopt($curl, CURLOPT_DNS_CACHE_TIMEOUT, 10); 
curl_setopt($curl, CURLOPT_FRESH_CONNECT, true);
curl_exec($curl);   
curl_close($curl);  

, которая вызывает url и сразу же тайм-аут его.

А затем в вашем дорогом сценарии:

header("Connection: close\r\n");
header("Content-Encoding: none\r\n");
header("Content-Length: 1");
ignore_user_abort(true);
//your code
...