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

Форум PHP

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

 

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

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

тема: Как сделать вывод содержимого в браузер сразу, до завершения выполнения всего скрипта?
 
 автор: JIEXA   (12.07.2005 в 23:04)   письмо автору
 
 

Вот хочу, чтобы было типа так:
<?
print "lol";
sleep(5);
print "lol";
sleep(5);
print "lol";
?>
тоесть напилось lol и вывилось в браузер потом ещё раз lol и вывилось в браузер.
Ещё один ньюанс, у меня до выполнения скрипта прописано ob_start();

   
 
 автор: Киналь   (13.07.2005 в 00:42)   письмо автору
 
   для: JIEXA   (12.07.2005 в 23:04)
 

Если не ошибаюсь, через 15 секунд появиться

lol
lol
lol

   
 
 автор: cheops   (13.07.2005 в 00:51)   письмо автору
 
   для: JIEXA   (12.07.2005 в 23:04)
 

А если явно потребовать очистить буффер при помощи функции ob_flush()?
<?
print "lol";
ob_flush();
sleep(5);
print 
"lol";
ob_flush();
sleep(5);
print 
"lol";
ob_flush();
?>

   
 
 автор: JIEXA   (13.07.2005 в 19:15)   письмо автору
 
   для: cheops   (13.07.2005 в 00:51)
 

Неа неполучается :(. У меня скрипт через сокеты, отправляет данные методом пост, на различные сайты, их более 20. И вот он очень долго выполняется, а потом в браузере пишет "Страница не найдена на сервере". Поэтому я хотел сделать, чтобы выводилось в браузер сразу, после отсылки на сайт.
А кстати, что сакеты очень долго работают? Я просто дома, когда тестил скрипт, отправлял данные, так вот они отправлялись где-то секунд 20. Хотя запускал на локалхосте, и отправлял на локалхост. Как скрипт рассылщик, использовал пример cheops'a(тобешь ваш). Вот кстати он сам:
<?
set_time_limit
(0);
@
ignore_user_abort(true);
ob_flush();
print 
"отправка начита!";
ob_flush(); 
#####################
# Список сайтов #
#####################
$submitter[] = "mysite1.ru";
$submitter[] = "mysite2.ru";
$submitter[] = "mysite3.ru";
#############
# Настройки #
#############
$_POST['sname'] = "Инфомационно-развлекательный портал";        # Название сайта
$_POST['surl'] = "http://www.otvali.ru";     # URL сайта
$_POST['email'] = "support@otvali.ru";   # E-Mail

$title[] = "Информация 1";
$url[]   = "Ссыклка на инф. 1";
$title[] = "Информация 2";
$url[]   = "Ссыклка на инф. 2";
$title[] = "Информация 3";
$url[]   = "Ссыклка на инф. 3";

print 
"<ul>";
for(
$y=0$y<count($submitter); $y++) 

  
$hostname $submitter[$y]; 
  
$path "/submit.php"// Аккуратнее с именами и путями 
  
$line ""
  
// Устанавливаем соединение, имя которого 
  // передано в параметре $hostname 
  
$fp fsockopen($hostname80$errno$errstr30); 
  
// Проверяем успешность установки соединения 
  
if (!$fp) print "<li>Ошибка при отсылки на http://".$hostname."/...</li><br />\n"
  else 
  { 
      
$data "";
    
// Данные HTTP-запроса
    
for($i=0$i<count($title); $i++)
    {
        
$data .= "title[]=".urlencode($title[$i])."&url[]=".urlencode($url[$i])."&";
    }
    
$data .= "sname=".urlencode($_POST['sname'])."&surl=".urlencode($_POST['surl'])."&email=".urlencode($_POST['email'])."\r\n\r\n"
    
// Заголовок HTTP-запроса 
    
$headers "POST $path HTTP/1.1\r\n"
    
$headers .= "Host: $hostname\r\n"
    
$headers .= "Content-type: application/x-www-form-urlencoded\r\n"
    
$headers .= "Content-Length: ".strlen($data)."\r\n\r\n"
    
// Отправляем HTTP-запрос серверу 
    
fwrite($fp$headers.$data); 
    
// Получаем ответ
    
$i="0"
    while (!
feof($fp)) 
    {
      
$i++; 
      
$line .= fgets($fp1024); 
    }
    print 
$i
    
fclose($fp);
    print 
"<li>На сайт http://".$hostname."/ инфа отправлена...</li>";
    
ob_flush(); 
  } 
}
print 
"</ul>";
print 
"Вся инфа отправлена!"
?> 


Может у меня где-то ошибка в скрипте?

   
 
 автор: glsv (Дизайнер)   (14.07.2005 в 10:40)   письмо автору
 
   для: JIEXA   (12.07.2005 в 23:04)
 

Эксперименты показали, что сервер отдает данные порциями, после превышения определенного количества килобайтов.
У меня на локальной машине эта порция равно около 30 кБ. Т.е. если данных для вывода в браузер накопилось более 30 Кб, то они отправляются клиенту, а php-скрипт продолжает выполнение. Если данных меньше, то данные отправляются только после того, как скрипт полностью завершит свою работу.

Принудительная отправка данных с помощью ob_flush() не помогла. Все равно отправляет порциями.

   
 
 автор: cheops   (14.07.2005 в 12:48)   письмо автору
 
   для: glsv (Дизайнер)   (14.07.2005 в 10:40)
 

Есть такое дело... помоему где-то даже можно настроить порог, после которого Apache отсылает данные...

   
 
 автор: JIEXA   (14.07.2005 в 19:36)   письмо автору
 
   для: glsv (Дизайнер)   (14.07.2005 в 10:40)
 

а почему тогда пишет, что страница не найдена и так долго происходит отправка?

   
 
 автор: isset   (14.07.2005 в 19:47)   письмо автору
 
   для: JIEXA   (14.07.2005 в 19:36)
 

Вместо ob_flush() попробуй flush()

   
 
 автор: JIEXA   (14.07.2005 в 20:34)   письмо автору
 
   для: isset   (14.07.2005 в 19:47)
 

Неполучается... долго долго грузит и пишет что страница не найдена :(

   
 
 автор: JIEXA   (14.07.2005 в 20:38)   письмо автору
 
   для: JIEXA   (14.07.2005 в 20:34)
 

закомментировал этот кусок кода
<?
for($y=0$y<count($submitter); $y++) 

  
$hostname $submitter[$y]; 
  
$path "/submit.php"// Аккуратнее с именами и путями 
  
$line ""
  
// Устанавливаем соединение, имя которого 
  // передано в параметре $hostname 
  
$fp fsockopen($hostname80$errno$errstr30); 
  
// Проверяем успешность установки соединения 
  
if (!$fp) print "<li>Ошибка при отсылки на http://".$hostname."/...</li><br />\n"
  else 
  { 
      
$data ""
    
// Данные HTTP-запроса 
    
for($i=0$i<count($title); $i++) 
    { 
        
$data .= "title[]=".urlencode($title[$i])."&url[]=".urlencode($url[$i])."&"
    } 
    
$data .= "sname=".urlencode($_POST['sname'])."&surl=".urlencode($_POST['surl'])."&email=".urlencode($_POST['email'])."\r\n\r\n"
    
// Заголовок HTTP-запроса 
    
$headers "POST $path HTTP/1.1\r\n"
    
$headers .= "Host: $hostname\r\n"
    
$headers .= "Content-type: application/x-www-form-urlencoded\r\n"
    
$headers .= "Content-Length: ".strlen($data)."\r\n\r\n"
    
// Отправляем HTTP-запрос серверу 
    
fwrite($fp$headers.$data); 
    
// Получаем ответ 
    
while (!feof($fp)) 
    { 
      
$line .= fgets($fp1024); 
    } 
    
fclose($fp); 
    print 
"<li>На сайт http://".$hostname."/ инфа отправлена...</li>"
    
ob_flush(); 
  } 

?>

и тогда браузер мгновенно вводит любой текст, но сами понимаете этот кусок кода самый важный и он что-то глючит :(

   
 
 автор: JIEXA   (15.07.2005 в 07:11)   письмо автору
 
   для: JIEXA   (14.07.2005 в 20:38)
 


$line .= fgets($fp, 1024);
меняем на

     $i++;
 $line .= fgets($fp, 1024);
if ($i>5) break;

и все летает! респект isset'y!

   
 
 автор: RV   (15.07.2005 в 14:34)   письмо автору
 
   для: JIEXA   (15.07.2005 в 07:11)
 

а подскажите как содержимое файла (текст) затолкать в этот самый буфер?

   
 
 автор: cheops   (15.07.2005 в 15:42)   письмо автору
 
   для: RV   (15.07.2005 в 14:34)
 

Для этого содержимое файла следует поместить в переменную и отправить в окно браузера при помощи конструкции echo http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=3966

   
Rambler's Top100
вверх

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