函数file_get_content偶尔不起作用

时间:2013-02-14 10:22:27

标签: php

当我使用file_get_content下载php脚本执行结果时:

    //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

有时候函数file_get_content会返回FALSE,尽管我100%确定远程文件返回了内容(在我的情况下是xml文件,我有访问权限和日志)。此外,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>

我做了一些测试,其中一个是在mainfile.php中运行文件exec(我在同一个测试服务器上有两个文件,但在生产服务器上将是两个独立的系统)

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

并且每个运行webgatescript.php的情况都在记录。

1 个答案:

答案 0 :(得分:1)

我不会依赖file_get_contents

许多(共享)网络服务器不允许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获取文件的选项。

我找到了Filesystem and Streams Configuration Optionsallow_url_fopen设置可用于允许或禁止使用fopen打开网址,这也适用于file_get_contents。它应该默认启用,所以我不知道它为什么不适合你。

无论哪种方式,我仍然是亲...;