За последние 24 часа нас посетили 20327 программистов и 1608 роботов. Сейчас ищут 1902 программиста ...

Вопрос про ответ на post запрос.

Тема в разделе "PHP для новичков", создана пользователем vegarulez_f, 15 июн 2015.

  1. vegarulez_f

    vegarulez_f Новичок

    С нами с:
    16 апр 2015
    Сообщения:
    37
    Симпатии:
    0
    Привет всем! Подскажите у меня такой вопрос - в некоторых системах мой код работает - в некоторых нет. Подскажите как сделать правильно.

    Мой вопрос состоит в том что не всегда могу разорвать соединение отпустив пользователя в при запросе который приходит в скрипт.
    к примеру есть файл test.php
    я отправляю в него post запрос, хочу ответить пользователю и продолжить ещё выполнение скрипта через таймаут.

    например

    Код (PHP):
    1. <?php
    2. function write_log($text)
    3. {
    4.     $log_file_name = "update_log.txt";
    5.     file_put_contents($log_file_name, date('d.m.Y H:i:s')." ".$text.chr(13), FILE_APPEND);
    6.     echo date('H:i:s')." ".$text.chr(13);
    7. }
    8. write_log('before');
    9. $str='something';
    10. echo $str;
    11. sleep(30);
    12. write_log('after');
    13. ?>
    и код

    Код (PHP):
    1. <?php
    2. function write_log($text)
    3. {
    4.     $log_file_name = "update_log.txt";
    5.     file_put_contents($log_file_name, date('d.m.Y H:i:s')." ".$text.chr(13), FILE_APPEND);
    6.     echo date('H:i:s')." ".$text.chr(13);
    7. }
    8. write_log('before');
    9. $str='something';
    10.                 while (ob_get_level() > 0) {
    11.                     ob_end_clean();
    12.                 }
    13.                 ob_start();
    14.                 echo $str;
    15.                 // Ignore connection-closing by the client/user
    16.                 ignore_user_abort(true);
    17.                 // Get your output and send it to the client
    18.                 $content = ob_get_contents();         // Get the content of the output buffer
    19.                 ob_end_clean();                      // Close current output buffer
    20.                 $len = strlen($content);             // Get the length
    21.                 header('Connection: close');         // Tell the client to close connection
    22.                 header("Content-Length: $len");     // Close connection after $size characters
    23.                 echo $content;                       // Output content
    24.                 flush();                             // Force php-output-cache to flush to browser.
    25.                 // See caveats below.
    26.                 // Optional: kill all other output buffering
    27.                 while (ob_get_level() > 0) {
    28.                     ob_end_clean();}
    29. sleep(30);
    30. write_log('after');
    31. ?>
    в первом коде я отдам ответ в буфер только после выполнения всего кода через 30 секунд во втором случае я отдам ответ сразу и через 30 секунд продолжу выполнять свой код.

    Но незадача вот в чём почему-то не везде у меня отрабатывает 2-ой код.

    на тестовой машинке - всё замечательно отрабатывает:
    Apache/2.2.22 (Win32) mod_ssl/2.2.22 OpenSSL/1.0.1c PHP/5.4.38

    а на боевой - не работает - 2-ой код работает как первый:
    PHP 5.6.7-1 (cli),Zend Engine v2.6.0,Zend OPcache v7.0.4-dev,nginx version: nginx/1.2.1

    Не могу понять в чем трабла - почему он не зарубает коннект и не отпускает пользователя не отдает ответ.
    Подскажите или ссылкой поделитесь где про это можно прочесть. И с чем вообще это связано - может именно с какими-то настройками сервера?

    Добавлено спустя 5 минут 32 секунды:
    Может просто я как-то в корне неправильно подхожу к этому. Направьте в сторону правильной парадигмы, чтобы во всех средах правильно отрабатывало.

    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
     
  2. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    вы суть задачи донесите: что хотите сделать. Пока это выглядит как чистка зубов через пятую точку.
     
  3. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.589
    Симпатии:
    1.763
    php для таких трюков не очень предназначен. Чтоб работало во всех средах, вторую порцию инфы надо отдавать через ajax, таким образом первая должна передавать в JS какие-то данные, по которым бы вторая могла понять, откуда работать
     
  4. VaneS

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

    С нами с:
    16 ноя 2011
    Сообщения:
    636
    Симпатии:
    4
    Адрес:
    Россия
    Попробуйте посмотреть тут
     
  5. vegarulez_f

    vegarulez_f Новичок

    С нами с:
    16 апр 2015
    Сообщения:
    37
    Симпатии:
    0
    Скрипт лежит на сервере и не запускается в браузере. Скрипт отвечает на запросы выдавая ответ и запускает другие задачи. Он не используется для вывода в браузер - какой тут js...
     
  6. VaneS

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

    С нами с:
    16 ноя 2011
    Сообщения:
    636
    Симпатии:
    4
    Адрес:
    Россия
    А может тогда ну его этот php?
     
  7. vegarulez_f

    vegarulez_f Новичок

    С нами с:
    16 апр 2015
    Сообщения:
    37
    Симпатии:
    0
    нет нужен именно пхп - вопрос как правильно сделать это на PHP
     
  8. mr.akv

    mr.akv Активный пользователь

    С нами с:
    31 мар 2015
    Сообщения:
    1.604
    Симпатии:
    206
    Вы перечитайте тему. Вы сначала просили направить на "путь истинный", а потом говорите, что "всё фигня, Вася".
    Нехорошо использовать php для таких целей. Для этого есть JS. И в вашей частности - AJAX, который через ваши 30 секунд будет обращаться к скрипту PHP и возвращать нужный результат.
     
  9. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.589
    Симпатии:
    1.763
    Если он не запускается в браузере, то причём здесь Apache и Ngnix? Причём тут заголовки? И как пользователь им пользуется?
     
  10. vegarulez_f

    vegarulez_f Новичок

    С нами с:
    16 апр 2015
    Сообщения:
    37
    Симпатии:
    0
    Грубо говоря, скрипт используется как слушатель запросов и ответа на запросы - если пришел такой то запрос, то отвечаем то-то и то-то, и если запрос валидный то после ответы мы ещё должны выполнить некоторый код. - но только после ответа. При этом скрипт в браузре не грузится не грузятся какие-то js и прочая визуальная оснастка. просто скрипт отвечает на post запросы. и делает некоторые изменнения в бд и т.п. НО только после ответа. Поэтому вопрос как это сделать на PHP правильно. Прошу ответить по существу вопроса.
     
  11. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
  12. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Чтобы работа с буферизацией приносила ожидаемый результат, следует отключить стандартную буферизацию вывода в конфигурационном файле.
    Код (Text):
    1. output_buffering = 0;