2010-11-13 3 views
17

Я не решаюсь задавать этот вопрос, потому что это выглядит странно. Но так или иначе. Только в случае, если кто-то сталкивался с такой же проблемой уже ... файловой функции (fopem, файловые, file_get_contents) ведут себя очень странно для HTTP: // оберткаfile_get_contents возвращает пустую строку

  • это, казалось бы, работает. ошибок не было. fopen() возвращает ресурс.
  • он не возвращает данные для всех конечно работающих URL-адресов (например, http://google.com/).
    возвращает файл пустой массив, file_get_contents() возвращает пустую строку, Fread возвращает ложное
  • для всех преднамеренно неправильных ссылок (например, http://goog973jd23le.com/) он ведет себя точно так же, за исключением маленького [предположительно домена поиска] тайм-аут, после которого я не error (while should!), но пустая строка.
  • url_fopen_wrapper включен
  • завитка (как командной строки и версии PHP) работает отлично, все остальные утилиты и приложения работают нормально, локальные файлы, открытые в порядке

This error кажется неприменим, потому что в моем случае это не работает для каждого URL-адреса или хоста.

PHP-FPM 5.2.11 Linux версия 2.6.35.6-48.fc14.i686 ([email protected])

+0

Есть ли причина, почему вы не хотите использовать Libcurl? Кажется, что это работает, это может стать идеальной заменой для вас. – Treffynnon

+1

@Treffynnon Я сейчас переписываю код для завивки, но все еще хочу знать, что не так с файлом_get_contents() –

+0

Для какого конкретного URL он не работает? – mario

ответ

22

Я исправил эту проблему на своем сервере (запустив PHP 5.3.3 на Fedora 14), удалив -with-curlwrapper из конфигурации PHP и восстановив его.

+1

Сработало это снова сегодня, на этот раз, когда default_socket_timeout установлен в 0 (что должно означать безграничное), он немедленно сработал. –

+0

Сохраненный мой день, очень полезно !!! Спасибо @ Eric Caron –

4

При использовании HTTP поток обертку PHP создает массив для вас вызывается $http_response_header после file_get_contents() (или любое другое семейство функций f). Это содержит полезную информацию о состоянии ответа. Не могли бы вы сделать var_dump() этого массива и посмотреть, дает ли он вам больше информации об ответе?

Это действительно странная ошибка, которую вы получаете. Единственное, о чем я могу думать, это то, что что-то еще на сервере блокирует HTTP-запросы от PHP, но потом я не понимаю, почему cURL все равно будет в порядке ...

+0

var_dump на http_header_response дает NULL. –

+0

Вы имели в виду $ http_response_header, не так ли? – Jeremy

2

HTTP-поток, зарегистрированный в вашей установке PHP ? Найдите «Зарегистрированные потоки PHP» в своем phpinfo() выводах. Моя говорит: «https, ftps, compress.zlib, compress.bzip2, php, file, glob, data, http, ftp, phar, zip».

Если нет http, установите allow_url_fopen на номер php.ini.

-1

Что вам нужно сделать с fsockopen?

Является ли тест изолированным от другого кода?

12

Звучит как ошибка. Но только для потомков, вот несколько вещей, которые вы, возможно, захотите отладить.

  • allow_url_fopen: уже протестировали
  • PHP под Apache может вести себя по-другому, чем PHP-CLI и будет намекать на CHROOT/SELinux/FastCGI/и др.ограничения безопасности
  • локальный брандмауэр: маловероятно, так как завиток работает
  • блокировки агента пользователя: это довольно часто на самом деле, сайты блокируют сканеры и неизвестные клиент
  • прозрачного прокси-сервер от вашего провайдера, который либо Mangles или блоков (PHP USER- агент или не агент пользователя может быть истолкован как вредоносные программы)
  • PHP потоком проблем оберток

Во всяком случае, первое давайте доказательство того, что ПГПС обработчики потока функциональны:

<?php 
    if (!file_get_contents("data:,ok")) { 
      die("Houston, we have a stream wrapper problem."); 
    } 

Затем попытайтесь выяснить, действительно ли PHP делает настоящие HTTP-запросы. Первый открытый Netcat на консоли:

nc -l 80000 

И отлаживать только с:

<?php 
    print file_get_contents("http://localhost:8000/hello"); 

И здесь вы можете попробовать связаться с PHP, увидеть, если что-нибудь возвращается, если варьировать ответ. Сначала введите недействительный ответ в netcat. Если нет ошибки, ваш пакет PHP будет обработан.

(Вы также можете попробовать связь по «TCP: // ..» обрабатывать потом.)

Далее экспериментирует с параметрами оберток HTTP потока. Используйте http://example.com/ буквально, который, как известно, работает и никогда не блокирует пользовательские агенты.

$context = stream_context_create(array("http"=>array(
    "method" => "GET", 
    "header" => "Accept: xml/*, text/*, */*\r\n", 
    "ignore_errors" => false, 
    "timeout" => 50, 
)); 

print file_get_contents("http://www.example.com/", false, $context, 0, 1000); 

Я думаю ignore_errors очень актуальна здесь. Но проверьте http://www.php.net/manual/en/context.http.php и постарайтесь установить protocol_version в 1.1 (получится chunked и misinterpreted ответ, но, по крайней мере, мы увидим, ничего).

Если это не удастся, попробуйте взломать http-обертку.

<?php 
    ini_set("user_agent" , "Mozilla/3.0\r\nAccept: */*\r\nX-Padding: Foo"); 

Это не только установит User-Agent, но и добавит дополнительные заголовки. Если есть проблема с обработкой при построении запроса в оболочке HTTP-потока, то это может в конечном итоге ее уловить.

В противном случае попытайтесь отключить любые расширения Zend, Suhosin, PHP xdebug, APC и другие модули ядра. Там могут быть помехи. Иначе это потенциально проблема, относящаяся к пакету Fedora. Попробуйте новую версию, посмотрите, сохраняется ли она в вашей системе.

-1

У меня была такая же проблема в Windows после установки XAMPP 1.7.7. В конце концов мне удалось решить, добавив следующую строку в php.ini (в то время как имеющие allow_url_fopen = On):

расширение = php_openssl.dll

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