У меня проблема с SOAP-сервером, которая сводит меня с ума от пары дней. У меня есть очень простой PHP-скрипт SOAP-клиента, который также опрашивает простой PHP-скрипт SOAP-сервера.
У меня есть точная копия этих сценариев на моем сервере отладки, и они работают безупречно (это просто функция «Здравствуй, мир»), но на производстве кажется, что нет способа получить ответ от мыла-сервера от мыла-клиента. Я продолжаю получать сообщение об ошибке «Процедура ‘ns1: testHello’ not present» (testHello — это имя функции).
Я знаю, что производственный клиент работает, потому что если я звоню с производственного сервера для разработки WSDL, он работает отлично. Я действительно думаю, что это как-то связано с сервером SOAP, но как я могу точно знать, работает ли он правильно и что не так?
Если я посмотрю дамп infophp (), я увижу, что и SOAP-сервер, и клиент включены
Soap Client enabled
Soap Server enabled
Directive Local Value Master Value
soap.wsdl_cache 1 1
soap.wsdl_cache_dir /tmp /tmp
soap.wsdl_cache_enabled 0 1
soap.wsdl_cache_limit 5 5
soap.wsdl_cache_ttl 0 86400
Я попытался форсировать версии SOAP_1_1 и SOAP_1_2, но без изменений.
Я пытался отключить все виды кэша, но без изменений.
Я читал, что «функция ns: X отсутствует», как правило, из-за неправильной конфигурации WSDL, но как это может быть неправильно, если это точная копия (кроме targetNamespace, xmlns: tns и soap: address urls, указывающих на рабочий сервер)
Я начинаю думать, что это как-то связано с некоторыми настройками конфигурации веб-сервера. Есть идеи? Какие тесты я могу сделать?
Большое спасибо заранее.
Мой код СЕРВЕРА:
ini_set("display_errors", "off");
ini_set("soap.wsdl_cache_enabled", 0);
ini_set('soap.wsdl_cache_ttl',0);
$wsdl_url="http://SITE_URL/test.wsdl";function testHello($functionName){
$return = "Hello, ".$functionName;
return $return;
}
$server= new SoapServer($wsdl_url, array('cache_wsdl' => WSDL_CACHE_NONE));
$server->addFunction("testHello");
$server->handle();
Мой код клиента
ini_set("soap.wsdl_cache_enabled", 0);
ini_set('soap.wsdl_cache_ttl',0);
ini_set("display_errors", "on");
$wsdl_url="http://SITE_URL/test.wsdl";
$client=new SoapClient($wsdl_url , array('cache_wsdl' => WSDL_CACHE_NONE));
try{
$t = $client-> testHello("Test");
var_dump($t);
} catch(SoapFault $e){
var_dump($e);
}
Мой файл WSDL
<?xml version="1.0" encoding="UTF-8" ?>
<definitions name="TLN"targetNamespace="http://SITE_URL/test.wsdl"xmlns:tns="http://SITE_URL/test.wsdl"xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"xmlns="http://schemas.xmlsoap.org/wsdl/">
<message name="testHelloRequest">
<part name="functionName" type="xsd:string"/>
</message>
<message name="testHelloResponse">
<part name="return" type="xsd:string"/>
</message>
<portType name="testHelloPortType">
<operation name="testHello">
<input message="tns:testHelloRequest" />
<output message="tns:testHelloResponse" />
</operation>
</portType>
<binding name="testHelloBinding" type="tns:testHelloPortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
<operation name="testHello">
<soap:operation soapAction="" />
<input>
<soap:body use="encoded" namespace="" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</input>
<output>
<soap:body use="encoded" namespace="" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</output>
</operation>
</binding>
<documentation>testHello</documentation>
<service name="testHelloService">
<port name="testHelloPort" binding="testHelloBinding">
<soap:address location="http://SITE_URL/server.php" />
</port>
</service></definitions>
Задача ещё не решена.
Других решений пока нет …