Почему не работает file_get_contents?

Почему file_get_contents не у меня работает? В приведенном ниже коде тестового файла кажется, что во всех примерах, которые я искал, эта функция указана, но она никогда не выполняется. Это проблема с хостингом? Может ли кто-нибудь протестировать этот код на своем сервере, чтобы увидеть, действительно ли выходные данные массива геокодирования распечатываются в виде строки? Конечно, я пытаюсь назначить вывод переменной, но здесь, в этом тестовом файле, нет вывода....

<html>
<head>        
<title>Test File</title>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"> 
</script>
</head>
<body>
<?    
$adr = 'Sydney+NSW';
echo $adr;
$url = "http://maps.googleapis.com/maps/api/geocode/json?address=$adr&sensor=false";
echo '<p>'.$url.'</p>';
echo file_get_contents($url);
print '<p>'.file_get_contents($url).'</p>';
$jsonData   = file_get_contents($url);
echo $jsonData;
?>
</body>
</html>

person PVJAZZ    schedule 17.07.2011    source источник
comment
Какое сообщение об ошибке вы получаете? Вы вообще получаете сообщение об ошибке? Вся страница возвращается и просто не дает желаемого результата?   -  person Mark Tomlin    schedule 17.07.2011
comment
каков результат ini_get('allow_url_open')?   -  person Gordon    schedule 17.07.2011
comment
stackoverflow.com/questions/4761404/ As maps.googleapis.com/maps/api/geocode/ — это JSON, почему бы не попробовать подход, предложенный в ссылке выше, используя cURL?   -  person sdolgy    schedule 05.08.2011
comment
Для будущих читателей этих комментариев, я думаю, @Gordon хотел спросить, каков был результат ini_get('allow_url_fopen'). Стоит проверить, установлен он или нет.   -  person Joundill    schedule 24.08.2016


Ответы (6)


Проверьте file_get_contents Руководство по PHP, возвращаемое значение. Если значение равно FALSE, файл не может быть прочитан. Если значение равно NULL, то сама функция отключена.

Чтобы узнать больше о том, что может пойти не так с операцией file_get_contents, вы должны включить отчеты об ошибках и отображение ошибок, чтобы их можно было прочитать.

# Enable Error Reporting and Display:
error_reporting(~0);
ini_set('display_errors', 1);

Вы можете получить более подробную информацию о том, почему вызов не работает, проверив значения INI на вашем сервере. Одно значение напрямую влияет на функцию file_get_contents: allow_url_fopen< /а>. Вы можете сделать это, запустив следующий код. Обратите внимание, что если он сообщает, что fopen не разрешен, вам придется попросить своего провайдера изменить этот параметр на вашем сервере, чтобы любой код, требующий этой функции, работал с URL-адресами.

<html>
    <head>        
        <title>Test File</title>
        <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false">
        </script>
    </head>
    <body>
<?php

# Enable Error Reporting and Display:
error_reporting(~0);
ini_set('display_errors', 1);

$adr = 'Sydney+NSW';
echo $adr;
$url = "http://maps.googleapis.com/maps/api/geocode/json?address=$adr&sensor=false";
echo '<p>'.$url.'</p>';

$jsonData = file_get_contents($url);

print '<p>', var_dump($jsonData), '</p>';

# Output information about allow_url_fopen:
if (ini_get('allow_url_fopen') == 1) {
    echo '<p style="color: #0A0;">fopen is allowed on this host.</p>';
} else {
    echo '<p style="color: #A00;">fopen is not allowed on this host.</p>';
}


# Decide what to do based on return value:
if ($jsonData === FALSE) {
    echo "Failed to open the URL ", htmlspecialchars($url);
} elseif ($jsonData === NULL) {
    echo "Function is disabled.";
} else {
   echo $jsonData;
}

?>
    </body>
</html>

Если все это не работает, это может быть связано с использованием коротких открытых тегов <?. Поэтому пример кода в этом ответе был изменен, чтобы использовать <?php для правильной работы, поскольку он гарантированно будет работать во всех версиях PHP, независимо от того, какие параметры конфигурации установлены. Чтобы сделать это для собственного скрипта, просто замените <? или <?php.

