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

Статус
В этой теме нельзя размещать новые ответы.

LEXAlForpostl

Мой дом здесь!
Регистрация
21 Май 2008
Сообщения
766
Реакции
228
Здравствуйте.
Подскажите пожалуйста, как запустить параллельно 100 скриптов и как может это отразиться на денвере? :)
Скрипты: 1.php, 2.php .. 100.php
 
как запустить параллельно 100 скриптов
Напечатать 100 iframe, каждый из которых запустит скрипт
как может это отразиться на денвере?
Скорее всего загрузит проц на 100%, ничего работать не будет, в том числе и остановить серв можно будет лишь перезагрузив комп.
 
пишешь макрос под браузер и запускаешь 100 окон. денвер повиснет
 
делаешь 100 системных вызовов
PHP:
pclose(popen('Z:/php/php.exe Z:/home/localhost/www/1.php, 'r'));

они уйдут в бэкграунд...но загрузят твой проц, естесно меньше чем запуск через денвер
 
Разве 100 скриптов повесят апач? Это вроде не так много, путь даже и из под windows.

Можно попробовать настроить на денвере запуск пхп как FastCGI, тогда думаю скрипты точно должны отработать ничего не повесив, так как в памяти не будет 100 экземпляров пхп.
 
Часто возникают задачи, которые можно значительно ускорить, если выполнять их в несколько потоков. 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;
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху