Привет всем! Подскажите у меня такой вопрос - в некоторых системах мой код работает - в некоторых нет. Подскажите как сделать правильно. Мой вопрос состоит в том что не всегда могу разорвать соединение отпустив пользователя в при запросе который приходит в скрипт. к примеру есть файл test.php я отправляю в него post запрос, хочу ответить пользователю и продолжить ещё выполнение скрипта через таймаут. например Код (PHP): <?php function write_log($text) { $log_file_name = "update_log.txt"; file_put_contents($log_file_name, date('d.m.Y H:i:s')." ".$text.chr(13), FILE_APPEND); echo date('H:i:s')." ".$text.chr(13); } write_log('before'); $str='something'; echo $str; sleep(30); write_log('after'); ?> и код Код (PHP): <?php function write_log($text) { $log_file_name = "update_log.txt"; file_put_contents($log_file_name, date('d.m.Y H:i:s')." ".$text.chr(13), FILE_APPEND); echo date('H:i:s')." ".$text.chr(13); } write_log('before'); $str='something'; while (ob_get_level() > 0) { ob_end_clean(); } ob_start(); echo $str; // Ignore connection-closing by the client/user ignore_user_abort(true); // Get your output and send it to the client $content = ob_get_contents(); // Get the content of the output buffer ob_end_clean(); // Close current output buffer $len = strlen($content); // Get the length header('Connection: close'); // Tell the client to close connection header("Content-Length: $len"); // Close connection after $size characters echo $content; // Output content flush(); // Force php-output-cache to flush to browser. // See caveats below. // Optional: kill all other output buffering while (ob_get_level() > 0) { ob_end_clean();} sleep(30); write_log('after'); ?> в первом коде я отдам ответ в буфер только после выполнения всего кода через 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)): [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
php для таких трюков не очень предназначен. Чтоб работало во всех средах, вторую порцию инфы надо отдавать через ajax, таким образом первая должна передавать в JS какие-то данные, по которым бы вторая могла понять, откуда работать
Скрипт лежит на сервере и не запускается в браузере. Скрипт отвечает на запросы выдавая ответ и запускает другие задачи. Он не используется для вывода в браузер - какой тут js...
Вы перечитайте тему. Вы сначала просили направить на "путь истинный", а потом говорите, что "всё фигня, Вася". Нехорошо использовать php для таких целей. Для этого есть JS. И в вашей частности - AJAX, который через ваши 30 секунд будет обращаться к скрипту PHP и возвращать нужный результат.
Если он не запускается в браузере, то причём здесь Apache и Ngnix? Причём тут заголовки? И как пользователь им пользуется?
Грубо говоря, скрипт используется как слушатель запросов и ответа на запросы - если пришел такой то запрос, то отвечаем то-то и то-то, и если запрос валидный то после ответы мы ещё должны выполнить некоторый код. - но только после ответа. При этом скрипт в браузре не грузится не грузятся какие-то js и прочая визуальная оснастка. просто скрипт отвечает на post запросы. и делает некоторые изменнения в бд и т.п. НО только после ответа. Поэтому вопрос как это сделать на PHP правильно. Прошу ответить по существу вопроса.
Чтобы работа с буферизацией приносила ожидаемый результат, следует отключить стандартную буферизацию вывода в конфигурационном файле. Код (Text): output_buffering = 0;