person Community    schedule 17.07.2011
comment
‹?php, не имеет большого значения для поведения gile_get_contents(). - person Shamim Hafiz; 17.07.2011
comment
@Shamim, но это будет иметь значение для всего скрипта, если короткие открытые теги отключены - person Gordon; 17.07.2011
comment
Это все зависит на самом деле. Попробуйте дать ответ, который будет охватывать все доступные параметры конфигурации. Я думаю, что это само попадает в скобки, так как <?php всегда будет работать, а <? может и не быть. Так что я думаю, что это нормальный ответ. - person Mark Tomlin; 17.07.2011
comment
@Mark Tomlin: Этот ответ является вики сообщества, не стесняйтесь добавлять свои мысли (если они еще не раскрыты). - person hakre; 17.07.2011
comment
Это отличный ответ. Кажется, он охватывает все причины, по которым код OP может дать сбой, и сообщает ему / ей, как отлаживать вызов функции. Если вызов функции в конечном итоге возвращает NULL, то он/она может уйти и выяснить, почему это может быть... с помощью ответа Марка Томлина, я уверен. - person Lightness Races in Orbit; 17.07.2011
comment
Да, я объединю свой ответ с этим. - person Mark Tomlin; 17.07.2011
comment
Я не уверен, что если возвращается NULL, это означает, что разрешение URL-адреса fopen отключено. Я думаю, что если он выключен, он вернет false. Поэтому, вероятно, его следует просто отображать для информации перед вызовом функции, так что это не проблема :) - person hakre; 17.07.2011
comment
Хорошо, большое спасибо. Будучи новичком в этом, и немного больше изучив ваши подсказки здесь, я использовал учетную запись в Yahoo! веб-хостинга, и они заявили, что они заявили, что против их угроз безопасности было установить для параметра allow_url_fopen значение On или изменить любые другие элементы в файле php.ini. Итак... покидаем Yahoo! и переходим на веб-хостинг Joomla... спасибо за вашу помощь. - person PVJAZZ; 18.07.2011
comment
хм, разве ~ не битовый оператор, а ~0 == -1? - person superhero; 19.06.2017
comment
@superhero: Да и да, см. 3v4l.org/kUORP — также - является арифметическим оператором. - person hakre; 19.06.2017
comment
Я предполагаю, что мой вопрос будет заключаться в том, зачем идти длинным путем (не очень длинным) вместо того, чтобы просто набирать -1 с самого начала? @hakre Я предполагаю, что нет причин, но если так; Мне интересно знать :) - person superhero; 19.06.2017
comment
Извините, если это вызвало путаницу. Используйте -1 или ~ 0, оба должны быть взаимозаменяемы для битовой маски. - person hakre; 19.06.2017

Если для директивы PHP allow_url_fopen ini установлено значение true, и если curl тоже не работает (см. этот ответ для примера как использовать его вместо file_get_contents), тогда проблема может заключаться в том, что на вашем сервере установлен брандмауэр, не позволяющий сценариям получать содержимое произвольных URL-адресов (что потенциально может позволить вредоносному коду получать данные).

У меня была эта проблема, и я обнаружил, что решение для меня состояло в том, чтобы изменить настройки брандмауэра, чтобы явно разрешить запросы к рассматриваемому домену (или IP-адресу).

person Nick F    schedule 01.10.2013

Если это локальный файл, вы должны обернуть его в htmlspecialchars следующим образом:

    $myfile = htmlspecialchars(file_get_contents($file_name));

Тогда это работает

person Stefan Gruenwald    schedule 23.01.2014

Оберните $adr в urlencode(). У меня была эта проблема, и это решило ее для меня.

person Michael J. Calkins    schedule 15.11.2012
comment
Вы можете быть осторожны с этим подходом, потому что urlencode() сделает ваш возможный адрес длиннее и может превысить максимальную длину, разрешенную file_get_contents() - person Hussam; 27.09.2013
comment
@Hussam Я только что прочитал документы, и это не ограничение file_get_contents(). php.net/manual/en/function.file-get-contents. php Только браузеры, когда вы вводите его в адресной строке, но даже в этом случае вам придется писать от 2 КБ до 4 КБ, чтобы нарушить этот макс. - person Michael J. Calkins; 27.09.2013

Ошибка может заключаться в том, что вам нужно изменить права доступа к папке и файлу, к которым вы собираетесь получить доступ. Если вам нравится сервис GoDaddy, вы можете получить доступ к файлу и изменить разрешение или с помощью ssh использовать команду, например:

sudo chmod 775 file.jpeg

а затем вы можете получить доступ, если вышеупомянутые проблемы не являются вашим случаем.

person Nadeem    schedule 24.02.2021
comment
Это опасно, в большинстве случаев следует использовать только 775. - person Andrew; 24.03.2021
comment
я изменил это, и я считаю, что проблема может быть в разрешении - person Nadeem; 26.03.2021

person    schedule
comment
Какой ужасный код! PHP, смешанный с HTML и открывающий короткие теги PHP. Это сломает и смутит новых людей. Да, я знаю, что это 2012 год. - person Branndon; 19.05.2017