Показать сообщение отдельно

  #14  
Старый 30.09.2006, 22:38
off
Познающий
Регистрация: 21.08.2006
Сообщений: 31
Провел на форуме:
450990

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

На каком – то сайте видел вот такой пример «многопоточности». Тут естественно идёт симуляция, т.к. в php многопоточности нет. Пример никогда не использовал, т.к. так и не встретился с задачей в которой это хоть чем то помогло.


PHP код:
config.php

// путь, где расположены скрипты
$path http://domain.com/path/;

// число потоков
$max_threads 20;

 

launcher.php

require_once(”config.php”);

// инициализация

$sockets = array();
$done false;

// будем работать, к примеру с набором
// ключевых слов

$keywords fopen(”keywords.txt”“r”);

// приступаем к многопоточной работе

while (!$done)
{
    
// если обнаружен файл,
    // то прекращаем выполнение скрипта

    
if (file_exists(”stop-file”))
        die;
   
    
// если число запущенных потоков меньше
    // разрешенного максимума
    // то запускаем потоки еще
   
    
if ($max_threads count($sockets))
    {
    
  if (!
feof($keywords))
        {
            
$buffer = array();
           
            
// читаем ключевое слово
            // в реальности в этот массив можно
            // положить очень много всего
            // а не только одно ключевое слово…
           
             
$buffer[] = trim(fgets($keywords));
           
            
// задаем данные для запуска сокета
            // request.php - это тот файл,
            // которые делает “дело”
           
            
$query_url $path “request.php”;
            
$url_info parse_url($query_url);

            
$url_info[port] = ($url_info[port]) ? $url_info[port] : 80;
            
$url_info[path] = ($url_info[path]) ? $url_info[path] : /;
            
$url_info[query] = ($url_info[query]) ? ?” $url_info[query] : “”;

            
// пакуем данные для передачи
            // в генерирующий скрипт
            // использование serialize очень удобно,
            // так как позволяет
            // залить в request.php мегабайты данных
           
            
$request serialize($buffer);
           
            
// формируем запрос для передачи по сокету
           
            
$query “POST ” $url_info[path] . ” HTTP/1.1\r\n”;
            
$query $query “Content-Typetext/xml\r\n”;
            
$query $query “Host” $url_info[host] . \r\n”;
            
$query $query “Content-length” . (strlen($request)) . \r\n\r\n”;
            
$query $query $request;
           
            
// создаем сокет, переводим его
            // в неблокирующий режим и запускаем
            // обработчик запросов
           
            
$errno 0;
            
$error “”;
           
            
$socket fsockopen($url_info[host], $url_info[port], $errno$error30);
            
stream_set_blocking($socket0);
            
stream_set_timeout($socket3600);
            
fputs($socket$query);
           
            
// запоминаем запущенный сокет
           
            
$sockets[md5(time())] = $socket;
        }
    }
   
    
// читаем данные из сокета. формально они нам
    // не нужны, но это позволяет
    // отработать обработчкику запросов
   
    
reset($sockets);
    while (
$socket current($sockets))
    {
        if (
feof($socket))
        {
            
// убиваем сокет, который отработал
           
            
unset($sockets[key($sockets)]);
        }
        else
        {
            
// читаем данные из сокета
           
            
$temp fgets($socket1000);
        }
       
        
// обрабатываем следующий сокет
       
        
next($sockets);
    }
   
    
// делаем небольщую задержку,
    // иначе загруженность сервера
    // приближается к 100 процентам
   
    
sleep(1);
   
    
// если нет активных сокетов, то можно выходить
   
    
if (count($sockets) == 0)
        
$done true;
}

fclose($keywords);

die; 
может кому то пригодится ...
 
Ответить с цитированием