Выявление первопричины тайм-аута в PHP - PullRequest
0 голосов
/ 01 декабря 2011

Некоторое время назад я заметил некоторые ошибки Soap, исходящие из моего приложения, и я начал исследовать их. Вещи как:

  • SoapClient::SoapClient(http://###.###.###.###:8080/path/to/some.wsdl): failed to open stream: HTTP request failed!
  • SoapClient::SoapClient(): I/O warning : failed to load external entity "http://###.###.###.###:8080/path/to/some.wsdl"
  • SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://###.###.###.###:8080/path/to/some.wsdl' : failed to load external entity "http://###.###.###.###:8080/path/to/some.wsdl"

На удаленном сервере это выглядело как тайм-аут (кэширование WSDL было отключено). После отскока этого сервера и безуспешно я попытался просто file_get-contents() WSDL, чтобы увидеть, что произойдет ...

Без кубиков. Примерно через 20 секунд я получил ту же ошибку потока:

file_get_contents(http://###.###.###.###:8080/path/to/some.wsdl) [<a href='function.file-get-contents'>function.file-get-contents</a>]: failed to open stream: HTTP request failed!

В последнем случае я попытался прочитать содержимое с помощью функций curl_*, и я действительно получил то, что искал.

... tl; др?

  • SoapClient и file_get_contents, по-видимому, имеют тайм-аут (хотя это и не явный "Не удалось открыть поток, время соединения истекло")
  • Это кажется связанным с потоками, так как curl дает мне то, что я ищу.
  • У меня есть много кода, который зависит от SoapClient и file_get_contents, поэтому переключение на полностью скручиваемое решение на самом деле не вариант.
  • Это не проблема DNS, так как я могу хорошо разрешать внешние имена (а моим целевым ресурсом является IP)
  • allow_url_fopen включено.

Есть идеи?

1 Ответ

0 голосов
/ 02 декабря 2011

allow_url_fopen должно быть On в ваших настройках PHP для file_get_contents для работы с URL. В противном случае вы получите именно эту ошибку. Дважды проверьте настройки PHP, загрузив страницу с помощью вызова phpinfo();, чтобы убедиться, что они не переопределяются другим файлом php.ini или .htaccess.

В противном случае я бы предположил проблему с брандмауэром, но вы говорите, что curl работает изнутри PHP, который будет открывать сокеты таким же образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...