GET Запрос на долгоработающий скрипт, но моментальный ответ сервера

Статус
В этой теме нельзя размещать новые ответы.

partner88

Создатель
Регистрация
2 Июл 2014
Сообщения
15
Реакции
13
Как с помощью php реализовать такую конструкцию: 2 файла: do.php, ok.php В файле do лежит код, который выполняется, скажем 500 секунд, при этом, я должен открывать файл ok.php, который запускает скрипт в do.php и после этого дает моментальный ответ. Это нужно для того, чтоб при последовательном запросе не ждать 500 секунд каждый запрос, а намного меньше, желательно менее 1 секунды.
 
  • Заблокирован
  • #2
Я вас огорчу... при открытии файла ok ответ от do он получит только после завершения работы do то есть через 500 сек....
Если хотите организовать некую многопоточность... то почитайте о таких технологиях как ajax который бы при загрузке страницы автоматом бы запустил несколько раз обращение к do
 
PHP:
$host = СВОЙ_ХОСТ;               
$http = fsockopen( $host, 80, $errno, $errstr, 1 );
if ( $http )
{
fputs( $http, "GET /СВОЙ_АДРЕС HTTP/1.0\r\n" );
fputs( $http, "Accept: */*\r\n" );
fputs( $http, "Host: " . $host . "\r\n" );
fputs( $http, "\r\n" );
fclose( $http );
}
Проверено, работает в фоне.
 
если нужно получить статус работы do.php, вы можете сделать следующее:
1) создать ф-цию Log(), которая будет в конкретные моменты (когда скрипт выполняет определенные действия) записывать данные о выполнении в лог, соответственно вы будете смотреть лог, чтобы узнать о статусе работы.
2) если не хочется писать в файл, в Log() можно делать echo() и flush(), чтобы скрипт на экран отображал выполненные действия.

если нужно просто "много раз" запустить do, можете подгружать его в ok.php например в виде изображения в качестве src параметра тега img или iframe.
 
Как на счёт использования AJAX? Это ведь явно для Вас технология.

Отправляете запрос, и смотрите ответы. При этом можете чётко контролировать в какой момент.

В нативном JS:
if(req.readyState == 4)
когда запрос получает ответ, тут уже можно выполнять что-либо
if(req.status == 200)
запрос закончил выполняться, и приходит ответ из Do.
В jQuery будет проще формировать и анализировать запросы:
complete вызывается метод, аналог req.status == 200.
Вы можете так же воспользоваться функцией beforeSend которая вызывается прямо после нажатия клавиши.
 
HTML:
$.get( "СВОЙ_АДРЕС HTTP", function( data ) {
$( ".result" ).html( data );
alert( "Результат выполнения в переменной data." );
});
Более подробно можешь почитать на Для просмотра ссылки Войди или Зарегистрируйся
Там же есть примеры и для POST запроса.
 
Последнее редактирование модератором:
есть еще такой вариант:

дергаете do.php он пишет в файлик do.action 1
на cron ежеминутно запускается скрипт - который проверяет файл do.action, если в нем записано 1- он начинает вычисления - которые уже в фоне могут выполняться сколько угодно - как настроете, а результат записывает в do.result, а в do.action записывает 0
дергаете ok.php если в do.result что то есть (он не пустой) то выводите его содержимое в ответ и обнуляет этот файл. если в do.result пусто - скрипт выводит допустим в ответ "not done, please wait"
 
Оптимально последний предложенный вариант

ставьте в крон скрипт do.php ежеминутно, обязательно добавьте в него проверку количества запущенных экземпляров, иначе можете завалить сервер большим количеством одновременно запущенных do.php.

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

результаты выполнения пишете в таблицу или файл, а при запуске ok.php берем результаты оттуда. Данные отображаются моментально, время последнего апдейта записано рядом
 
Можете использовать сервер очередей. ok.php будет создавать джоб, который будет запускать do.php
 
Только что проверил, с-но у вас после flush будет инклуд второго файла

PHP:
<?php

ignore_user_abort(true);
set_time_limit(0);

$response = "good bye";
echo $response;
header('Connection: close');
header('Content-Length: '.strlen($response));
ob_end_flush();
flush();

for ($i = 0; $i < 60; $i++) {
   file_put_contents('/tmp/times2', time()."\n", FILE_APPEND);
   sleep(1);
}


// Для просмотра ссылки Войди или Зарегистрируйся
 
Последнее редактирование модератором:
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху