file_get_contents函数的替代方案

时间:2018-03-26 11:38:48

标签: php html json

我正在尝试从https://nepse-data-api.herokuapp.com/data/todaysprice获取json数据。

我使用file_get_contents()函数,但我得到了错误消息msg

  

消息:require():https://在服务器中禁用了包装器   配置by allow_url_fopen = 0

现在我的问题是我使用的是共享托管,因此无法使用allow_url_fopen = 1

如何从上面的网址获取数据。

在localhost中,此代码正常运行,这是我的代码

$url = 'https://nepse-data-api.herokuapp.com/data/todaysprice'; 
$raw = file_get_contents($url);
$data = json_decode($raw);

1 个答案:

答案 0 :(得分:0)

如果您使用PHP从某个服务器检索数据,您可能会遇到可能对您有用的问题,但客户抱怨很多错误。您很可能依赖于allow_url_fopen设置为true的事实。通过这种方式,您可以将任何内容 - 本地路径或网址 - 放入函数调用中,例如includesimplexml_load_file

如果您想解决此问题,可以建议您的客户在其php.ini文件中进行必要的更改。大多数情况下,这不是一个选项,因为托管公司出于安全原因决定禁用此功能。由于几乎每个人都安装了cURL,我们可以使用它来从另一个Web服务器检索数据。

<强>实施

我将提供一个帮助您加载XML文件的包装器。如果启用了simplexml_load_file,它会使用allow_url_fopen。如果禁用此功能,则会使用simplexml_load_string和cURL。如果这些都不起作用,我们将抛出异常,因为我们无法加载数据。

class XMLWrapper {

  public function loadXML($url) {
    if (ini_get('allow_url_fopen') == true) {
      return $this->load_fopen($url);
    } else if (function_exists('curl_init')) {
      return $this->load_curl($url);
    } else {
      // Enable 'allow_url_fopen' or install cURL.
      throw new Exception("Can't load data.");
    }
  }

  private function load_fopen($url) {
    return simplexml_load_file($url);
  }

  private function load_curl($url) {
    $curl = curl_init($url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    $result = curl_exec($curl);
    curl_close($curl);
    return simplexml_load_string($result);
  }

}

//For Json

class JsonWrapper {

  public function loadJSON($url) {
    if (ini_get('allow_url_fopen') == true) {
      return $this->load_fopen($url);
    } else if (function_exists('curl_init')) {
      return $this->load_curl($url);
    } else {
      // Enable 'allow_url_fopen' or install cURL.
      throw new Exception("Can't load data.");
    }
  }

  private function load_fopen($url) {
    $raw = file_get_contents($url);
    $data = json_decode($raw);
    return $data;
  }

  private function load_curl($url) {
    $curl = curl_init($url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    $result = curl_exec($curl);
    curl_close($curl);
    $data = json_decode($result);
    return $data;
  }

}

代码非常简单,创建给定类的实例并调用loadXML方法。它将调用最终加载XML的right私有方法。加载一些XML只是一个例子,你可以使用这种技术,例如includerequire