2

当我使用 afile_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.phpexec同一台测试服务器上有两个文件,但在生产服务器上将是两个独立的系统)

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

并且每个跑步案例都在webgatescript.php记录。

4

1 回答 1

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 Options。该allow_url_fopen设置可用于允许或禁止打开 URL 的 using fopen,这也适用于file_get_contents。它应该默认启用,所以我不知道为什么它不适合你。

无论哪种方式,我仍然支持 cURL ;)

于 2013-02-14T10:26:35.220 回答