Почему происходит остановка выполнения скрипта на функции fread($fp, 4096)

Статус
В этой теме нельзя размещать новые ответы.

Klen

Новичок
Почему происходит остановка выполнения скрипта на функции fread($fp, 4096)

Имеем такой скрипт:
<?
$fp = fsockopen ("www.google.com", 80, $errno, $errstr, 30);
if (!$fp)
{
echo "$errstr ($errno)<br>\n";
}
else
{
//Посылаем запрос к Google.com
fputs ($fp, "GET /search?hl=en&lr=&q=add&btnG=Search HTTP/1.1\r\n");
fputs ($fp, "Host: www.google.com\r\n");
fputs ($fp, "Connection: Keep-Alive\r\n\r\n");

while ($header = fgets($fp,4096))
{
// пропускаем заголовки
echo $header."<br>";
if($header == "\r\n") { break; }
}

// читаем документ в переменную (здесь и начинаются чудеса)
for($i=1; $i<20; $i++)
{
@$RetrieveFile .= fread($fp, 4096);
echo "__".$i."__";
}
}
?>
Получаем в браузере:
HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/html
Set-Cookie: PREF=ID=5c21f893c3b7fa8a:TM=1148281639:LM=1148281639:S=X2cGakxCnqYjrUB4; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com
Server: GWS/2.1
Transfer-Encoding: chunked
Date: Mon, 22 May 2006 07:07:19 GMT
__1____2____3____4____5____6__

Если в конце заголовков передаем 2 дополнительные пустые строки, т.е.
fputs ($fp, "Connection: Keep-Alive\r\n\r\n\r\n\r\n");
сразу же цикл выполняется до конца
__1____2____3____4____5____6____7____8____9____10____11____12____13____14____15____16____17____18____19__
Что за чудеса? Помогите пожалуйста!PHP4.4.0 Apache - 1.3.34
 

Klen

Новичок
Да нет, flush() не катит, именно остановка на строчке @$RetrieveFile .= fread($fp, 4096);
Скопируйте скрипт и запустите...
 

vasa_c

Новичок
@$RetrieveFile .= fread($fp, 4096);

а "собака" здесь что символизирует?
 

Solid

Drosera anglica
Во первых... Сделай Connection: Close;, вместо Keep-alive.
Во вторых: while(!feof($fp)) { $data .= fread($fp, 1024); }

-~{}~ 22.05.06 15:57:

+ зачем столько fputs? Почему нельзя всё собрать в одну переменную и отослать одним fwrite?
 

Klen

Новичок
Автор оригинала: Solid
Во первых... Сделай Connection: Close;, вместо Keep-alive.
Во вторых: while(!feof($fp)) { $data .= fread($fp, 1024); }

+ зачем столько fputs? Почему нельзя всё собрать в одну переменную и отослать одним fwrite?
Насчет Connection: Close - мне как раз не надо закрывать соединение
Насчет while(!feof($fp)) { $data .= fread($fp, 1024); } у меня поначалу было while(!feof($fp)) { @$RetrieveFile .= fread($fp, 4096); } - потом выясняя причину остановки я поменял цикл на for
Насчет количества fputs - наверное можно, но проблему это не решит
 

Solid

Drosera anglica
Зачем тебе удерживать соединение?

-~{}~ 22.05.06 16:25:

Решается просто:
PHP:
while(!feof($fp)) {
	$data .= fread($fp, 4096);
	if(substr($data, -9)=="\r\n\r\n0\r\n\r\n") {
		exit;
	}
}
Плохо debugИШЬ

-~{}~ 22.05.06 16:38:

PHP:
<?
$fp = fsockopen ("www.php.net", 80, $errno, $errstr, 30);
if(!$fp) {
	echo $errstr;
} else {
	fwrite($fp, "GET / HTTP/1.1\r\nHost: [url]www.php.net\r\nConnection:[/url] Keep-Alive\r\n\r\n");
	$data = '';
	while(!feof($fp)) {
		$data .= fread($fp, 4096);
		if(substr($data, -9)=="\r\n\r\n0\r\n\r\n") {
			break;
		}
	}
}
echo $data;
?>
-~{}~ 22.05.06 16:43:

О вопросе почему...
Застревает на функции fread, потому что пытается считать с сокета информацию... ждёт этой информации, т.к. соединение остаётся открытым.
 

Klen

Новичок
Автор оригинала: Solid
1) fwrite($fp, "GET / HTTP/1.1\r\nHost: www.php.net\r\nConnection: Keep-Alive\r\n\r\n");

О вопросе почему...
2) Застревает на функции fread, потому что пытается считать с сокета информацию... ждёт этой информации, т.к. соединение остаётся открытым.
1) На эту строку ругается -
Parse error: parse error, unexpected T_STRING in z:\home\localhost\www\google\php_net.php on line 6

2) А если после Keep-Alive передать 4 пустые строки, то уже не застревает, "ждёт этой информации," - уже не ждет никого, быстренько работает. :)
 

Фанат

oncle terrible
Команда форума
Тема закрыта. Учитесь пользоваться поиском.

Прежде чем задавать вопрос - используйте поиск по форуму и FAQ:
На нахождение готового ответа на свой вопрос Вы потратите меньше своего и чужого времени, чем на создание новой темы.

Поиск по форуму

http://phpclub.ru/faq/
http://phpclub.ru/detail/
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху