Php with soap enabled
The behaviour of these functions is affected by settings in php.ini .
Name | Default | Changeable | Changelog |
---|---|---|---|
soap.wsdl_cache_enabled | 1 | PHP_INI_ALL | |
soap.wsdl_cache_dir | /tmp | PHP_INI_ALL | |
soap.wsdl_cache_ttl | 86400 | PHP_INI_ALL | |
soap.wsdl_cache | 1 | PHP_INI_ALL | |
soap.wsdl_cache_limit | 5 | PHP_INI_ALL |
Here’s a short explanation of the configuration directives.
Enables or disables the WSDL caching feature.
Sets the directory name where the SOAP extension will put cache files.
Sets the number of seconds (time to live) that cached files will be used instead of the originals.
If soap.wsdl_cache_enabled is on, this setting determines the type of caching. It can be any of: WSDL_CACHE_NONE ( 0 ), WSDL_CACHE_DISK ( 1 ), WSDL_CACHE_MEMORY ( 2 ) or WSDL_CACHE_BOTH ( 3 ). This can also be set via the options array in the SoapClient or SoapServer constructor.
Maximum number of in-memory cached WSDL files. Adding further files into a full memory cache will delete the oldest files from it.
User Contributed Notes 4 notes
Please note that these three ini settings will also affect the behaviour of your soap server (and clients as well) :
1. default_socket_timeout default 60 secs
Large or slow requests to your soap server or long processes at your soap server will return soap fault after 60 secs like : Error Fetching http headers.
2. max_execution_time default 30 secs
This can be the next bottleneck (but only when your default_socket_timeout is larger then this setting). Your soap server will not return anything, no faults no output, just an empty string.
3. memory_limit default 128M
Will throw fatal errors when the soap server script itself has low memory or will let your services return empty strings when the data it processes puts memory usage over this limit.
Other max POST settings luckily (but a bit suprisingly to me) have _no_ effect for your soap server. Those are :
Be aware that wsdl cache may not be compatible across different PHP versions, which may be important to know when you upgrade your PHP on the same system or use a multi-PHP version setup where you run the same scripts from different PHP versions. In other words, when a SOAP request writes a file to the cache and then you make another SOAP request from another PHP version and this cache file is used then *sometimes* you may experience unexpected errors that you will not know where they come from.
I spent hours trying to figure out why I was getting «Encoding: Violation of encoding rules» errors every time I ran some of my SOAP scripts from PHP 7.3 just hours after switching from PHP 7.2. It turned out I needed to clear all cached wsdl files created by PHP 7.2. Downgrading from 7.3 to 7.2 caused the same errors and required clearing the cache, too.
When transitioning to a new PHP version you may turn off the cache or set a very short wsdl_cache_ttl period — if you can’t delete the files yourself. If you need your scripts to run on multiple PHP versions with wsdl cache then you’d need to set wsdl_cache_dir that is different for each PHP version.
If you want to dissable WSDL-caching, you can do so with
ini_set ( ‘soap.wsdl_cache_enabled’ , ‘0’ );
ini_set ( ‘soap.wsdl_cache_ttl’ , ‘0’ );
?>
However you must do this before creating a SOAP object (soap_client or soap_server).
Changing the settings like above does not have any effect on already existing soap-objects.
Keep in mind if you have memory cache enabled that even if you use an updated WSDL file, it will still be using the one in memory. If you download the WSDL files yourself, avoid using memory cache as you will have no control over it, or set the TTL to a small value (default is 1 day).
Работа с веб-серверами на php посредством SOAP
Не буду останавливаться на вопросе, что такое веб-сервисы и зачем они нужны. В сети очень много статей на эту тему. Просто постараюсь вкратце показать, каким простым способом возможно создание клиента к любому веб-сервису на php.
Для использования SOAP в php необходимо подключить модуль SOAP (входит в дистрибутив php5). Под windows это делается просто – необходимо дописать (именно дописать, так как эта строка там не просто закомментирована, она отсутствует вообще) в php.ini:
extension=php_soap.dll
Не забудьте перезапустить сервер, если php у вас установлен как модуль.
Создание SOAP-клиента по WSDL-документу
Создание SOAP-клиента обычно происходит по WSDL-документу, который представляет собой XML-документ в определенном формате, полностью описывающий тот или иной веб-сервис. За подробностями по поводу WSDL – отправляю Вас на сайт консорциума W3C — www.w3.org/TR/2005/WD-wsdl20-soap11-binding-20050510.
Главное же, что необходимо знать для того, чтобы построить клиента к веб-сервису – это знать URL его WSDL-документа.
Для примера возьмем веб-сервис «Currency Exchange Rate» от xmethods.com. Адрес этого веб-сервиса, который позволяет получать курсы валют в режиме онлайн — www.xmethods.net/sd/2001/CurrencyExchangeService.wsdl.
Второй важный момент – из описания веб-сервиса необходимо получить информацию о том, какие методы этот сервис предоставляет, и какие параметры мы должны передавать ему в качестве входных значений (очень похоже на вызов обычной функции php или метода класса). Обычно эта информация содержится в описании сервиса на его сайте. Наш веб-сервис для получения курса валют предоставляет метод getRate(), которому в качестве аргументов передаются коды валют.
И последнее – важно знать, что ожидать в качестве ответа: сколько значений, какого типа и т.п. Это также можно получить из описания.
А в результате код получается очень простым и компактным, почти элементарным:
// Использование Web-сервиса
// «Currency Exchange Rate» от xmethods.com
// Создание SOAP-клиента по WSDL-документу
$client = new SoapClient(«http://www.xmethods.net/sd/2001/CurrencyExchangeService.wsdl»);
// Поcылка SOAP-запроса и получение результата
$result = $client->getRate(«us», «russia»);
echo ‘Текущий курс доллара: ’, $result, ‘ рублей’;
?>
Как видно из кода в конструктор класса SoapClient необходимо передать URL WSDL-документа и получить объект для работы с нужным веб-сервисом. Затем вызывается метод этого объекта, имя которого совпадает с именем самого метода веб-сервиса. Возвращает же этот метод желаемый нами результат.
Итак, этот простой пример иллюстрирует нам принцип построения SOAP-клиента для веб-сервисов на php. Однако в реальном приложении еще о многом придется позаботиться, в частности о том, что в момент обращения к веб-сервису он может быть временно недоступен или возвращать ошибку. Явно напрашивается использование блока try/catch/throw 🙂