PHP (Сетевое взаимодействие): Как правильно реализовать отправку данных методом POST через сокеты (fsockopen), если порт не указан (по умолчанию 80)?

Функция `fsockopen()` в PHP позволяет открывать сетевые соединения на низком уровне и вручную формировать HTTP-запросы. Если порт не указан явно, по умолчанию для HTTP используется порт 80. Рассмотрим, как правильно реализовать отправку данных методом POST.

## Базовый пример отправки POST через fsockopen

php
‘john’,
‘password’ => ‘secret123’
]);

$contentLength = strlen($postData);

$socket = fsockopen($host, $port, $errno, $errstr, 30);

if (!$socket) {
die(«Ошибка подключения: $errstr ($errno)»);
}

$request = «POST $path HTTP/1.1rn»;
$request .= «Host: $hostrn»;
$request .= «Content-Type: application/x-www-form-urlencodedrn»;
$request .= «Content-Length: $contentLengthrn»;
$request .= «Connection: closern»;
$request .= «rn»;
$request .= $postData;

fwrite($socket, $request);

$response = »;
while (!feof($socket)) {
$response .= fgets($socket, 1024);
}

fclose($socket);

echo $response;
?>

## Ключевые моменты, которые важно учитывать

**1. Заголовок `Host`** — обязателен при использовании HTTP/1.1. Без него сервер вернёт ошибку 400 Bad Request.

**2. Заголовок `Content-Length`** — должен точно соответствовать длине тела запроса в байтах. Используйте `strlen()`, а не `mb_strlen()`, так как нужна длина в байтах, а не в символах.

**3. Заголовок `Content-Type`** — для обычных форм используется `application/x-www-form-urlencoded`. Для JSON — `application/json`.

**4. Разделитель заголовков и тела** — между заголовками и телом запроса обязательно должна быть пустая строка (`rnrn`). Это стандарт HTTP.

**5. `Connection: close`** — рекомендуется явно указывать, чтобы сервер закрыл соединение после ответа, иначе `feof()` может зависнуть.

## Если порт не указан

Вы можете вызвать `fsockopen($host, 80, …)` или использовать `getservbyname(‘http’, ‘tcp’)` для автоматического определения порта. Однако жёсткое указание `80` — самый надёжный способ для HTTP.

## Отправка JSON через fsockopen

php
$jsonData = json_encode([‘key’ => ‘value’]);
$request = «POST $path HTTP/1.1rn»;
$request .= «Host: $hostrn»;
$request .= «Content-Type: application/jsonrn»;
$request .= «Content-Length: » . strlen($jsonData) . «rn»;
$request .= «Connection: closernrn»;
$request .= $jsonData;

## Когда использовать fsockopen вместо cURL

Функция `fsockopen` полезна, когда cURL недоступен или нужен полный контроль над сырым HTTP-запросом. Однако для большинства задач в современных проектах рекомендуется использовать cURL или библиотеки типа Guzzle, так как они обрабатывают редиректы, SSL и ошибки автоматически.


Задайте вопрос нейросети

Не нашли ответ? Спросите ИИ — он подготовит развёрнутую статью.