37

我有这个参数来下载 XML 文件:

wget --http-user=user --http-password=pass http://www.example.com/file.xml

我如何在 php 中使用它来打开这个 xml 文件?

4

10 回答 10

57

wget

wget是一个 linux 命令,而不是 PHP 命令,所以要运行它,你需要使用exec,这是一个用于执行 shell 命令的 PHP 命令。

exec("wget --http-user=[user] --http-password=[pass] http://www.example.com/file.xml");

如果您正在下载一个大文件 - 并且想要监控进度,这可能很有用,但是在处理您只对内容感兴趣的页面时,有一些简单的功能可以做到这一点。

exec功能默认启用,但在某些情况下可能会禁用。此配置选项驻留在您的php.ini, 启用,execdisabled_functions配置字符串中删除。

选择

使用file_get_contents我们可以检索指定 URL/URI 的内容。当您只需要将文件读入变量时,这将是替代 curl 的完美功能 -在构建 URL 时遵循URI 语法。

// standard url
$content = file_get_contents("http://www.example.com/file.xml");

// or with basic auth
$content = file_get_contents("http://user:pass@www.example.com/file.xml");

如前所述Sean the Bean- 您可能还需要在 php.ini 中更改 以允许在此方法中使用 URL,但是,默认情况下应该是这样。allow_url_fopen true

如果您想将该文件存储在本地,则有一个file_put_contents将其写入文件的功能,结合以前的功能,这可以模拟文件下载:

file_put_contents("local_file.xml", $content);
于 2013-02-07T07:12:07.697 回答
38

如果目标只是在应用程序中加载内容,您甚至不需要使用wget

$xmlData = file_get_contents('http://user:pass@example.com/file.xml');

请注意,如果allow_url_fopen在 php.ini 或 Web 服务器配置(例如 httpd.conf)中禁用(默认启用)此功能将不起作用。

如果您的主机明确禁用它,或者您正在编写库,建议使用cURL或抽象功能的库,例如Guzzle

use GuzzleHttp\Client;

$client = new Client([
  'base_url' => 'http://example.com',
  'defaults' => [
    'auth'    => ['user', 'pass'],
]]);

$xmlData = $client->get('/file.xml');
于 2013-02-07T07:11:44.843 回答
11

您可以使用curl为了获取数据和被识别(对于“基本”和“摘要”身份验证),而不需要扩展权限(如 exec 或 allow_url_fopen)。

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/file.xml");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_USERPWD, "user:pass");
$result = curl_exec($ch);
curl_close($ch);

然后,您的结果将存储在$result变量中。

于 2015-03-19T09:01:33.453 回答
2

php 中有很多方法可以读取 exec、file_get_contents、curl 和 fopen 等文件,但这取决于您的要求和文件权限

访问这个file_get_contents vs cUrl

基本上是为你准备的 file_get_contents

$data = file_get_contents($file_url);
于 2015-03-21T07:11:37.507 回答
2

如果在 php 中使用 Curl...

function disguise_curl($url) 
{ 
  $curl = curl_init(); 

  // Setup headers - I used the same headers from Firefox version 2.0.0.6 
  // below was split up because php.net said the line was too long. :/ 
  $header[0] = "Accept: text/xml,application/xml,application/xhtml+xml,"; 
  $header[0] .= "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"; 
  $header[] = "Cache-Control: max-age=0"; 
  $header[] = "Connection: keep-alive"; 
  $header[] = "Keep-Alive: 300"; 
  $header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7"; 
  $header[] = "Accept-Language: en-us,en;q=0.5"; 
  $header[] = "Pragma: "; // browsers keep this blank. 

  curl_setopt($curl, CURLOPT_URL, $url); 
  curl_setopt($curl, CURLOPT_USERAGENT, 'Googlebot/2.1 (+http://www.google.com/bot.html)'); 
  curl_setopt($curl, CURLOPT_HTTPHEADER, $header); 
  curl_setopt($curl, CURLOPT_REFERER, 'http://www.google.com'); 
  curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate'); 
  curl_setopt($curl, CURLOPT_AUTOREFERER, true); 
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
  curl_setopt($curl, CURLOPT_TIMEOUT, 10); 

  $html = curl_exec($curl); // execute the curl command 
  curl_close($curl); // close the connection 

  return $html; // and finally, return $html 
} 

// uses the function and displays the text off the website 
$text = disguise_curl($url); 
echo $text; 
?> 
于 2015-03-24T12:23:08.197 回答
2

该方法只是一个类,不需要导入其他库或重用代码。

我个人使用我不久前制作的这个脚本。位于此处,但对于那些不想单击该链接的人,您可以在下面查看。它允许开发人员使用静态方法HTTP::GET($url, $options)在 curl 中使用 get 方法,同时能够通过自定义 curl 选项。您也可以使用HTTP::POST($url, $options),但我几乎不使用该方法。

/**
  *  echo HTTP::POST('http://accounts.kbcomp.co',
  *      array(
  *            'user_name'=>'demo@example.com',
  *            'user_password'=>'demo1234'
  *      )
  *  );
  *  OR
  *  echo HTTP::GET('http://api.austinkregel.com/colors/E64B3B/1');
  *                  
  */

class HTTP{
   public static function GET($url,Array $options=array()){
    $ch = curl_init();
    if(count($options>0)){
       curl_setopt_array($ch, $options);
       curl_setopt($ch, CURLOPT_URL, $url);
       $json = curl_exec($ch);
       curl_close($ch);
       return $json;
     }
   }
   public static function POST($url, $postfields, $options = null){
       $ch = curl_init();
       $options = array(
          CURLOPT_URL=>$url,
          CURLOPT_RETURNTRANSFER => TRUE,
          CURLOPT_POSTFIELDS => $postfields,
          CURLOPT_HEADER => true
          //CURLOPT_HTTPHEADER, array('Content-Type:application/json')
          ); 
       if(count($options>0)){
           curl_setopt_array($ch, $options);
       }
       $json = curl_exec($ch);
       curl_close($ch);
       return $json;
   }
}
于 2015-03-25T04:27:35.410 回答
1

Shellwrap是在 PHP 中使用命令行的绝佳工具!

您的示例可以非常简单易读地完成:

use MrRio\ShellWrap as sh;

$xml = (string)sh::curl(['u' => 'user:pass'], 'http://example.com/file.xml');
于 2015-03-24T12:26:01.777 回答
0

我了解您想使用 php 打开一个 xml 文件。这被称为解析 xml 文件。最好的参考在这里。

http://php.net/manual/de/function.xml-parse.php

于 2015-03-25T22:23:47.740 回答
0
<?php
function wget($address,$filename)
{
  file_put_contents($filename,file_get_contents($address));
}
?>

采用:

<?php
wget(URL, FileName);
?>
于 2016-05-09T10:27:24.437 回答
0

要在 PHP 中运行 wget 命令,您必须执行以下步骤:

1) 通过将 wget 命令添加到 sudoers 列表中,允许 apache 服务器使用 wget 命令。

2)检查“exec”功能是否已启用或存在于您的 PHP 配置中。

3)以root用户身份运行“exec”命令,即sudo用户

下面的代码示例根据 ubuntu 机器

#Add apache in sudoers list to use wget command
~$ sudo nano /etc/sudoers
#add below line in the sudoers file
www-data ALL=(ALL) NOPASSWD: /usr/bin/wget


##Now in PHP file run wget command as 
exec("/usr/bin/sudo wget -P PATH_WHERE_WANT_TO_PLACE_FILE URL_OF_FILE");
于 2018-11-27T12:23:04.623 回答