Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
|

27.10.2007, 22:57
|
|
Постоянный
Регистрация: 09.07.2006
Сообщений: 937
Провел на форуме: 1948091
Репутация:
1686
|
|
многопоточность в php
в общем мой вопрос касается сабжа -- есть какиенибуть нормальные схемы реализации многопоточности в php -- искал в нете но там одно извращенство типо создания нескольких сокетов и последовательного чтения из каждого и тд
ну в общем если есть у когонить инфа желательно с примером - если будет 
|
|
|

27.10.2007, 23:18
|
|
Познающий
Регистрация: 19.11.2006
Сообщений: 60
Провел на форуме: 320906
Репутация:
63
|
|
Первый раз слышу что в пхп можно сделать многопоточность, мда...
В пхп нельзя это реализовать
|
|
|

27.10.2007, 23:36
|
|
Banned
Регистрация: 03.08.2007
Сообщений: 313
Провел на форуме: 951141
Репутация:
291
|
|
точно не знаю....
в любом случае два варианта
если ты работаешь с сокетами
1.асинхронные сокеты (то что ты и сказал - перебирать); curl_multi_init();
2.использовать библиотеки там есть многопроцессорность (никакой информации у меня нет,могу ошибаться)
***
pcntl_fork()
Последний раз редактировалось inv; 27.10.2007 в 23:50..
|
|
|

27.10.2007, 23:36
|
|
Участник форума
Регистрация: 02.04.2006
Сообщений: 273
Провел на форуме: 1269624
Репутация:
114
|
|
Думаю что кроме того сто ты привел
там одно извращенство типо создания нескольких сокетов и последовательного чтения из каждого и тд
Врядли чтото прокатит
|
|
|

27.10.2007, 23:38
|
|
Постоянный
Регистрация: 06.06.2006
Сообщений: 515
Провел на форуме: 1985206
Репутация:
963
|
|
пора бы уже знать, что НЕТ
|
|
|

27.10.2007, 23:42
|
|
Постоянный
Регистрация: 09.07.2006
Сообщений: 937
Провел на форуме: 1948091
Репутация:
1686
|
|
я знаю что нет -- но тем не менее мб ченить кроме этих сокетов -- придумали уже
|
|
|

28.10.2007, 02:06
|
|
Постоянный
Регистрация: 06.06.2006
Сообщений: 515
Провел на форуме: 1985206
Репутация:
963
|
|
Пул неблокирующих сокетов - это не многопоточность
Ничего не придумали и врядли придумают
|
|
|

28.10.2007, 02:51
|
|
Флудер
Регистрация: 20.11.2006
Сообщений: 3,316
Провел на форуме: 16641028
Репутация:
2371
|
|
перебирать != многопоточность
|
|
|

