Странности do while

kode

never knows best
Странности do while

Есть код:

Код:
[PHP]
public function readAll(){
	$data = "";
	$buffer = "";

	do{
		$buffer = $this->read();
		$data .= $buffer;
	}while(!$buffer);
		
	return $data;
}
[/PHP]
Но отрабатыват он странно: сначала всё нормально работает, но потом подвисает, посему добавил после $data .= $buffer var_dump($buffer);

и выводит он вот что:

Код:
.....(очень много раз string(0) "")
string(0) ""
string(0) ""
string(0) ""
string(0) ""
string(0) ""
string(0) ""
string(0) ""
string(0) ""
string(0) ""
string(0) ""
string(0) ""
string(0) ""
string(0) ""
PS/Класс в котором это всё находится наследует класс-фасад socket
 

kode

never knows best
В общем проблему через select() решил, но блин шозанах?

-~{}~ 22.01.08 14:07:

через empty() тоже самое
 

zerkms

TDD infected
Команда форума
PHP:
while ($buffer = $this->read()) {
    $data .= $buffer;
}
-~{}~ 22.01.08 21:11:

но блин шозанах?
код работает так, как и ожидается, странно что ты ожидаешь от него чего-то иного
 

kode

never knows best
PHP:
while ($buffer = $this->read()) { 
    $data .= $buffer; 
}
это был изначальный вариант :)

Дело в том что read блокирует пока не появляются данные или ошибка....

PHP:
public function read($length=1024,$type=PHP_BINARY_READ){
	$data = socket_read($this->socket,$length,$type);
	if($data === false){
		throw new Exception($this->getError());
	}
	return $data;
}
 

zerkms

TDD infected
Команда форума
Дело в том что read блокирует пока не появляются данные или ошибка....
вполне нормальной практикой является описание проблемы, а не приведение кода...
твой код можно трактовать так:

инициализировали переменную, открыли цикл, который повторяется до тех пор, пока $this->read вернёт не (bool)false

и что тут работает не так как ты хочешь?
ps: хочу напомнить, что ты так же не озвучил - и чего ты хочешь
 

kode

never knows best
.

Окей, озвучу: почему (bool) string(0) "" якобы возвращает true....
 

kode

never knows best
чёто меня сглючило чтоли....ну в общем всем спасибо, всем пока :) через recv прекрасно работает :p
 
Сверху