За последние 24 часа нас посетили 62102 программиста и 1781 робот. Сейчас ищут 820 программистов ...

Дисконнект без завершения выполнения скрипта

Тема в разделе "Прочие вопросы по PHP", создана пользователем engager, 21 янв 2009.

  1. engager

    engager Активный пользователь

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    Здравствуйте.
    Хочу сделать следующее.
    Скрипт обрабатывает пользовательский запрос, отписывает в респонс результат в виде хтмл, отключается, но не завершается, чтоб не задерживать пользователя. После этого нужно некую аналитику в базе провести. То есть возможно ли такое, что пользователю отдали все, что хотели, закрыли хттп-коннекцию, но скрипт после этого еще некоторое время работает?
    Насколько я понимаю, функции exit() и die() сливают буферы, закрывают коннекцию и завершают скрипт.
     
  2. Такое можно только при работе php через php-fpm
     
  3. engager

    engager Активный пользователь

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    флоппик
    а подробнее? я ставил php-fpm на на виндоус. а на юниксовых хостингах что принято ставить?
     
  4. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
  5. Врешь ты все. ) Нет у него версии под вин.
     
  6. armadillo, там кстати от версии к версии бывало странное поведение - например, некоторые обьекты уничтожались ДО вызова этой функции. В общем, странная она была.
     
  7. engager

    engager Активный пользователь

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    да, уничтожение объектов - это неприятно :D .
    но хотя бы глобальные переменные остаются доступны в этой функции?
     
  8. Я говорю - это бывало в некоторых версиях ПХП. Закономерности я тогда не нашел. Возможно, сейчас все работает корректно
     
  9. engager

    engager Активный пользователь

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    Ага, и вправду вру))
    Перепутал с просто FastCGI
     
  10. engager

    engager Активный пользователь

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    зарегистрированная функция shutdown выполняется при живой хттп-коннекции (внутри шутдаун-функции все написанное функцией echo попадает в респонс)
    как разорвать коннекцию, но остаться внутри скрипта?
     
  11. nimistar

    nimistar Активный пользователь

    С нами с:
    30 май 2007
    Сообщения:
    919
    Симпатии:
    0
    откуда ты это взял ??

    вот что написанно в ссылке флопика
     
  12. engager

    engager Активный пользователь

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    может я что не так делаю?
    в начале скрипта регистрирую коллбэк.
    для проверки внутри этого коллбэка сделал вызов эхо() и увидел в пришедшем хтмл эти слова.
     
  13. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    к сожалению, сейчас оно вызывается до сброса буфера. пример:
    PHP:
    1. <?php
    2. class TEST {
    3.     function TEST() {
    4.         echo __METHOD__ . "<br/>\n";
    5.         register_shutdown_function(array($this, "shutdown_static"), "inside");
    6.         register_shutdown_function(array($this, "shutdown_public"), "inside");
    7.     }
    8.     public function shutdown_public( $param ) {
    9.         echo __METHOD__ . ":param = $param <br/>\n";
    10.     }
    11.     static function shutdown_static( $param ) {
    12.         echo __METHOD__ . ":param = $param <br/>\n";
    13. sleep(10);
    14.     }
    15. }
    16.  
    17.   ob_start("ob_gzhandler", 9);
    18.  
    19.  
    20. $test = new TEST();
    21. register_shutdown_function(array("TEST","shutdown_static"), "outside");
    22. register_shutdown_function(array($test,"shutdown_public"), "outside");
    23. die("DYING BUT NOT DEAD<br/>\n");
    24. echo "NOTE: shutdown methods called after exit() and even die() <br/>\n";
    25. ?>
    то есть ее нельзя использовать для сокращения времени загрузки страницы и отложенных действий.
    придется самому реализовывать этот функционал в своем module.php
     
  14. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    о как, у меня при наличии die/exit эти функции дают вывод, при нормальном завершении - не дают вывода.
    но вывод все равно тормозится до их завершения