HTTP-прокси-контекст PHP не перенастраивает необработанный TCP-поток
Отличайте параметры прокси HTTP-обёртки PHP от протокольной работы, необходимой для TCP-соединения stream_socket_client.
Параметр прокси контекста HTTP принадлежит HTTP-обёртке потока PHP. Необработанное TCP-соединение, созданное stream_socket_client, не становится HTTP-прокси-клиентом только потому, что этот параметр существует в объекте контекста.
Если код подключается напрямую к адресу назначения, он открывает этот TCP-маршрут. Если же он подключается к адресу прокси, следующие байты всё равно должны реализовывать протокол прокси.
Для HTTP CONNECT это означает допустимый хост и порт назначения, любую требуемую аутентификацию прокси, полный разбор ответа и принятие до начала протокола назначения. Один вызов fread, ищущий фразу об успехе, не является полноценным соединителем. TCP может разделить ответ между чтениями или вернуть дополнительные байты, которые нужно сохранить.
Для назначения HTTPS протокол TLS затем должен начаться через установленный туннель и проверить идентичность назначения. Имя хоста прокси не является идентичностью сертификата сайта.
Используйте клиент или соединитель с документированной поддержкой требуемого протокола прокси, когда задача — просто получить URL. Настройки HTTP и SOCKS в PHP cURL дают один поддерживаемый путь получения URL. Необработанный поток полезен, когда приложение само берёт на себя эту протокольную работу нижнего уровня; он не должен молча наследовать допущения из несвязанного примера HTTP-обёртки.