Pfsockopen: примеры (PHP)

Функция pfsockopen в PHP для постоянных сетевых подключений
Раздел: Сетевые функции
pfsockopen(string $hostname, int $port = -1, int &$error_code = null, string &$error_message = null, ?float $timeout = null): resource|false

Функция pfsockopen

Функция pfsockopen устанавливает постоянное соединение с сокетом. Она аналогична fsockopen, но соединение не закрывается после завершения работы скрипта. Это позволяет повысить производительность при многократных обращениях к одному серверу.

Аргументы функции

hostname - имя хоста или IP-адрес.

port - номер порта.

error_code - ссылка на переменную для сохранения кода ошибки.

error_string - ссылка на переменную для сохранения текста ошибки.

timeout - таймаут соединения в секундах.

Примеры использования

Базовое подключение
<?
$fp = pfsockopen('www.example.com', 80, $errno, $errstr, 30);
if (!$fp) {
    echo "Ошибка: $errstr ($errno)";
} else {
    fwrite($fp, "GET / HTTP/1.0\r\nHost: www.example.com\r\n\r\n");
    while (!feof($fp)) {
        echo fgets($fp, 128);
    }
    // Соединение не закрывается явно
}
?>
HTTP/1.1 200 OK
Date: Mon, 01 Jan 2024 12:00:00 GMT
...
Подключение с таймаутом
<?
$fp = pfsockopen('tcp://localhost', 8080, $errno, $errstr, 2);
if ($fp) {
    echo 'Соединение установлено';
}
?>
Соединение установлено

Похожие функции PHP

fsockopen - открывает обычное соединение, которое закрывается после завершения скрипта. Подходит для единичных запросов.

stream_socket_client - более современная функция с расширенными возможностями контекста потоков.

socket_create - низкоуровневое создание сокетов с полным контролем.

Типичные ошибки

Превышение времени ожидания
<?
$fp = pfsockopen('nonexistent-host.local', 80, $errno, $errstr, 1);
?>
Warning: pfsockopen(): unable to connect to nonexistent-host.local:80 (Connection timed out)
Использование неправильного протокола
<?
$fp = pfsockopen('ssl://example.com', 443, $errno, $errstr, 30);
?>
Требуется установка SSL-контекста через stream_context_create

Изменения в версиях PHP

В PHP 8.0 функция не претерпела значительных изменений. Рекомендуется использовать современные альтернативы, такие как stream_socket_client с соответствующими контекстами.

Расширенные примеры

Работа с несколькими запросами
Пример php
<?
// Первый скрипт
$fp = pfsockopen('localhost', 9000, $errno, $errstr, 30);
fwrite($fp, "Данные 1");
// Соединение остается открытым

// Второй скрипт (выполняется позже)
$fp = pfsockopen('localhost', 9000, $errno, $errstr, 30);
// Используется существующее соединение
fwrite($fp, "Данные 2");
?>
Чтение большого объема данных
Пример php
<?
$fp = pfsockopen('example.com', 80);
$request = "GET /largefile.txt HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\n\r\n";
fwrite($fp, $request);

$response = '';
while (!feof($fp)) {
    $response .= fread($fp, 8192);
}
echo substr($response, 0, 500) . '...';
?>

Аналоги в других языках

Pfsockopen в Python

import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('example.com', 80))
sock.send(b'GET / HTTP/1.0\r\nHost: example.com\r\n\r\n')
print(sock.recv(4096))
sock.close()
JavaScript (Node.js)
const net = require('net');
const client = net.createConnection({ port: 80, host: 'example.com' }, () => {
    client.write('GET / HTTP/1.0\r\nHost: example.com\r\n\r\n');
});
client.on('data', (data) => console.log(data.toString()));

Pfsockopen в MySQL

Функции для работы с сетевыми соединениями отсутствуют.

PHP pfsockopen function comments

En
Pfsockopen Open persistent Internet or Unix domain socket connection