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

Форум PHP

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

 

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

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

тема: Сброс данных из буфера вывода
 
 автор: udpn   (02.11.2008 в 00:02)   письмо автору
 
 

Есть скрипт с большим временем работы, который выводит несколько строк в секунду. Строки эти не отображаются в браузере пока скрипт не окончит свою работу. Как я догадываюсь PHP буферизирует вывод скрипта. Выброс содержимого буфера происходит также при warning'е и при переполнении буфера. Вопрос: какая команда отвечает за сброс содержимого буфера клиенту?

  Ответить  
 
 автор: Trianon   (02.11.2008 в 00:09)   письмо автору
 
   для: udpn   (02.11.2008 в 00:02)
 

ob_end_flush();
flush();
причем первый прекращает буферизацию

  Ответить  
 
 автор: udpn   (02.11.2008 в 00:27)   письмо автору
 
   для: Trianon   (02.11.2008 в 00:09)
 

Спасибо.

Появился у меня еще один вопрос... Как получать данные из сокета в цикле? Т.е. есть цикл

while ($msg = get_msg($socket)) {
     switch (type_msg($msg)) { ... }
}


При этом get_msg() организована так

function get_msg($socket) {
    static $buf;
    if (strlen($buf) == 0) {
        $val = socket_read($socket, 4096);
        $buf .= $val;
        while (strlen($val) == 4096) {
            $val = socket_read($socket, 4096);
            $buf .= $val;
        }
    }
    list($ret, $buf) = explode("|", $buf, 2);
    return $ret;
}


Как, наверное, уже понятно, оная не работает =)

ps Работаю на благо человечества, пишу PHP клиент для DC++. Испытал уже несколько существующих, они очень бажные. Область для меня новая, поэтому и вопросов появляется немало.

  Ответить  
 
 автор: Trianon   (02.11.2008 в 00:33)   письмо автору
 
   для: udpn   (02.11.2008 в 00:27)
 

Вообще-то от протокола зависит.
Неясно, почему Вы продолжаете цикл только тогда, когда возвращаемый блок размером с буфер.

  Ответить  
 
 автор: udpn   (02.11.2008 в 00:59)   письмо автору
 
   для: Trianon   (02.11.2008 в 00:33)
 

Вот я же и прошу пояснить как именно это надо делать =) Я раньше ниже HTTP не уходил

  Ответить  
 
 автор: Trianon   (02.11.2008 в 01:01)   письмо автору
 
   для: udpn   (02.11.2008 в 00:59)
 

Еще раз. Нужно знакомиться с протоколом. В данном случае - этого самого DC++
Например, я не понял, какой длины данные Вы намерены считать на этом шаге.

  Ответить  
 
 автор: udpn   (02.11.2008 в 01:04)   письмо автору
 
   для: Trianon   (02.11.2008 в 01:01)
 

Данные могут прийти любого размера. К примеру, после отсылки запроса $GetNickList| приходит список всех юзеров, для хаба-виктима это около 1600*50 байт.

Каждое сообщение внутри протокола заканчивается на | (это как \r\n в HTTP)

EDIT: действительно я не очень хорошо понимаю как вообще организована передача данных в самом TCP. Ориентируюсь исключительно на лог событий из SmartSniff'а

EDIT2: для пущей точности сам лог

[01.11.2008 18:09:52:328] Принято
$Lock EXTENDEDPROTOCOL::This_hub_was_written_by_Yoshi::CTRL[...T.] Pk=YnHub|

[01.11.2008 18:09:52:328] Передано
$Supports UserCommand NoGetINFO NoHello UserIP2 TTHSearch ZPipe0 |$Key ........A .....0g/%DCN000%/.....s.q..a!..P../%DCN000%/.....b/%DCN096%/c...5/%DCN000%/.q/%DCN096%/.q..
/+.|$ValidateNick diiin|

[01.11.2008 18:09:52:453] Принято
$Supports NoHello NoGetINFO UserIP2 BotINFO Feed MCTo ZPipe0 |$HubName p2p.powernet|<p2p.powernet> YnHub version: 1.036 produced by Yoshi, Nev and Todi.|..... .......... . p2p.powernet - ............. .... ...... ..........

[01.11.2008 18:09:52:453] Передано
$Version 1,0091|$GetNickList|$MyINFO $ALL diiin [15]StarNet user<StarNetDC++ V:(r358),M:A,H:3/0/0,S:15>$ $100.$$9459142656$|

[01.11.2008 18:09:52:593] Принято
$HubName p2p.powernet - p2p.powernet|$OpList p2p.powernet$$Games-Chat$$PowerNet-Chat$$Soft-Chat$$Video-Chat$$|$MyINFO $ALL p2p.powernet Hub security$ $.$$0$|$MyINFO $ALL Games-Chat [0] users$ $.$$0$|$MyINFO $ALL PowerNet-Chat [0] users$ $.$$0$|$MyINFO $ALL Soft-Chat [0] users$ $.$$0$|$MyINFO $ALL Video-Chat [0] users$ $.$$0$|...

[01.11.2008 18:09:56:046] Передано
$ConnectToMe !!!!GM!!!! 10.1.162.137:2000|

[01.11.2008 18:09:56:343] Принято
il.ru$26550203984$|$MyINFO $ALL RSN [15]........, ...., ......, mp3<FlylinkDC++ V:(r348),M:A,H:4/0/0,S:15>$ $100.$user3756@lancom.pvt$87227246864$|$MyINFO $ALL ruBlick [18]<FlylinkDC++ V:(r298),M:A,H:4/0/0,S:20>$ $10.$$33283392652$|$MyINFO $ALL RURG [29]<FlylinkDC++ V:(r329),M:A,H:4/0/0,S:30>$ $0.005    $$43334012083$|...

  Ответить  
 
 автор: Trianon   (02.11.2008 в 01:34)   письмо автору
 
   для: udpn   (02.11.2008 в 01:04)
 

В таком разе сообщения имеет смысл считывать посимвольно.

Перед данными файлов так или иначе размер передается. Там можно большими блоками.

  Ответить  
 
 автор: udpn   (02.11.2008 в 01:40)   письмо автору
 
   для: Trianon   (02.11.2008 в 01:34)
 

А когда следующий символ не пришел, что будет выводить socket_read? Или будет ждать?

  Ответить  
 
 автор: udpn   (02.11.2008 в 02:14)   письмо автору
 
   для: udpn   (02.11.2008 в 01:40)
 

Ага, на самом деле ничего такого о чем я не знал не происходит, скрипт не работал так как ожидалось только из-за того что

preg_match('/^\$MyINFO \$ALL ([^ ]*) ([^<]*)<([^>]*)>\$ \$([^$]*)\$ \$(\d*)\$|$/', $msg, $m)

вусмерть увешивало PHP

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

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