Socket create: примеры (PHP)

Работа с socket_create в PHP: практическое применение сетевых сокетов
Раздел: Сокеты
socket_create(int domain, int type, int protocol): resource|false
Функция socket_create в PHP

Функция socket_create создает новый сокет - конечную точку для сетевого взаимодействия. Она используется для реализации низкоуровневых сетевых соединений, когда стандартных протоколов или библиотек недостаточно.

Функция применяется в случаях:

  • Разработки пользовательских сетевых протоколов
  • Создания серверов для специфичных задач
  • Реализации клиентов для нестандартных сервисов
  • Мультиплексирования нескольких соединений

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

  • domain - домен сокета. Возможные значения: AF_INET (IPv4), AF_INET6 (IPv6), AF_UNIX (локальные сокеты)
  • type - тип сокета. Основные значения: SOCK_STREAM (TCP), SOCK_DGRAM (UDP), SOCK_RAW (сырые сокеты)
  • protocol - протокол. Обычно SOL_TCP для TCP или SOL_UDP для UDP, либо 0 для автоматического выбора

Функция возвращает ресурс сокета или false в случае ошибки.

Примеры использования socket_create
Создание TCP сокета для IPv4
// TCP сокет для IPv4
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    echo "Ошибка: " . socket_strerror(socket_last_error());
} else {
    echo "TCP сокет создан успешно";
}
TCP сокет создан успешно
Создание UDP сокета для IPv6
// UDP сокет для IPv6
$socket = socket_create(AF_INET6, SOCK_DGRAM, SOL_UDP);
if ($socket === false) {
    echo "Ошибка создания UDP сокета: " . socket_strerror(socket_last_error());
} else {
    echo "UDP IPv6 сокет создан";
    socket_close($socket);
}
UDP IPv6 сокет создан
Создание UNIX сокета
// Локальный UNIX сокет
$socket = socket_create(AF_UNIX, SOCK_STREAM, 0);
if ($socket === false) {
    echo "Ошибка UNIX сокета: " . socket_strerror(socket_last_error());
} else {
    echo "UNIX сокет создан";
}
UNIX сокет создан
Альтернативные функции в PHP

Для сетевого взаимодействия в PHP доступны несколько альтернатив:

stream_socket_server

Создает серверный сокет через потоковый API. Проще в использовании, поддерживает SSL, но менее гибкая.

fsockopen

Открывает соединение через файловый поток. Удобна для простых клиентских подключений, но не подходит для серверов.

cURL

Библиотека для сложных HTTP-запросов. Поддерживает множество протоколов и опций.

socket_create предпочтительнее при реализации пользовательских протоколов или когда требуется полный контроль над сокетом.

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

Socket create в Python

import socket
# Создание TCP сокета
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print(type(sock))
<class 'socket.socket'>
JavaScript (Node.js)
const net = require('net');
// Создание TCP сервера
const server = net.createServer();
console.log(typeof server);
object

Socket create в Java

import java.net.Socket;
// Создание сокета
Socket socket = new Socket();
System.out.println(socket.getClass());
class java.net.Socket

Основное отличие PHP реализации - ресурсный тип возвращаемого значения и процедурный стиль работы в большинстве примеров.

Типичные ошибки
Неверные параметры
// Неправильный тип сокета
$socket = socket_create(AF_INET, 9999, SOL_TCP);
if ($socket === false) {
    echo "Код ошибки: " . socket_last_error();
    echo " Текст: " . socket_strerror(socket_last_error());
}
Код ошибки: 10047 Текст: Address family not supported by protocol
Отсутствие прав
// Создание RAW сокета требует прав администратора
$socket = socket_create(AF_INET, SOCK_RAW, getprotobyname('icmp'));
if ($socket === false) {
    echo "Ошибка: " . socket_strerror(socket_last_error());
}
Ошибка: Permission denied
Несовместимые параметры
// UNIX сокет с TCP протоколом
$socket = socket_create(AF_UNIX, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    echo "Ошибка совместимости: " . socket_strerror(socket_last_error());
}
Ошибка совместимости: Protocol not supported
Изменения в версиях PHP

В PHP 8.0 функция socket create не претерпела значительных изменений. Однако стоит отметить:

  • PHP 8.0 улучшила обработку ошибок для функций сокетов
  • Добавлена строгая типизация параметров
  • Улучшена совместимость с IPv6
  • В PHP 8.1 улучшена работа с ресурсами

Сигнатура функции осталась неизменной: socket_create(int $domain, int $type, int $protocol): Socket|false

Расширенные примеры
Мультиплексирование сокетов
Пример php
// Создание нескольких сокетов
$sockets = [];
for ($i = 0; $i < 3; $i++) {
    $sockets[$i] = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    socket_set_nonblock($sockets[$i]);
}

// Проверка готовности сокетов
$read = $sockets;
$write = $except = null;
$changed = socket_select($read, $write, $except, 0);

echo "Готовых сокетов: $changed";

foreach ($sockets as $socket) {
    socket_close($socket);
}
Готовых сокетов: 0
Создание неблокирующего сокета
Пример php
// Неблокирующий TCP сокет
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket) {
    socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
    socket_set_nonblock($socket);
    
    if (socket_bind($socket, '127.0.0.1', 0)) {
        socket_getsockname($socket, $addr, $port);
        echo "Сокет привязан к $addr:$port в неблокирующем режиме";
    }
    socket_close($socket);
}
Сокет привязан к 127.0.0.1:45872 в неблокирующем режиме
Создание широковещательного UDP сокета
Пример php
// UDP сокет с поддержкой broadcast
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
if ($socket) {
    socket_set_option($socket, SOL_SOCKET, SO_BROADCAST, 1);
    
    // Отправка широковещательного сообщения
    $message = "Broadcast test";
    $sent = socket_sendto($socket, $message, strlen($message), 0, '255.255.255.255', 12345);
    
    echo "Отправлено broadcast сообщений: $sent байт";
    socket_close($socket);
}
Отправлено broadcast сообщений: 13 байт
Создание сокета с таймаутами
Пример php
// TCP сокет с настройкой таймаутов
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket) {
    // Таймаут на чтение - 5 секунд
    socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, ["sec" => 5, "usec" => 0]);
    
    // Таймаут на запись - 3 секунды
    socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, ["sec" => 3, "usec" => 0]);
    
    echo "Сокет создан с таймаутами: 5с на чтение, 3с на запись";
    socket_close($socket);
}
Сокет создан с таймаутами: 5с на чтение, 3с на запись

PHP socket_create function comments

En
Socket create Create a socket (endpoint for communication)