我有一个使用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 ..我&已经尝试了
allow_url_fopen = on
但这没有用。allow_url_fopen = on
创建一个php.ini文件,但这不起作用。ini_set('allow_url_fopen', 'On');
添加到PHP脚本的开头但这没有用。我知道我可以使用Curl,但我想知道为什么这不起作用..脚本在其他服务器和localhost上正常工作
更新:
phpinfo();
给了我
allow_url_fopen Off
allow_url_include Off
always_populate_raw_post_data Off
这意味着我的php.ini更改没有生效..我做错了什么?
答案 0 :(得分:7)
$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,无需在php ini中进行更改。
答案 1 :(得分:3)
通过ssh登录您的服务器并输入
sudo nano /etc/php5/apache2/php.ini //<<<< ubuntu/debian server, might differ for you
在文件中,只需按"ctrl + w"
并输入"allow_url_fopen"
并返回,很可能您会先解释,所以重复搜索几次。现在您可以从
allow_url_fopen=0
到
allow_url_fopen=1
按"ctrl + x"
并使用"y"
确认文件保存。
然后输入
sudo service apache2 restart
这将重启apache,以便可以加载新的php.ini配置。完成这些步骤后,您应该可以在外部使用file_get_contents
。
旁注
如果找不到您的php.ini文件,您将在phpinfo()
答案 2 :(得分: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;
}
答案 3 :(得分:2)
如果您具有超级用户权限,请修改php.ini
,通常位于/etc/php.ini
。
如果您没有超级用户权限,请尝试添加ini_set('allow_url_fopen', 'On');
或ini_set('allow_url_fopen', '1');
。
如果您看不到php.ini
,请尝试在PHP脚本中使用phpinfo()
来查找php.ini
位置。
答案 4 :(得分:0)
$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请求问题的最佳方法
答案 5 :(得分:0)
这项工作很完美:
function get_site($url) {
$file = fopen($url, 'r');
if(!$file) return;
$buffer='';
while(!feof($file)) {
$buffer .= fgets($file, 4096);
}
fclose($file);
return $buffer;
}
答案 6 :(得分:0)
除了上述答案外,SELinux设置可能还不允许您从httpd连接。为此,您可以参考此链接
installing it using pip
对我有用