Работали ли вы с сетевыми функциями в PHP?

«Работали ли вы с сетевыми функциями в PHP?» — вопрос из категории Сети, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, активно работал. В современной веб-разработке на PHP взаимодействие с внешними API и сервисами — это стандартная задача.

Мой основной стек для сетевых операций:

  1. Guzzle HTTP Client: Это мой выбор для большинства HTTP-запросов. Он предоставляет удобный синтаксис, поддержку промисов (асинхронности) и middleware.

    use GuzzleHttpClient;
    use GuzzleHttpExceptionRequestException;
    
    $client = new Client(['timeout' => 5.0]);
    
    try {
        // Синхронный POST-запрос с JSON телом
        $response = $client->post('https://api.example.com/data', [
            'json' => ['query' => 'test'],
            'headers' => ['Authorization' => 'Bearer ' . $token]
        ]);
    
        $statusCode = $response->getStatusCode();
        $body = json_decode($response->getBody(), true);
    
    } catch (RequestException $e) {
        // Логируем ошибку и обрабатываем таймауты или коды 4xx/5xx
        error_log('Request failed: ' . $e->getMessage());
    }
  2. Работа с сокетами: Для низкоуровневых задач, таких как реализация простого TCP-сервера или подключение к специализированным протоколам, использовал stream_socket_client/stream_socket_server.

    // Пример TCP-клиента
    $socket = stream_socket_client("tcp://localhost:8000", $errno, $errstr, 30);
    if ($socket) {
        fwrite($socket, "PINGn");
        echo fread($socket, 1024);
        fclose($socket);
    }
  3. cURL: Для сложных сценариев, где нужен полный контроль над всеми параметрами запроса (например, специфичные SSL-опции, прокси, детальное логирование), использую нативный cURL.

С какими задачами сталкивался:

  • Интеграция со сторонними API (платежные системы, социальные сети, SMS-шлюзы).
  • Создание микросервисной архитектуры с HTTP-взаимодействием между сервисами.
  • Парсинг данных с внешних сайтов (с соблюдением robots.txt и политик).
  • Настройка повторных попыток (retry logic), обработка таймаутов и квот, кеширование ответов.