Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Вывод данных во время работы скрипта.
 
 автор: noob   (25.07.2008 в 22:33)   письмо автору
 
 

Как сделать так, чтобы данные выводились (через echo () допустим), не когда скрипт целиком останавливается, а постепенно? Т.е., нужен бот, который будет работать,например

while (!feof($fp)) {echo fgets($fp);}

И чтобы он выводил строчки постоянно, по мере их прибывания, не заканчивая свою работу. Как такое можно сделать? С помощью чего.

  Ответить  
 
 автор: Trianon   (25.07.2008 в 22:42)   письмо автору
 
   для: noob   (25.07.2008 в 22:33)
 

попробуйте flush() в цикле.

Гарантии не будет. Отклик может быть буферизован на любом прокси.

  Ответить  
 
 автор: noob   (25.07.2008 в 23:17)   письмо автору
 
   для: Trianon   (25.07.2008 в 22:42)
 

Не совсем понял что это, и врядли это мне поможет...

Вот например

<?
echo "1";
sleep(5);
echo 
"2";
?>


Этот скрипт сначала покажет пустую страницу 5 секунд, потом сразу 12 и остановится. Можно как то сделать, чтобы показал 1, прошло 5 секунд, и показал 2. Но только чтобы без прерывания скрипта. Вот что то наподобие этого мне нужно.

И вообще, как работают чаты? Как работают браузерные ирк клиенты например? Они же выводят информацию по мере ее поступления, при этом скрипт работает без остановки. Я не сильно разбираюсь в пхп, и мне это интересно

  Ответить  
 
 автор: Trianon   (25.07.2008 в 23:29)   письмо автору
 
   для: noob   (25.07.2008 в 23:17)
 

>И вообще, как работают чаты? Как работают браузерные ирк клиенты например?
>Они же выводят информацию по мере ее поступления, при этом скрипт работает без остановки.

От клиента идет запрос идет с некоторой периодичностью.
Серверный скрипт стартует на каждый такой запрос, отрабатывает его, отправляя ответ, и умирает.
Запрос может быть организован JS-средствами.
Обычно такое взаимодействие выполняется с применением технологии AJAX.

  Ответить  
 
 автор: noob   (25.07.2008 в 23:38)   письмо автору
 
   для: Trianon   (25.07.2008 в 23:29)
 

...

Ну не знаю... можт все таки что нибудь есть?))) У меня бот иногда выводит инфу не прерывая работу скрипта, но как то он странно ее выводит, примерно раз в несколько минут.

  Ответить  
 
 автор: FireTiger   (26.07.2008 в 13:47)   письмо автору
 
   для: noob   (25.07.2008 в 23:38)
 

Можно сделать циклические ajax-запросы. Например, если бы мне это нужно было, я бы использовал такое при инсталяции cms, когда скрипт должен выводить установленный модуль в систему. Например, делаем в цикле ajax-запрос, на первой интерации идет форум.. пишем - "форум"... прошло несколько секунд, "форум установлен", следущая итерация... пишем - "галерея"... прошло несколько секунд, "галерея установлена" и т.д. Я это так себе представляю.
PS: Хочу уточнить, а такая схема установки скрипта и "вывода данных во время работы" вообще правильная?

  Ответить  
 
 автор: sim5   (26.07.2008 в 13:54)   письмо автору
 
   для: FireTiger   (26.07.2008 в 13:47)
 

А без AJAX ну прямо никак нельзя сделать установку?

  Ответить  
 
 автор: FireTiger   (26.07.2008 в 13:57)   письмо автору
 
   для: sim5   (26.07.2008 в 13:54)
 

Конечно можно), но а как сделать по-другому вывод во время работы скрипта я не знаю. У Вас есть вариант?

  Ответить  
 
 автор: sim5   (26.07.2008 в 14:08)   письмо автору
 
   для: FireTiger   (26.07.2008 в 13:57)
 

Вот когда устнавливаешь что-то из Эдоб CS3, можно смело идти курить, или просто звезды считать. Что такого "огромадного" в установке CMS? Залили через FTP, жамкнули если надо инсталляцию и что она у вас делать будет? Ну базу создаст, ну подождете вы сек 5-10. Чего там еще инсталлировать, что нужно еще писать ради этого AJAX интерфейс?

  Ответить  
 
 автор: FireTiger   (26.07.2008 в 15:42)   письмо автору
 
   для: sim5   (26.07.2008 в 14:08)
 

А Вы битрикс устанавливали? ))
Там минут 5 все устанавливается, хотя это сильно раздражает, поскольку тоже не ясно, что же все-таки там можно устанавливать... А насчет AJAX установки, это я пример привожу, где можно было использовать вывод во время работы... Я не говорю, что так нужно делать. Или тот же IPB, что они там устанавливают огромного, что минуту ждать надо... Как они делают этот вывод во время работы скрипта я не знаю, но факт в том, что они это используют.

  Ответить  
 
 автор: sim5   (27.07.2008 в 19:46)   письмо автору
 
   для: FireTiger   (26.07.2008 в 15:42)
 

