что не так в этом многозадачном коде?

warobushek

Новичок
Здравствуйте.
PHP 5.2.12
На основе статьи http://www.ibm.com/developerworks/ru/library/os-php-multitask/index.html написал следующий код. Он не работает.
fwrite в строке
PHP:
$r = fwrite($s, $http_message);
возвращает 0 - т.е. не удается записать ни одного байта в открытый поток.
Почему?... не понятно.


Помогите пожалуйста, найти ответ на этот вопрос.

PHP:
echo "Program starts at ". date('h:i:s') . ".\n";

$srv_host = 'xmltv.s-tv.ru';
$timeout=3;
$result=array();
$sockets=array();
$convenient_read_block=8192;
$images_all = array('897' => '/loadimage.php?program_hash=119421',
 '98'=>'/loadimage.php?program_hash=119422',
 '1034'=>'/loadimage.php?program_hash=119423',);

 /* Выполнить одновременно все запросы; ничего не блокируется. */

foreach ($images_all as $program_hash => $im_url) {
	$s=stream_socket_client("$srv_host:80", $errno,
		  $errstr, $timeout,
		  STREAM_CLIENT_ASYNC_CONNECT|STREAM_CLIENT_CONNECT);

	if ($s) {
		$sockets[$program_hash++]=$s; 
		$http_message="GET $im_url HTTP/1.0\r\nHost: $srv_host\r\n\r\n";
		$r = fwrite($s, $http_message);
		echo false===$r? 'false' : '<br>'.$r.' '.$http_message.' '.print_r($sockets, 1).'  '.'<br>';
	} else {
		echo "Stream " . $program_hash . " failed to open correctly.";
	}

}
print_r($sockets);
while (count($sockets)) {
	$read=$sockets;
	$r = stream_select($read, $w=null, $e=null, $timeout);
	
	
	if (count($read)) {
		/* stream_select обычно перемешивает $read, поэтому мы должны вычислить, 
		   из какого сокета выполняется чтение.  */
		foreach ($read as $r) {
			$program_hash=array_search($r, $sockets); 
			$data=fread($r, $convenient_read_block); 
			/* Сокет можно прочитать либо потому что он
			   имеет данные для чтения, ЛИБО потому что он в состоянии EOF. */
			if (strlen($data) == 0) {
				echo "Stream " . $program_hash . " closes at " . date('h:i:s') . ".\n";
				fclose($r); 
				unset($sockets[$program_hash]); 
			} else { 
				$result[$program_hash] .= $data; 
			} 
		} 
	} else {
		/* Таймаут означает, что *все* потоки не
		   дождались получения ответа. */
		echo "Time-out!\n";
		break;
	}
}
 

warobushek

Новичок
Нашел одну ошибку. Благодаря отладчику PhpEd.
++ лишний стоял.

Но проблема осталась.
Заметил, что при пошаговом прогоне скрипта работает нормально. При моментальном запуске идет time-out.

это означает, что у меня за указанный timeout ни одного байта ни из одного скрипта не успело прочитаться?
 
Сверху