Перейти к содержимому

Функция PHP fsockopen(): всё, что нужно знать

Как PHP-разработчику, вам может потребоваться установить сетевое соединение и взаимодействовать с другим сервером по протоколу TCP/IP. Исторически для этих целей использовалась функция `fsockopen()`. Примечание: `fsockopen()` была признана устаревшей в PHP 8.1 и удалена в PHP 8.2. В современных PHP-приложениях следует использовать `stream_socket_client()` или cURL. В этой статье рассматривается устаревшая функция исключительно в справочных целях и для помощи при миграции.

Что такое функция fsockopen()?

Функция `fsockopen()` открывает сетевое соединение TCP/IP с указанным хостом и портом, позволяя отправлять и получать данные через файловые указатели.

Как использовать функцию fsockopen()

Использование функции `fsockopen()` достаточно просто. Ниже приведён синтаксис:

Синтаксис PHP

php
fsockopen($hostname, $port, &$errno, &$errstr, $timeout);

Функция принимает пять параметров:

  • `$hostname`: Имя хоста или IP-адрес сервера.
  • `$port`: Номер порта для подключения.
  • `&$errno`: Переменная, в которой хранится номер ошибки, если она возникла.
  • `&$errstr`: Переменная, в которой хранится сообщение об ошибке, если оно есть.
  • `$timeout`: Таймаут подключения в секундах. По умолчанию используется значение `default_socket_timeout` из `ini`-файла, если параметр не указан.

Примечание: Для безопасных соединений добавьте к имени хоста префикс `ssl://` или `tls://` (например, `tls://example.com`).

Ниже приведён пример использования функции `fsockopen()` для установки сетевого соединения с сервером и отправки/получения данных:

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

php
<?php

$host = "example.com";
$port = 80;
$timeout = 30;
$fp = fsockopen($host, $port, $errno, $errstr, $timeout);
if (!$fp) {
  echo "Error: $errstr ($errno)<br/>";
} else {
  $out = "GET / HTTP/1.1\r\n";
  $out .= "Host: $host\r\n";
  $out .= "Connection: Close\r\n\r\n";
  fwrite($fp, $out);
  while (!feof($fp)) {
    echo fgets($fp, 128);
  }
  fclose($fp);
}

В этом примере мы используем функцию `fsockopen()` для установки сетевого соединения с сервером `example.com` на порту 80. Мы указываем таймаут подключения 30 секунд. Если соединение установлено успешно, мы отправляем HTTP GET-запрос на сервер и получаем ответ с помощью функции `fgets()`.

Примечание: Для HTTPS-запросов используйте `tls://` в качестве префикса протокола в переменной `$host`.

Заключение

Хотя `fsockopen()` обеспечивает низкоуровневое взаимодействие по TCP/IP, в современном PHP она устарела. Для новых проектов используйте `stream_socket_client()` или cURL. Эта справочная информация по-прежнему полезна для поддержки устаревших кодовых баз.

Практика

Что делает функция fsockopen в PHP?

Считаете ли это полезным?

Предпросмотр dual-run — сравните с маршрутами Symfony на продакшене.