Почему не работает file_get_contents? - PullRequest
11 голосов
/ 17 июля 2011

Почему 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>

Ответы [ 5 ]

31 голосов
/ 17 июля 2011

Проверка 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.

6 голосов
/ 01 октября 2013

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

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

3 голосов
/ 23 января 2014

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

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

Тогда он будет работать

3 голосов
/ 15 ноября 2012

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

1 голос
/ 19 декабря 2012
//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>
...