web-dev-qa-db-ja.com

file_get_contentsが機能しないのはなぜですか?

どして file_get_contentsnot私のために働く?以下のテストファイルコードでは、私がすべて検索したすべての例にこの関数がリストされているように見えますが、実行されることはありません。これはWebホスティングサービスの問題ですか?サーバーでこのコードをテストして、ジオコーディング配列の出力が実際に文字列として出力されるかどうかを確認できますか?もちろん、出力を変数に割り当てようとしていますが、このテストファイルには出力がありません。

<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>
11
PVJAZZ

チェック _file_get_contentsPHPマニュアル 戻り値。値がFALSEの場合、ファイルを読み取ることができませんでした。値がNULLの場合、関数自体は無効になります。

_file_get_contents_操作で何が問題になる可能性があるかをさらに学習するには、エラー報告とエラーの表示を有効にして実際に読み取る必要があります。

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

サーバーのINI値を確認することにより、呼び出しが失敗する理由についての詳細を取得できます。_file_get_contents_関数に直接影響する値の1つは です。 _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_を置き換えます。

31
hakre

PHPのallow_url_fopen iniディレクティブがtrueに設定され、curlも機能しない場合(方法の例については、 この回答 を参照) file_get_contents)の代わりに使用するには、サーバーにファイアウォールがあり、スクリプトが任意のURLのコンテンツを取得できないようにしている可能性があります(悪意のあるコードが物事を取得する可能性があります)。

この問題が発生したため、解決策はファイアウォール設定を編集して、問題のドメイン(またはIPアドレス)への要求を明示的に許可することであることがわかりました。

6
Nick F

ローカルファイルの場合、次のようにhtmlspecialcharsでラップする必要があります。

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

その後、それは動作します

3

_$adr_をurlencode()でラップします。私はこの問題を抱えていましたが、これで解決しました。

3
//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>
1
Rameez SOOMRO