Нет, не устанавливал, но в чужих скриптах, тем более, если "поскольку тоже не ясно, что же все-таки там...", то тем более о каком AJAX может идти речь.

  Ответить  
 
 автор: FireTiger   (27.07.2008 в 19:50)   письмо автору
 
   для: sim5   (27.07.2008 в 19:46)
 

Ладно, давайте закроем этот разговор. Это все впустую ;)

  Ответить  
 
 автор: noob   (26.07.2008 в 16:11)   письмо автору
 
   для: noob   (25.07.2008 в 22:33)
 

Вы куда-то ушли от темы. Повторю вопрос.

Вот например

<?
echo "1";
sleep(5);
echo 
"2";
?>


Если запустить скрипт с консоли будет так:
1. на экран выведется "1";
2. пройдет 5 секунд;
3. на экран выведется "2";
4. скрипт остановится.

Если запустить скрипт через браузер:
1. пройдет 5 секунд;
2. на экране выведется "12";
3. скрипт остановится.

Как сделать чтобы вывод в браузер соответствовал выводу в консоли?

Пример:

есть бот

<?
...
while (!
feof($fp)) {
$str=fgets($fp);
if (
$str) echo $str;
#дальше обрыв соединения
...
?>


В консоли он будет выводить информацию по мере ее поступления. Если открывать через браузер, то информация выводится как то странно, раз в 10 минут примерно. Я не уверен что тут что то можно сделать через ajax, потому что если цикл while() тут обрывается, то обрывается и соединение сервера с ботом.

  Ответить  
 
 автор: Trianon   (26.07.2008 в 16:37)   письмо автору
 
   для: noob   (26.07.2008 в 16:11)
 

<?php
echo '<pre>';
  
$f fopen($_SERVER['DOCUMENT_ROOT'].$_SERVER['PHP_SELF'], 'rb');
  
$x false;
  while(
$s fgets($f))
  {
    
sleep(1);
    echo 
htmlspecialchars($s);
    
flush();
  }
?>

  Ответить  
 
 автор: noob   (26.07.2008 в 16:54)   письмо автору
 
   для: Trianon   (26.07.2008 в 16:37)
 

Скрипт просто работает 11 секунд (по секунде на 1 строчку файла) с белой страницей, потом сразу выводит все и закрывается. Ничего не меняет.

  Ответить  
 
 автор: Trianon   (26.07.2008 в 16:59)   письмо автору
 
   для: noob   (26.07.2008 в 16:54)
 

У меня он выводит строки посекундно.
Но я предупреждал, что гарантии не будет. Буферизировать вывод может кто угодно посредине.

  Ответить  
 
 автор: noob   (26.07.2008 в 17:01)   письмо автору
 
   для: Trianon   (26.07.2008 в 16:59)
 

опа, заработало так:

<?php
echo '<pre>';
  
$f fopen($_SERVER['DOCUMENT_ROOT'].$_SERVER['PHP_SELF'], 'rb');
  
$x false;
  while(
$s fgets($f))
  {

    echo 
htmlspecialchars($s);
    
ob_flush();
    
flush();
    
sleep(1);
  }
?>


т.е. ДО flush() добавил ob_flush(), и sleep поставил после этого всего.

Спасибо!

  Ответить  
 
 автор: FireTiger   (27.07.2008 в 19:20)   письмо автору
 
   для: noob   (26.07.2008 в 17:01)
 

хм... у меня в любом случае скрипт ждет определенное количество секунд, а потом выводит все сразу. Что-то тут не так?

  Ответить  
 
 автор: pav1uxa   (27.07.2008 в 19:22)   письмо автору
 
   для: FireTiger   (27.07.2008 в 19:20)
 

именно этот скрипт пробовал?
<?php
echo '<pre>';
  
$f fopen($_SERVER['DOCUMENT_ROOT'].$_SERVER['PHP_SELF'], 'rb');
  
$x false;
  while(
$s fgets($f))
  {

    echo 
htmlspecialchars($s);
    
ob_flush();
    
flush();
    
sleep(1);
  }
?> 


Попробуй именно символ в символ как тут сделай файл, ничего не меняя. Там я так понял жестоко зависит от того где находятся ob_flush(); и flush();

  Ответить  
 
 автор: FireTiger   (27.07.2008 в 19:36)   письмо автору
 
   для: FireTiger   (27.07.2008 в 19:20)
 

Проверил во всех основных браузерах, не работает в Safari, Opera, IE, а работает только в FireFox. Оба варианта. В чем прикол?

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования