|
|
|
| Как сделать так, чтобы данные выводились (через echo () допустим), не когда скрипт целиком останавливается, а постепенно? Т.е., нужен бот, который будет работать,например
while (!feof($fp)) {echo fgets($fp);}
И чтобы он выводил строчки постоянно, по мере их прибывания, не заканчивая свою работу. Как такое можно сделать? С помощью чего. | |
|
|
|
|
|
|
|
для: noob
(25.07.2008 в 22:33)
| | попробуйте flush() в цикле.
Гарантии не будет. Отклик может быть буферизован на любом прокси. | |
|
|
|
|
|
|
|
для: Trianon
(25.07.2008 в 22:42)
| | Не совсем понял что это, и врядли это мне поможет...
Вот например
<?
echo "1";
sleep(5);
echo "2";
?>
|
Этот скрипт сначала покажет пустую страницу 5 секунд, потом сразу 12 и остановится. Можно как то сделать, чтобы показал 1, прошло 5 секунд, и показал 2. Но только чтобы без прерывания скрипта. Вот что то наподобие этого мне нужно.
И вообще, как работают чаты? Как работают браузерные ирк клиенты например? Они же выводят информацию по мере ее поступления, при этом скрипт работает без остановки. Я не сильно разбираюсь в пхп, и мне это интересно | |
|
|
|
|
|
|
|
для: noob
(25.07.2008 в 23:17)
| | >И вообще, как работают чаты? Как работают браузерные ирк клиенты например?
>Они же выводят информацию по мере ее поступления, при этом скрипт работает без остановки.
От клиента идет запрос идет с некоторой периодичностью.
Серверный скрипт стартует на каждый такой запрос, отрабатывает его, отправляя ответ, и умирает.
Запрос может быть организован JS-средствами.
Обычно такое взаимодействие выполняется с применением технологии AJAX. | |
|
|
|
|
|
|
|
для: Trianon
(25.07.2008 в 23:29)
| | ...
Ну не знаю... можт все таки что нибудь есть?))) У меня бот иногда выводит инфу не прерывая работу скрипта, но как то он странно ее выводит, примерно раз в несколько минут. | |
|
|
|
|
|
|
|
для: noob
(25.07.2008 в 23:38)
| | Можно сделать циклические ajax-запросы. Например, если бы мне это нужно было, я бы использовал такое при инсталяции cms, когда скрипт должен выводить установленный модуль в систему. Например, делаем в цикле ajax-запрос, на первой интерации идет форум.. пишем - "форум"... прошло несколько секунд, "форум установлен", следущая итерация... пишем - "галерея"... прошло несколько секунд, "галерея установлена" и т.д. Я это так себе представляю.
PS: Хочу уточнить, а такая схема установки скрипта и "вывода данных во время работы" вообще правильная? | |
|
|
|
|
|
|
|
для: FireTiger
(26.07.2008 в 13:47)
| | А без AJAX ну прямо никак нельзя сделать установку? | |
|
|
|
|
|
|
|
для: sim5
(26.07.2008 в 13:54)
| | Конечно можно), но а как сделать по-другому вывод во время работы скрипта я не знаю. У Вас есть вариант? | |
|
|
|
|
|
|
|
для: FireTiger
(26.07.2008 в 13:57)
| | Вот когда устнавливаешь что-то из Эдоб CS3, можно смело идти курить, или просто звезды считать. Что такого "огромадного" в установке CMS? Залили через FTP, жамкнули если надо инсталляцию и что она у вас делать будет? Ну базу создаст, ну подождете вы сек 5-10. Чего там еще инсталлировать, что нужно еще писать ради этого AJAX интерфейс? | |
|
|
|
|
|
|
|
для: sim5
(26.07.2008 в 14:08)
| | А Вы битрикс устанавливали? ))
Там минут 5 все устанавливается, хотя это сильно раздражает, поскольку тоже не ясно, что же все-таки там можно устанавливать... А насчет AJAX установки, это я пример привожу, где можно было использовать вывод во время работы... Я не говорю, что так нужно делать. Или тот же IPB, что они там устанавливают огромного, что минуту ждать надо... Как они делают этот вывод во время работы скрипта я не знаю, но факт в том, что они это используют. | |
|
|
|
|
|
|
|
для: FireTiger
(26.07.2008 в 15:42)
| | Нет, не устанавливал, но в чужих скриптах, тем более, если "поскольку тоже не ясно, что же все-таки там...", то тем более о каком AJAX может идти речь. | |
|
|
|
|
|
|
|
для: sim5
(27.07.2008 в 19:46)
| | Ладно, давайте закроем этот разговор. Это все впустую ;) | |
|
|
|
|
|
|
|
для: 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() тут обрывается, то обрывается и соединение сервера с ботом. | |
|
|
|
|
|
|
|
для: 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();
}
?>
|
| |
|
|
|
|
|
|
|
для: Trianon
(26.07.2008 в 16:37)
| | Скрипт просто работает 11 секунд (по секунде на 1 строчку файла) с белой страницей, потом сразу выводит все и закрывается. Ничего не меняет. | |
|
|
|
|
|
|
|
для: noob
(26.07.2008 в 16:54)
| | У меня он выводит строки посекундно.
Но я предупреждал, что гарантии не будет. Буферизировать вывод может кто угодно посредине. | |
|
|
|
|
|
|
|
для: 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 поставил после этого всего.
Спасибо! | |
|
|
|
|
|
|
|
для: noob
(26.07.2008 в 17:01)
| | хм... у меня в любом случае скрипт ждет определенное количество секунд, а потом выводит все сразу. Что-то тут не так? | |
|
|
|
|
|
|
|
для: 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:20)
| | Проверил во всех основных браузерах, не работает в Safari, Opera, IE, а работает только в FireFox. Оба варианта. В чем прикол? | |
|
|
|