|
|
|
| Есть скрипт с большим временем работы, который выводит несколько строк в секунду. Строки эти не отображаются в браузере пока скрипт не окончит свою работу. Как я догадываюсь PHP буферизирует вывод скрипта. Выброс содержимого буфера происходит также при warning'е и при переполнении буфера. Вопрос: какая команда отвечает за сброс содержимого буфера клиенту? | |
|
|
|
|
|
|
|
для: udpn
(02.11.2008 в 00:02)
| | ob_end_flush();
flush();
причем первый прекращает буферизацию | |
|
|
|
|
|
|
|
для: 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++. Испытал уже несколько существующих, они очень бажные. Область для меня новая, поэтому и вопросов появляется немало. | |
|
|
|
|
|
|
|
для: udpn
(02.11.2008 в 00:27)
| | Вообще-то от протокола зависит.
Неясно, почему Вы продолжаете цикл только тогда, когда возвращаемый блок размером с буфер. | |
|
|
|
|
|
|
|
для: Trianon
(02.11.2008 в 00:33)
| | Вот я же и прошу пояснить как именно это надо делать =) Я раньше ниже HTTP не уходил | |
|
|
|
|
|
|
|
для: udpn
(02.11.2008 в 00:59)
| | Еще раз. Нужно знакомиться с протоколом. В данном случае - этого самого DC++
Например, я не понял, какой длины данные Вы намерены считать на этом шаге. | |
|
|
|
|
|
|
|
для: 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$|...
|
| |
|
|
|
|
|
|
|
для: udpn
(02.11.2008 в 01:04)
| | В таком разе сообщения имеет смысл считывать посимвольно.
Перед данными файлов так или иначе размер передается. Там можно большими блоками. | |
|
|
|
|
|
|
|
для: Trianon
(02.11.2008 в 01:34)
| | А когда следующий символ не пришел, что будет выводить socket_read? Или будет ждать? | |
|
|
|
|
|
|
|
для: udpn
(02.11.2008 в 01:40)
| | Ага, на самом деле ничего такого о чем я не знал не происходит, скрипт не работал так как ожидалось только из-за того что
preg_match('/^\$MyINFO \$ALL ([^ ]*) ([^<]*)<([^>]*)>\$ \$([^$]*)\$ \$(\d*)\$|$/', $msg, $m)
вусмерть увешивало PHP | |
|
|
|