Posts Tagged ‘сокет’

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

[Эту мини-статью я когда-то написал для журнала "International PHP Magazine", как часть колонки "Спроси гуру". Я перепечатываю ее здесь, потому что она полезная и потому что люди просили меня об этом дважды за последние два дня]

Вопрос:

Существует ли в PHP хоть какая-то многопоточность?

Скажем, вы написали PHP-приложения для мониторинга служб на некотором количестве серверов и было бы неплохо запрашивать несколько серверов одновременно, а не один за одним.

Это возможно?

Ответ:

Люди часто предполагают, что необходимо разветвлять или порождать потоки, когда понадобится выполнять несколько действий одновременно, и если к тому же приложение реализовано на PHP (а этот язык не поддерживает многопоточность), то они должны перейти на что-то другое более подходящее, например perl.

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

Скажем, Вам нужно проверять веб-серверы, действительно ли они рабочие в данный момент. Вы можете написать следующий скрипт:

< ?php
$hosts = array("host1.sample.com", "host2.sample.com");
$timeout = 15;
$status = array();
foreach ($hosts as $host) {
    $errno = 0;
    $errstr = "";
    $s = fsockopen($host, 80, $errno, $errstr, $timeout);
    if ($s) {
        $status[$host] = “Соединение установлено\n”;
        fwrite($s, “HEAD / HTTP/1.0\r\nHost: $host\r\n\r\n”);
        do {
            $data = fread($s, 8192);
            if (strlen($data) == 0) {
                break;
            }
            $status[$host] .= $data;
        } while (true);
        fclose($s);
    } else {
        $status[$host] = “Соединение прервано: $errno $errstr\n”;
    }
}
print_r($status);
?>

И этот скрипт будет работать отлично, но так как функция fsockopen() не возвращает управление до тех пор, пока не получит имя хоста и не установит соединение (или она будет ждать таймаут в $timeout секунд), то использовать этот сценарий для мониторинга большого количества хостов не получится в виду его медленности.

Read the rest of this entry »