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 с соответствующими контекстами.
Расширенные примеры
<?
// Первый скрипт
$fp = pfsockopen('localhost', 9000, $errno, $errstr, 30);
fwrite($fp, "Данные 1");
// Соединение остается открытым
// Второй скрипт (выполняется позже)
$fp = pfsockopen('localhost', 9000, $errno, $errstr, 30);
// Используется существующее соединение
fwrite($fp, "Данные 2");
?><?
$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()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
Функции для работы с сетевыми соединениями отсутствуют.