Почему файлы 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>

Ответ 1

Отметьте 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, независимо от того, какие параметры конфигурации установлены. Чтобы сделать это для своего собственного script, просто замените <? или <?php.

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

Затем он работает

Ответ 5

//JUST ADD urlencode();
$url = urlencode("http://maps.googleapis.com/maps/api/geocode/json?address=$adr&sensor=false");
<html>
<head>        
<title>Test File</title>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"> 
</script>
</head>
<body>
<?php    
$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>