Запуск PHP SoapServer за прокси-сервером

Я пытаюсь запустить PHP SoapClient и SoapServer (для Magento) за прокси-сервером, где разрешен только один сетевой трафик через прокси-сервер.

У меня это работает с клиентом:

$client = new SoapClient('https://www.domain.co.uk/api/v2_soap/?wsdl=1', [
    'soap_version' => SOAP_1_1,
    'connection_timeout' => 15000,
    'proxy_host' => '192.168.x.x',
    'proxy_port' => 'xxxx',
    'stream_context' => stream_context_create(
        [
            'ssl' => [
                'proxy' => 'tcp://192.168.x.x:xxxx',
                'request_fulluri' => true,
            ],
            'http' => [
                'proxy' => 'tcp://192.168.x.x:xxxx',
                'request_fulluri' => true,
            ],
        ]
    ),
]);

Это работает как ожидалось - весь трафик проходит через прокси-сервер.

Однако, с классом SoapServer, я не могу решить, как заставить его отправлять весь исходящий трафик через SoapServer. Похоже, что пытается загрузить http://schemas.xmlsoap.org/soap/encoding/ непосредственно из сети, а не через прокси-сервер, вызывающий "не импортировать схему из" http://schemas.xmlsoap.org/soap/encoding/ '"ошибка, которую нужно выбросить.

Я попытался добавить запись файла hosts для schemas.xmlsoap.org в 127.0.0.1 и разместить этот файл локально, но я все еще получаю ту же проблему.

Есть ли что-то, что мне не хватает?

Ответы

Ответ 1

Попробуйте stream_context_set_default, как в file_get_contents: file_get_contents за прокси-сервером

<?php
// Edit the four values below
$PROXY_HOST = "proxy.example.com"; // Proxy server address
$PROXY_PORT = "1234";    // Proxy server port
$PROXY_USER = "LOGIN";    // Username
$PROXY_PASS = "PASSWORD";   // Password
// Username and Password are required only if your proxy server needs basic authentication

$auth = base64_encode("$PROXY_USER:$PROXY_PASS");
stream_context_set_default(
 array(
    'http' => array(
    'proxy' => "tcp://$PROXY_HOST:$PROXY_PORT",
    'request_fulluri' => true,
    'header' => "Proxy-Authorization: Basic $auth"
    // Remove the 'header' option if proxy authentication is not required
  )
 )
);
//Your SoapServer here

Или попробуйте запустить сервер в режиме, отличном от WSDL.

<?php
$server = new SoapServer(null, array('uri' => "http://localhost/namespace"));
$server->setClass('myClass');
$data = file_get_contents('php://input');
$server->handle($data);