28.10.2007, 11:39
|
|
Познавший АНТИЧАТ
Регистрация: 02.05.2006
Сообщений: 1,191
Провел на форуме: 7364332
Репутация:
1276
|
|
Много порочность врятли получиться но есть два выхода что можно сделать и оба под php5...
1) Это использовать url_multi_exec
PHP код:
<?php
// create both cURL resources
$ch1 = curl_init();
$ch2 = curl_init();
// set URL and other appropriate options
curl_setopt($ch1, CURLOPT_URL, "http://www.google.com/");
curl_setopt($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/");
curl_setopt($ch2, CURLOPT_HEADER, 0);
//create the multiple cURL handle
$mh = curl_multi_init();
//add the two handles
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);
$running=null;
//execute the handles
do {
curl_multi_exec($mh,$running);
} while ($running > 0);
//close the handles
curl_multi_remove_handle($mh,$ch1);
curl_multi_remove_handle($mh,$ch1);
curl_multi_close($mh);
?>
2) Рассмотри вот этот скрипт
PHP код:
<?php
if (!defined("MD_DEBUG")) define("MD_DEBUG", false);
function get_chanked($stream) {
$content = "";
do
{
$len = trim(fgets($stream, 10));
if (MD_DEBUG) echo "Find lable 0x$len<br>\n";
if ($len === false || !preg_match("|[0-9a-f]+|i", $len))
{
if (MD_DEBUG) echo "Failure getting content<br>\n";
return "";
}
else
{
$len = hexdec($len);
if (MD_DEBUG) echo "Reading $len byte<br>\n";
}
if ($len > 0)
{
$readed = 0;
while($readed < $len + 2)
{
$buffer = fgets($stream);
$readed += strlen($buffer);
$content .= $buffer;
}
}
} while($len > 0);
return $content;
}
function MyDownload ($urls, $timeout = 30) {
$streams = array();
$result = array();
foreach($urls as $url)
{
$host = parse_url($url, PHP_URL_HOST);
if ($host === null)
{
if (MD_DEBUG) echo "Host in '$url' is not correct<br>\n";
continue;
}
$port = parse_url($url, PHP_URL_PORT);
$stream = @stream_socket_client(// Если не удается законнектится то выводится Warning, а он нам тут совершенно не нужен
"tcp://$host:".($port === null ? "80" : $port),
$errno, $errstr, $timeout,
STREAM_CLIENT_ASYNC_CONNECT|STREAM_CLIENT_CONNECT); // Асинхронное соединение, что бы не ждать коннекта...
if ($errno > 0)
{
if (MD_DEBUG) echo "Error connectiong to $url. $errstr($errno)<br>\n";
// либо еще что-нибудь делаем. Пишем в логи итп...
continue;
}
stream_set_blocking($stream, 0); // Для всех потоков ставим режим non-blocking, что бы не ждать когда данные будут доступны для чтения/записи
$streams[$url] = $stream;
}
$toException = $toRead = $toWrite = $streams; // Два массива потоков, для чтения и для записи. Для чтения можно сразуже задавать, т.к. все равно они не будут доступны пока не будет послан запрос
do
{
$rStreams = $toRead;
$wStreams = $toWrite;
$eStreams = $toException;
$num = @stream_select($rStreams, $wStreams, $eStreams, 0); // Выбираем какой-нибудь поток. Последний параметр 0 - не ждать таймаута
if ($num > 0) // Если $num == 0, то можно добавить в общий массив новых потоков, что бы не stream_select не простаивал, но я не стал этого делать
{
if (count($wStreams) > 0)
{
foreach($wStreams as $write)
{
$url = array_search($write, $streams);
$host = parse_url($url, PHP_URL_HOST);
$request = "GET $url HTTP/1.1\r\nAccept: */*\r\nnAccept-Language: en-us\r\nPragma: no-cache\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0)\r\nHost: $host\r\nConnection: Close\r\n\r\n";
if (MD_DEBUG) echo "Sending request for $url<br>\n$request";
fwrite($write, $request);
unset($toWrite[array_search($write, $toWrite)]); // Запрос послан, больше не надо выбирать поток для записи
}
}
if (count($rStreams) > 0)
{
foreach($rStreams as $read)
{
$url = array_search($read, $streams);
$key = array_keys ($urls, $url); $key = $key[0];
if (MD_DEBUG) echo "Getting data for $url<br>\n";
$isChunk = false;
$charset = "";
$result[$key][0] = "";
while(($header = fgets($read)) != "\r\n") {
if (!(strpos($header, "Content-Type")===false)) if (!(strpos($header, "charset=")===false)) $charset = substr($header, strpos($header, "charset=")+8);
else $charset = "default";
if (preg_match("|Transfer-Encoding:\s+chunked|i", $header)) $isChunk = true;
}
if ($isChunk) $result[$key][0] = get_chanked($read);
else while (!feof($read)) $result[$key][0] .= fread($read, 1024);
$result[$key][1] = $charset;
unset($toRead[array_search($read, $toRead)]); // Ответ получен, поток не нужен больше
}
}
if (count($eStreams) > 0)
{
foreach($eStreams as $exception)
{
$url = array_search($exception, $streams);
if (MD_DEBUG) echo "Fail getting data for $url.<br>\n";
// Здесь так же кричим, что сервер вернул не то что ожидали и выкидываем этот поток из стека
}
unset($toRead[array_search($exception, $toRead)]);
unset($toWrite[array_search($exception, $toWrite)]);
unset($toException[array_search($exception, $toException)]);
}
}
} while(count($toRead) > 0); // Читать нечего больше
return $result;
}
$urls = array(
"yandex"=>"http://www.yandex.ru/yandsearch?text=Превед",
"whois"=>"http://www.service-whois.ru/?domain=mail.ru"
);
$sites = MyDownload ($urls);
$yandex1 = $sites["yandex"][0];
$yandex2 = $sites["yandex"][1];
?>
Даный скрипт будет работать только в php5, не много поточность... но работает быстро и эффективно...
Последний раз редактировалось DIAgen; 28.10.2007 в 12:13..
|
|
|

28.10.2007, 11:47
|
|
Постоянный
Регистрация: 09.07.2006
Сообщений: 937
Провел на форуме: 1948091
Репутация:
1686
|
|
лан спс всем -- будем думать
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|