flush — php продолжает выполнение после ухода со страницы

У меня есть простой скрипт, который рассчитывает от 1 до 5000 с for петля. Он сбрасывает вывод в режиме реального времени в браузер и показывает индикатор выполнения с%.

Что у меня есть: если я покидаю страницу, процесс прерывается. Если я вернусь, он начинается с 0.

Чего я хочу добиться: если я покину страницу, процесс продолжится, и, если я вернусь, он покажет правильный процент.

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

Является ли это возможным?

2

Решение

Я бы предложил вам использовать серверные рабочие — скрипты, которые предназначены для запуска независимо от контекста веб-сервера.

Самый распространенный способ сделать это — использование очередей сообщений (RabbitMQ, Qless и т. Д.). Событие должно инициироваться сценарием в веб-контексте, но фактическая задача должна выполняться слушателем очереди в другом контексте.

5

Другие решения

То, что вы спросили, кажется, довольно просто сделать с сеансом. (Чисто исходя из приведенного варианта использования). Это не запуск какого-либо процесса в фоновом режиме, он просто отслеживает время и показывает прогресс. Вот почему я сказал «на основании того, что вы спросили». Если вы хотите отслеживать какие-либо реальные фоновые задачи, то я считаю, что ситуация будет совершенно другой, и вам придется изменить формулировки вашего вопроса;)

Нечто подобное сделало бы.

<?php
session_start();
$s = &$_SESSION;

$sleep = 1; //seconds

//check if we have a value set in session before, if not set default = 0.
if(!isset($s['last'])){
$s['last'] = 0;
}

//check if we have a last time set in session before. if not set a default = curret time.
if(!isset($s['time'])){
$s['time'] = time();
}

//get the idle time of the user.
$idle = time() - $s['time'];

//start the loop..and set starting point.
$start = $s['last'] + ($idle / $sleep);

for( $i = $start; $i < 100; $i++){
echo $i . '<br />';
$s['last']++;
$s['time'] = time();
flush();
sleep($sleep);
}

Надеюсь, поможет!!

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector