当我使用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¶m1=1&test=1¶m2=2¶m3=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¶m1=1&test=1¶m2=2¶m3=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
的情况都在记录。
答案 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 Options。 allow_url_fopen
设置可用于允许或禁止使用fopen
打开网址,这也适用于file_get_contents
。它应该默认启用,所以我不知道它为什么不适合你。
无论哪种方式,我仍然是亲...;