Выполнение запросов паралельно али последовательно ?

Voyager2K

Новичок
Выполнение запросов паралельно али последовательно ?

Допустим , есть :

$link = 'http://www.somesite.ru/page.php';
for ($i=0;$i<10;$i++)
{
$f = file_get_contents($link);
//далее обрабатываем $f, получаем некии данные и формируем новый $link
}

То есть, тут я описал что-то типа паука, что будет лазить по сайту www.somesite.ru

А если есть необходимость паралельно запустить такого "паука" на 5,10 и более сайтов ? Банально повторить этот участок кода - производительности не даст. Сначала паук пройдет по одному сайту, а потоv примется за следующий. А нужно дабы притормозки на одной ветки(сайте) не вызывали простойки скрипта и независимо обрабатывалось "лазание" по другим сайтам. То есть паралельное независимое лазание нужно. Как такое реализовать ?

PS. Запуски из шелла/крона не рассматриваю тут, ибо цель выолнить вышеописанные действия поосле обычного запроса некой страницы /index.php
 

chisto_tolyan

Враг народа
воровать контент конечно нехорошо, но а вообще попробуй system() с выводом в файл, если хостер не запрещает)
 

Vallar_ultra

Любитель выпить :)
А вот еслти запрещает - то почитатай про многопоточность в PHP:
http://www.umaxforum.com/topic/3/5835/
 

Voyager2K

Новичок
воровать контент конечно нехорошо, но а вообще попробуй system() с выводом в файл, если хостер не запрещает)
В большинстве случаев system() не прокатит, увы, а хочеться нечто более универсальное. А контент я воровать не собираюсь... я просто пример с паучком привел такой. У меня просто цель паралельно пройтись по 4-7 сайтам с глубиной в 10-20 страниц.... думаю уже можно догадаться что хАчу реализовать я. =)

Как узнать доступна ли многопоточность, али при сборки PHP ее "забыли" установить ?
А то пишу простую строку <? $pid = pcntl_fork(); ?> , а в ответ мне ФИГ.... на знает такого. Какой выход ? Забить на многопоточность Process Control'а и реализовывать все через сокеты, к примеру ?
 

AnToXa

prodigy-одаренный ребенок
1. нету там многопоточности, НЕТУ. процессы там, а не потоки.
2. [m]socket_select[/m] и неблокирующие сокеты.
 

Voyager2K

Новичок
socket_select - сейчас гляну что за зверь.

pcntl_fork() - работает только из консоли
мм... это как ? не понял что значит из консоли, когда на php.net примеры из php-скрипта.

PS. Врот успеть бы до завтра решить проблему - супер было бы. Ибо уезжаю на недельку...
 

AnToXa

prodigy-одаренный ребенок
мм... это как ? не понял что значит из консоли, когда на php.net примеры из php-скрипта.
в документации написано:
you have to compile the CGI or CLI version of PHP.
 

Voyager2K

Новичок
Там, в вышеприведенном абзаце , как я п онимаю, говорится о неустановленности Process Control по умолчанию и необходимости(для его установки) добавить параметр --enable-pcntl при сборки PHP. Но ничего не сказано о использовании функции pcntl_fork() А компиляция CGI-версии(о кот. там шла речь) пхп есть ни что ниое как привычный способ интерпритации пхп-кода.

Возможно, я не так все понимаю, что скорее всего и есть. Прошу прояснить ситуацию....
 

Alexandre

PHPПенсионер
многопоточного паука писать на Си надо (не так уж это и сложно) и запускать из консоли или из скрипта system() или popen()

хотя: socket_select вполне подходящий вариант
 

AnToXa

prodigy-одаренный ребенок
многопоточного паука писать на Си надо
про многопоточность здесь никто задачу не ставил, ставилась задача про параллельную обработку, многопоточность - просто способ.
на C его писать совсем не обязательно, можно на C++ :))
 

WMix

герр M:)ller
Партнер клуба
если позволят то подарю прогу

PHP:
/* ***************************************************************************
   Класс Броузер                        _    _  __  __  __  _  _     ___  ___ 
   Версия 1.0                          ( \/\/ )(  \/  )(  )( \/ )   (   \(  _)
                                        \    /  )    (  )(  )  (  _  ) ) )) _)
   - HTTP соеденение                     \/\/  (_/\/\_)(__)(_/\_)(_)(___/(___)
   - GET запросы
   - Возврашение Заголовка и Документа
*************************************************************************** */

class Browser{
//****************************************************************************

	var $userAgent = "wmix.browser.class.php v1.0";
	var $conn_id;
	var $header = array();
	var $content = "";
	
	
//****************************************************************************

	function Browser( $host, $port, $path ){
		$this->conn_id = fsockopen( $host, $port );
		fputs( $this->conn_id, 
			"GET ".$path." HTTP/1.0\r\n".
			"User-Agent: ".$this->userAgent." \r\n".
			"Host: ".$host."\r\n".
			"Connection: Close\r\n\r\n"
		);
	}

//****************************************************************************

	function getHeader(){
		if( !$this->header ){
			$line = fgets( $this->conn_id, 128 );
			$this->header["status"] = $line;
			while( !feof( $this->conn_id ) ){
				$line = fgets ( $this->conn_id, 128 );
				if( $line == "\r\n"){
					return $this->header;
				}
				$data = explode( ": ",$line );
				$this->header[ $data[0] ] = $data[1];
			}
		}
		return $this->header;
	}

//****************************************************************************

	function getContent(){
		if( !$this->content ){
			while( !feof( $this->conn_id ) ){
				$this->content .= fgets( $this->conn_id, 128 );
			}
		}
		return $this->content;
	}

//****************************************************************************

	function close(){
		fclose ($this->conn_id);
	}

//****************************************************************************
}
всегда считывай заголовок!!
 
Сверху