ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > PHP, PERL, MySQL, JavaScript
   
Закрытая тема
 
Опции темы Поиск в этой теме Опции просмотра

многопоточность в php
  #1  
Старый 27.10.2007, 22:57
Аватар для genom--
genom--
Постоянный
Регистрация: 09.07.2006
Сообщений: 937
Провел на форуме:
1948091

Репутация: 1686


По умолчанию многопоточность в php

в общем мой вопрос касается сабжа -- есть какиенибуть нормальные схемы реализации многопоточности в php -- искал в нете но там одно извращенство типо создания нескольких сокетов и последовательного чтения из каждого и тд

ну в общем если есть у когонить инфа желательно с примером - если будет
 

  #2  
Старый 27.10.2007, 23:18
Аватар для Stefun
Stefun
Познающий
Регистрация: 19.11.2006
Сообщений: 60
Провел на форуме:
320906

Репутация: 63
По умолчанию

Первый раз слышу что в пхп можно сделать многопоточность, мда...
В пхп нельзя это реализовать
 

  #3  
Старый 27.10.2007, 23:36
Аватар для inv
inv
Banned
Регистрация: 03.08.2007
Сообщений: 313
Провел на форуме:
951141

Репутация: 291
По умолчанию

точно не знаю....
в любом случае два варианта
если ты работаешь с сокетами
1.асинхронные сокеты (то что ты и сказал - перебирать); curl_multi_init();
2.использовать библиотеки там есть многопроцессорность (никакой информации у меня нет,могу ошибаться)

***
pcntl_fork()

Последний раз редактировалось inv; 27.10.2007 в 23:50..
 

  #4  
Старый 27.10.2007, 23:36
Аватар для EST a1ien
EST a1ien
Участник форума
Регистрация: 02.04.2006
Сообщений: 273
Провел на форуме:
1269624

Репутация: 114
Отправить сообщение для EST a1ien с помощью ICQ
По умолчанию

Думаю что кроме того сто ты привел
Цитата:
там одно извращенство типо создания нескольких сокетов и последовательного чтения из каждого и тд
Врядли чтото прокатит
 

  #5  
Старый 27.10.2007, 23:38
Аватар для KSURi
KSURi
Постоянный
Регистрация: 06.06.2006
Сообщений: 515
Провел на форуме:
1985206

Репутация: 963


По умолчанию

пора бы уже знать, что НЕТ
 

  #6  
Старый 27.10.2007, 23:42
Аватар для genom--
genom--
Постоянный
Регистрация: 09.07.2006
Сообщений: 937
Провел на форуме:
1948091

Репутация: 1686


По умолчанию

я знаю что нет -- но тем не менее мб ченить кроме этих сокетов -- придумали уже
 

  #7  
Старый 28.10.2007, 02:06
Аватар для KSURi
KSURi
Постоянный
Регистрация: 06.06.2006
Сообщений: 515
Провел на форуме:
1985206

Репутация: 963


По умолчанию

Пул неблокирующих сокетов - это не многопоточность
Ничего не придумали и врядли придумают
 

  #8  
Старый 28.10.2007, 02:51
Аватар для Isis
Isis
Флудер
Регистрация: 20.11.2006
Сообщений: 3,316
Провел на форуме:
16641028

Репутация: 2371


По умолчанию

перебирать != многопоточность
 

  #9  
Старый 28.10.2007, 11:39
Аватар для DIAgen
DIAgen
Познавший АНТИЧАТ
Регистрация: 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($ch1CURLOPT_URL"http://www.google.com/");
curl_setopt($ch1CURLOPT_HEADER0);
curl_setopt($ch2CURLOPT_URL"http://www.php.net/");
curl_setopt($ch2CURLOPT_HEADER0);

//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($stream10));
      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($urlPHP_URL_HOST);
       if (
$host === null)
       {
          if (
MD_DEBUG) echo "Host in '$url' is not correct<br>\n";
          continue;
       }
       
$port parse_url($urlPHP_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($stream0); // Для всех потоков ставим режим non-blocking, что бы не ждать когда данные будут доступны для чтения/записи
       
$streams[$url] = $stream;
    }
    
$toException $toRead $toWrite $streams// Два массива потоков, для чтения и для записи. Для чтения можно сразуже задавать, т.к. все равно они не будут доступны пока не будет послан запрос
    
do
    {
       
$rStreams $toRead;
       
$wStreams $toWrite;
       
$eStreams $toException;
       
$num = @stream_select($rStreams$wStreams$eStreams0); // Выбираем какой-нибудь поток. Последний параметр 0 - не ждать таймаута 
    
       
if ($num 0// Если $num == 0, то можно добавить в общий массив новых потоков, что бы не stream_select не простаивал, но я не стал этого делать
       
{
          if (
count($wStreams) > 0)
          {
             foreach(
$wStreams as $write)
             {
                
$url array_search($write$streams);
                
$host parse_url($urlPHP_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($headerstrpos($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($read1024);
                
$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..
 

  #10  
Старый 28.10.2007, 11:47
Аватар для genom--
genom--
Постоянный
Регистрация: 09.07.2006
Сообщений: 937
Провел на форуме:
1948091

Репутация: 1686


По умолчанию

лан спс всем -- будем думать
 
Закрытая тема



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Books PHP FRAGNATIC PHP, PERL, MySQL, JavaScript 186 21.02.2010 02:41
Books PSalm69 Избранное 248 27.10.2009 04:52
На PHP, как на "Новые ворота"... Mertvii-Listopad Чужие Статьи 7 18.09.2006 12:42
Безопасность в Php, Часть Iii k00p3r Чужие Статьи 0 11.07.2005 19:02
Защищаем Php. Шаг за шагом. k00p3r Чужие Статьи 0 13.06.2005 11:31



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