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

Тема в разделе "PHP", создана пользователем partner88, 9 июл 2014.

Статус темы:
Закрыта.
Модераторы: latteo
  1. partner88

    partner88 Создатель

    Регистр.:
    2 июл 2014
    Сообщения:
    16
    Симпатии:
    10
    Как с помощью php реализовать такую конструкцию: 2 файла: do.php, ok.php В файле do лежит код, который выполняется, скажем 500 секунд, при этом, я должен открывать файл ok.php, который запускает скрипт в do.php и после этого дает моментальный ответ. Это нужно для того, чтоб при последовательном запросе не ждать 500 секунд каждый запрос, а намного меньше, желательно менее 1 секунды.
     
  2. Juri

    Juri

    Заблокирован
    Регистр.:
    5 окт 2007
    Сообщения:
    1.068
    Симпатии:
    197
    Я вас огорчу... при открытии файла ok ответ от do он получит только после завершения работы do то есть через 500 сек....
    Если хотите организовать некую многопоточность... то почитайте о таких технологиях как ajax который бы при загрузке страницы автоматом бы запустил несколько раз обращение к do
     
  3. CAPAXA

    CAPAXA

    Регистр.:
    7 июн 2007
    Сообщения:
    896
    Симпатии:
    535
    PHP:
    $host СВОЙ_ХОСТ;               
    $http fsockopen$host80$errno$errstr);
    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 );
    }
    Проверено, работает в фоне.
     
    latteo, partner88 и Nei нравится это.
  4. Anu

    Anu Постоялец

    Регистр.:
    19 окт 2007
    Сообщения:
    137
    Симпатии:
    13
    если нужно получить статус работы do.php, вы можете сделать следующее:
    1) создать ф-цию Log(), которая будет в конкретные моменты (когда скрипт выполняет определенные действия) записывать данные о выполнении в лог, соответственно вы будете смотреть лог, чтобы узнать о статусе работы.
    2) если не хочется писать в файл, в Log() можно делать echo() и flush(), чтобы скрипт на экран отображал выполненные действия.

    если нужно просто "много раз" запустить do, можете подгружать его в ok.php например в виде изображения в качестве src параметра тега img или iframe.
     
  5. DonPrus

    DonPrus Писатель

    Регистр.:
    28 июл 2014
    Сообщения:
    9
    Симпатии:
    12
    Как на счёт использования AJAX? Это ведь явно для Вас технология.

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

    В нативном JS:
    if(req.readyState == 4)
    когда запрос получает ответ, тут уже можно выполнять что-либо
    if(req.status == 200)
    запрос закончил выполняться, и приходит ответ из Do.
    В jQuery будет проще формировать и анализировать запросы:
    complete вызывается метод, аналог req.status == 200.
    Вы можете так же воспользоваться функцией beforeSend которая вызывается прямо после нажатия клавиши.
     
    chessman и medbrat3 нравится это.
  6. marshal_zp

    marshal_zp Писатель

    Регистр.:
    5 фев 2014
    Сообщения:
    3
    Симпатии:
    1
    HTML:
    $.get( "СВОЙ_АДРЕС HTTP", function( data ) {
    $( ".result" ).html( data );
    alert( "Результат выполнения в переменной data." );
    });
    Более подробно можешь почитать на http://api.jquery.com/jquery.get/
    Там же есть примеры и для POST запроса.
     
    Последнее редактирование модератором: 14 окт 2014
  7. aurora2000

    aurora2000 Создатель

    Регистр.:
    24 авг 2014
    Сообщения:
    30
    Симпатии:
    3
    есть еще такой вариант:

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

    APXOH Создатель

    Регистр.:
    16 янв 2013
    Сообщения:
    36
    Симпатии:
    6
    Оптимально последний предложенный вариант

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

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

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

    NSMuffin Писатель

    Регистр.:
    9 дек 2013
    Сообщения:
    3
    Симпатии:
    0
    Можете использовать сервер очередей. ok.php будет создавать джоб, который будет запускать do.php
     
  10. roddik

    roddik Колбаска

    Регистр.:
    26 янв 2007
    Сообщения:
    351
    Симпатии:
    285
    Только что проверил, с-но у вас после 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);
    }

    // http://stackoverflow.com/questions/15273570/continue-processing-php-after-sending-http-response
     
    Последнее редактирование модератором: 14 окт 2014
    venetu нравится это.
Статус темы:
Закрыта.