如何将 allow_url_fopen 更改为 cURL 模式?

Posted

技术标签:

【中文标题】如何将 allow_url_fopen 更改为 cURL 模式?【英文标题】:How to Change allow_url_fopen on to cURL Mode? 【发布时间】:2016-10-04 18:37:13 【问题描述】:

几天前我遇到了file_get_contents 的问题,因为服务器有allow_url_fopen=0 规则

我试图通过使用allow_url_fopen=1 制作一个 php.ini 来改变这一点,但它不起作用。这是有问题的代码部分:

if($state == 5)
       
        $request_services=RequestServices::where('request_id', $current_request->id)->first();
        $address = urlencode(Input::get('address'));
        $end_address = json_decode(file_get_contents("https://maps.googleapis.com/maps/api/geocode/json?address=$address"),TRUE);

        $end_location = $end_address['results'][0]['geometry'];
        $latitude = $end_location['location']['lat'];
        $longitude = $end_location['location']['lng'];

        $request_id = $current_request->id;
        $walk_location_last = WalkLocation::where('request_id',$request_id)->orderBy('created_at','desc')->first();

        if($walk_location_last)
        
            $distance_old = $walk_location_last->distance;
            $distance_new = distanceGeoPoints($walk_location_last->latitude,$walk_location_last->longitude,$latitude,$longitude);
            $distance = $distance_old + $distance_new;
            $settings = Settings::where('key','default_distance_unit')->first();
            $unit = $settings->value;
            $distance = $distance;
        
        else
            $distance = 0;
        

错误在这一行:

$end_address = json_decode(file_get_contents("https://maps.googleapis.com/maps/api/geocode/json?address=$address"),TRUE);

它使用谷歌地图页面 URL 调用 file_get_contents。我很难将其更改为 cURL,因为已阅读的内容是正确且最佳的选择。您能否通过使此代码作为 cURL 工作来帮助我。

提前致谢。我附上页面调试模式的屏幕截图

Image with error

【问题讨论】:

您的问题可能有很多原因,您可能会错过一些扩展或可能存在配置问题。还有一个使用curl的替代解决方案。 【参考方案1】:

你必须确保以下几点:

HTTPS 包装器

确保您已安装 HTTPS 包装器:

$w = stream_get_wrappers();

echo 'openssl: ',  extension_loaded  ('openssl') ? 'yes':'no', "\n";
echo 'http wrapper: ', in_array('http', $w) ? 'yes':'no', "\n";
echo 'https wrapper: ', in_array('https', $w) ? 'yes':'no', "\n";

结果必须是:

openssl:是的

http 包装器:是的

https 包装器:是的

PHP.ini

确保选项已启用:

allow_url_fopen = On

替代方案

您也可以使用cUrl:

function getSslPage($url) 
    $ch = curl_init();

    // THIS LINE DISABLES CERTIFICATE VERIFICATION!!!
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);

    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_REFERER, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

    $result = curl_exec($ch);
    curl_close($ch);

    return $result;

有关更多信息,请查看以下问题的答案:

How to get file_get_contents() to work with HTTPS? How to enable HTTPS stream wrappers

【讨论】:

以上是关于如何将 allow_url_fopen 更改为 cURL 模式?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 \\ 更改为 \

如何将 SOAP 调用交换为 cURL,以在 allow_url_fopen 限制内工作?

如何使用带有c ++的opencv库将下图中的黑色像素更改为红色像素

在Objective C中点击后退按钮时如何将界面方向从横向更改为纵向

如何将材料ui步进器中的数字更改为字母,如a,b,c,d

如何将 LLVMPass long opt 命令更改为简单命令