file_get_contents()
从远程服务器获取json响应。虽然
file_get_contents()
在本地文件上正常工作,但不能与http或https一起使用,但它给了我以下错误file_get_contents(): http:// wrapper is disabled in the server configuration by allow_url_fopen=0 in
和file_get_contents(https://api.domain.com/resolve.json?url=blablabla): failed to open stream: no suitable wrapper could be found
..它是一台专用服务器我有WHM ..我已经尝试过在WHM PHP配置编辑器上设置allow_url_fopen = on
,但这没有用。在
allow_url_fopen = on
中创建一个php.ini文件错误发生的目录,但此目录不起作用。在PHP脚本的开头添加了
ini_set('allow_url_fopen', 'On');
,但此目录不起作用。我知道我可以改用Curl,但我想要知道为什么它不起作用..该脚本在其他服务器和本地主机上正常工作
update:
phpinfo();
给我
/>
allow_url_fopen Off
allow_url_include Off
always_populate_raw_post_data Off
,这意味着我的php.ini更改未生效..我在做什么错了?
#1 楼
通过ssh登录到服务器,然后在文件中输入sudo nano /etc/php5/apache2/php.ini //<<<< ubuntu/debian server, might differ for you
,只需按
"ctrl + w"
并输入"allow_url_fopen"
和Return,很可能您会首先进行解释,因此重复搜索几次。现在,您可以将条目从allow_url_fopen=0
更改为
allow_url_fopen=1
按
"ctrl + x"
并确认文件保存为"y"
。然后键入
sudo service apache2 restart
这将重新启动apache,以便可以加载新的php.ini配置。完成这些步骤后,您应该可以从外部使用
file_get_contents
。SIDENOTE
如果找不到php.ini文件,则会找到
phpinfo()
顶部的部分中已加载的php.ini文件的路径评论
谢谢..我忘了检查加载的配置文件..达到目的了..我有一个旧的php.ini public_html文件夹..但是子文件夹中的文件不应该覆盖它吗?
–卡马尔·萨利赫(Kamal Saleh)
2014年12月23日在3:23
这些文件放在我放置新php.ini的子目录中
–卡马尔·萨利赫(Kamal Saleh)
2014年12月23日下午3:26
嗯,我认为主要加载的配置文件将始终在上述位置。
– baao
2014年12月23日下午3:27
#2 楼
$url= 'https://example.com';
$arrContextOptions=array(
"ssl"=>array(
"verify_peer"=>false,
"verify_peer_name"=>false,
),
);
$response = file_get_contents($url, false, stream_context_create($arrContextOptions));
这将使您无论是HTTPS还是从URL中获取内容,无需更改php ini。
评论
谢谢。这个额外的配置正是解决我们问题的方法。我在这里写了另一个问题的答案(关注问题的突发性)。我引用了您的回答作为我的资料来源:stackoverflow.com/a/48305167/1385429
–克里斯蒂安·韦斯特贝克(Christiaan Westerbeek)
18年1月17日在16:03
不同意,MPDF也使用file_get_contents和许多其他库,您是否为将更改作为其核心代码而推荐更改?
–费尔南多·托雷斯(Fernando Torres)
1月29日19:59
#3 楼
使用curl作为file_get_contents()的替代方法,这是我正在使用的功能function url_get_contents ($Url) {
if (!function_exists('curl_init')){
die('CURL is not installed!');
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $Url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec($ch);
curl_close($ch);
return $output;
}
#4 楼
如果您具有root用户访问权限,请编辑php.ini
(通常位于/etc/php.ini
。)。如果您没有root用户访问权限,请尝试添加
ini_set('allow_url_fopen', 'On');
或ini_set('allow_url_fopen', '1');
。 php.ini
,尝试在PHP脚本中使用phpinfo()
来找到php.ini
的位置。#5 楼
$id = $_GET['id'] ;
$api_url = "http://localhost/../API.php?id='$id' ";
$port = 80;
$ch = curl_init( );
curl_setopt ( $ch, CURLOPT_URL, $api_url );
curl_setopt ( $ch, CURLOPT_PORT, $port );
curl_setopt ( $ch, CURLOPT_POST, 1 );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
// Allowing cUrl funtions 20 second to execute
curl_setopt ( $ch, CURLOPT_TIMEOUT, 5 );
// Waiting 20 seconds while trying to connect
curl_setopt ( $ch, CURLOPT_CONNECTTIMEOUT, 5 );
$response_string = curl_exec( $ch );
echo $response_string;
这是解决Web请求问题的最佳方法
#6 楼
这项工作很完美:function get_site($url) {
$file = fopen($url, 'r');
if(!$file) return;
$buffer='';
while(!feof($file)) {
$buffer .= fgets($file, 4096);
}
fclose($file);
return $buffer;
}
#7 楼
除了上述答案外,SELinux设置可能还不允许您从httpd连接。为此,您可以参考此链接https://drib.tech/programming/php-file_get_contents-not-working
它对我有用
评论
allow_url_fopen可能已被覆盖,因此您无法打开它。即使使用了php.ini等,也可以运行phpinfo()来查看它是否真的被更改了。我的建议是使用卷发。重新启动Web服务器服务httpd重新启动后,在/ etc /中编辑php.ini