Многопоточность

Тема в разделе "PHP", создана пользователем LEXAlForpostl, 24 авг 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. LEXAlForpostl

    LEXAlForpostl

    Регистр.:
    21 май 2008
    Сообщения:
    740
    Симпатии:
    226
    Здравствуйте.
    Подскажите пожалуйста, как запустить параллельно 100 скриптов и как может это отразиться на денвере? :)
    Скрипты: 1.php, 2.php .. 100.php
     
  2. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    884
    Симпатии:
    540
    Напечатать 100 iframe, каждый из которых запустит скрипт
    Скорее всего загрузит проц на 100%, ничего работать не будет, в том числе и остановить серв можно будет лишь перезагрузив комп.
     
  3. saen

    saen

    Регистр.:
    6 авг 2006
    Сообщения:
    756
    Симпатии:
    129
    пишешь макрос под браузер и запускаешь 100 окон. денвер повиснет
     
  4. tostrss

    tostrss

    Регистр.:
    16 окт 2007
    Сообщения:
    771
    Симпатии:
    217
    делаешь 100 системных вызовов
    PHP:
    pclose(popen('Z:/php/php.exe Z:/home/localhost/www/1.php, 'r'));
    они уйдут в бэкграунд...но загрузят твой проц, естесно меньше чем запуск через денвер
     
  5. Fedotishe

    Fedotishe Создатель

    Регистр.:
    6 апр 2009
    Сообщения:
    10
    Симпатии:
    1
    Разве 100 скриптов повесят апач? Это вроде не так много, путь даже и из под windows.

    Можно попробовать настроить на денвере запуск пхп как FastCGI, тогда думаю скрипты точно должны отработать ничего не повесив, так как в памяти не будет 100 экземпляров пхп.
     
  6. t0wer

    t0wer BlackHerald

    Регистр.:
    24 июн 2008
    Сообщения:
    733
    Симпатии:
    422
    Часто возникают задачи, которые можно значительно ускорить, если выполнять их в несколько потоков. PHP в отличие от Perl, имеет слабые возможности по организации реальной многопоточности, поэтому ее приходится “симулировать” с помощью пула неблокирующих сокетов.

    Реализацию примерно можно выполнить на следующем примере:

    config.php
    HTML:
    
    // путь, где расположены скрипты
    $path = '_ttp://domain.com/path/';
    
    // число потоков
    $max_threads = 20;
    
    launcher.php
    HTML:
    
    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-Type: text/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, $error, 30);
                stream_set_blocking($socket, 0);
                stream_set_timeout($socket, 3600);
                fputs($socket, $query);
    
                // запоминаем запущенный сокет
    
                $sockets[md5(time())] = $socket;
            }
        }
    
        // читаем данные из сокета. формально они нам
        // не нужны, но это позволяет
        // отработать обработчкику запросов
    
        reset($sockets);
        while ($socket = current($sockets))
        {
            if (feof($socket))
            {
                // убиваем сокет, который отработал
    
                unset($sockets[key($sockets)]);
            }
            else
            {
                // читаем данные из сокета
    
                $temp = fgets($socket, 1000);
            }
    
            // обрабатываем следующий сокет
    
            next($sockets);
        }
    
        // делаем небольщую задержку,
        // иначе загруженность сервера
        // приближается к 100 процентам
    
        sleep(1);
    
        // если нет активных сокетов, то можно выходить
    
        if (count($sockets) == 0)
            $done = true;
    }
    
    fclose($keywords);
    
    die;
    
     
Статус темы:
Закрыта.