2

file_get_contentphpスクリプト実行の結果をダウンロードするためにを使用している場合:

    //mainfile.php
    $ctx = stream_context_create(array(
        'http' => array(
            'timeout' => $this->cfg['gp_timeout']/2
            )
        )
    );
    $url_xml='http://test.server.eu/webgatescript.php?getphoto&param1=1&test=1&param2=2&param3=3';
    $webgateResponse=file_get_contents($url_xml,false,$ctx);

私が知っているように、関数は戻り値をfile_get_content返しますstring-ファイルが存在しない場合はファイルの内容を返しますFALSE

リモートファイルがコンテンツを返すことを100%確信しているにもかかわらず、関数file_get_contentが戻ることがあります(私の場合、xmlファイルにはアクセスとログがあります)。FALSEさらに、リモートスクリプトの実行終了後、数マイクロ秒をfile_get_content返しますFALSEが、タイムアウトが設定された場合よりも時間がかかりません。

ログの一部:

10:22:04<?xml version="1.0" encoding="UTF-8"?>
10:22:16<response><htlName/><lang/><texts/></response>
10:22:46<?xml version="1.0" encoding="UTF-8"?>
10:22:58<response><htlName/><lang/><texts/></response>
10:23:28<?xml version="1.0" encoding="UTF-8"?>
10:23:29<response><htlName/><lang/><texts/></response>
10:23:59<?xml version="1.0" encoding="UTF-8"?>
10:23:59<response><htlName/><lang/><texts/></response>
10:24:29<?xml version="1.0" encoding="UTF-8"?>
10:24:29<response><htlName/><lang/><texts/></response>

Warning: file_get_contents(http://test.server.eu/webgatescript.php?getphoto&param1=1&test=1&param2=2&param3=3): failed to open stream: HTTP request failed!  in /home/www/mainfile.php on line 22

Call Stack:
    0.0002      93616   1. {main}() /home/www/mainfile.php:0
      175.5346     109072   2. file_get_contents(string(172), bool, resource(14) of type     (stream-context)) /home/www/mainfile.php:22

10:24:5910:25:46<?xml version="1.0" encoding="UTF-8"?>
10:25:47<response><htlName/><lang/><texts/></response>

私はいくつかのテストを行いました。そのうちの1つはファイルを実行mainfile.phpしていましたexec(この同じテストサーバーに両方のファイルがありますが、2つの別々のシステムになる本番サーバーにあります)

    exec("php webgatescript.php >> tom2.log");

そして、実行のすべてのケースwebgatescript.phpはロギングです。

4

1 に答える 1

1

私は頼りにしないでしょうfile_get_contents

多くの(共有)Webサーバーはfile_get_contents、他のサーバーからファイルをフェッチすることを許可していませんが、 cURLの使用は許可しています。

$url = 'http://www.stackoverflow.com';

// start cURL
$ch = curl_init($url);

// set options (http://www.php.net/manual/en/function.curl-setopt.php)
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 4); // four seconds until connect timeout
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // we want the response in a variable
curl_setopt($ch, CURLOPT_TIMEOUT, 4); // four seconds until timeout

$response = curl_exec($ch); // get contents

curl_close($ch); // close the cURL handle

簡単ではありませんが、非常に信頼性があります。


私は(おそらく)答えを見つけました!前述したようにfile_get_contents、URLからファイルを取得することを許可または禁止するオプション(およびその他の機能)を設定できます。

ファイルシステムとストリームの構成オプションを見つけました。このallow_url_fopen設定を使用して、を使用してURLを開くことを許可または禁止することができます。これは、にもfopen適用されfile_get_contentsます。デフォルトで有効になっているはずなので、なぜ機能しないのかわかりません。

いずれにせよ、私はまだプロcURLです;)

于 2013-02-14T10:26:35.220 に答える