2016-04-26 2 views
2

У меня самая странная проблема с разбиением головы. Реальная проблема: я получаю ошибку SOAP SOAP-ERROR: Parsing WSDL: Couldn't load from 'some website' : failed to load external entityfile_get_contents() возвращает пустую строку

В прошлом это было вызвано недействительным хостом, неправильным URL-адресом и т. Д. Но сегодня у меня нет проблем с подключением к хосту.

Я использую Symfony для запуска API. Я удалил ВСЕ код мыла из API, создал простой файл test.php и запустил его из командной строки на точном сервере, на котором работает API, и он отлично работал!

Итак, я вернулся к Symfony, сбросил кеш. Все еще не работает.

Далее я решил протестировать простейшие методы, которые я смог, и ударил «file_get_contents (« URL-адрес WSDL »)` на самом верху сервиса, который вызывает этот SOAP-вызов. Он возвращает пустую строку. Ошибок в журнале ошибок нет.

Далее я попытался переместить это на контроллер. Еще пустая строка.

Я попробовал file_get_contents('https://google.com'). Тем не менее, пустая строка, независимо от того, где в контроллере или службе я ее вставляю. Но если на том же сервере я запускаю PHP-скрипт из командной строки, это не проблема.

Я даже не знаю, с чего начать показывать вам мой код. Потому что не имеет значения, находится ли в контроллере file_get_contents(), объект или службы, которые он использует. Каждый раз, когда он возвращает пустую строку.

В качестве побочного примечания, это сервер разработки. Что является точным зеркалом производства (они просто сделали образ производственного сервера). Весь API отлично работает в процессе производства, а также в локальной локальной среде разработки и в других средах, в которые он был развернут. Поэтому я полностью проиграл, почему именно этот сервер и именно это приложение.

Любая помощь приветствуется.

==

Update 1

По предложению друга я проверил allow_url_fopen как в кли php -i и апача phpinfo() и в обоих случаях он установлен в On

==

Обновление 2

Как сказал Педро, я провел тест cURL i n контроллер API. И это сработало, оно получило содержимое WDSL и, конечно, Google.

Однако он не решает мою проблему с корнем, так как SOAP не получает содержимое URL-адреса. Не очевидно file_get_contents() не работает. Использует ли клиент SOAP PHP file_get_contents() для извлечения WSDL?

==

Update 3

Для тех, кому интересно это где код не удается. Я должен опустить много класса, потому что он содержит информацию, характерную для моей компании.

<?php 

class Carrier implements CarrierInterface 
{ 
    //...omitted code 

    private function getSoapClient($wsdl) 
    { 
     // This line is what fails. 
     return new \SoapClient($wsdl , array('trace' => true)); 
    } 

    //...omitted code 

    public function quote(QuoteInterface $quote) 
    { 
     //Get the Soap Client 
     $client = $this->getSoapClient($this->quoteWSDL); 

     // The rest of the SOAP CALL 

     return $quote; 
    } 
} 

Но в общем, $this->quoteWSDL просто URL, и да, это имеет правильное значение, я проверил. Но это не удается при попытке построить клиентый SOAP с указанием SOAP-ERROR: Parsing WSDL: Couldn't load from '<url>' : failed to load external entity

==

Update 4 (с Любопытным Solution)

Перезагружаем апачское неподвижное все. Я не уверен, почему я не просто попросил SysAdmin сделать это раньше. Это похоже на IT 101 прямо там. Спасибо за вашу помощь. Но теперь мне любопытно, почему это было проблемой для начала. Weird.

ответ

2

Я предполагаю, что allow_url_fopen отключен.
Чтобы включить его, вам необходимо установить allow_url_fopen=1 на php.ini. Перезагрузите сервер Apache, чтобы перезагрузить конфигурацию.


Считаете ли вы использование curl? Вот пример:

$url = "http://google.com"; 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
$contents = curl_exec($ch); 
curl_close($ch); 

PS: Для будущих пользователей: Убедитесь, что вы читали комментарии ниже.

+0

Да, на самом деле это было проверено перед отправкой ответа. Он включен. Я не понимаю, почему он был бы отключен, так как этот dev-сервер - это образ производственного сервера. – Squeegy

+0

Я бы определенно использовал 'curl' –

+0

Я могу протестировать с помощью curl, но в конечном итоге мне нужно что-то работать с SOAP, поскольку это для общения с SOAP API. – Squeegy

Смежные вопросы