【问题标题】:Call to wget from PHP's shell_exec not working从 PHP 的 shell_exec 调用 wget 不起作用
【发布时间】:2017-08-11 04:45:30
【问题描述】:

我正在尝试在本地运行一个 PHP 脚本,该脚本使用 wget 抓取 Google 并将 HTML 转储到 temp.html

从终端运行此命令可以正常工作:

wget -O temp.html http://www.google.ca

从 PHP 运行这个命令也可以正常工作(所以这不是权限问题):

shell_exec('touch temp.html');

但是从 PHP 运行它不起作用(不创建 temp.html):

shell_exec('wget -O temp.html http://www.google.ca');

有什么建议吗?将最后一个命令包装在 var_dump() 中会输出 null。

谢谢!

【问题讨论】:

  • 您能否更新您的问题以添加您遇到的具体错误?
  • 我没有收到任何错误。正如我在问题中所述,shell_exec 命令不会创建包含http://www.google.ca 内容的文件temp.html。谢谢。
  • 服务器上安装wget了吗?
  • 是的,我是从安装 wget 的计算机上运行它的。并且从终端中的同一文件夹运行相同的命令可以正常工作。

标签: php shell wget shell-exec


【解决方案1】:

根据man wget,使用wget -O temp.html http://google.com 获取所有文档,将它们连接起来并打印temp.html 中的所有内容,而不产生任何stdout,因此PHP 的shell_exec 不会返回任何内容(null)。

抓取网页的内容应该存在于temp.html中,但shell_exec("wget ...")不返回任何内容,因为不产生输出。

正如你提到的你试图抓取的网页不起作用,也许他们实施了某种机器人保护,阻止你正在尝试什么。

编辑:您可以改用- 将所有内容打印到stdout。所以尝试使用shell_exec("wget -O - https://google.com"); 应该会将请求页面的内容返回到您的 PHP 脚本。

【讨论】:

  • 感谢您的回答。如果网页实施了某种机器人保护,那么直接从终端运行wget -O temp.html http://www.whoever.com 也不会起作用,但它确实......对吗?
  • 正确,如果有某种保护(即显示浏览器检查页面或不为假定为机器人的访问者显示任何内容),wget 不应返回您想要的内容/代码/HTML (根据我的经验)。
【解决方案2】:

最简单的解决方案是提供wget 二进制文件的完整路径,因为运行您的脚本的用户似乎没有与您相同的 $PATH。

【讨论】:

    【解决方案3】:

    改用file_put_contentsfile_get_contents 怎么样?这应该可以工作而不必担心wget

     <?php
      $filename = 'temp.html';
      $address = 'http://www.google.ca';
      file_put_contents($filename,file_get_contents($address));
     ?>
    

    【讨论】:

    • 谢谢,这确实适用于谷歌,但我只是以谷歌为例。我正在抓取的实际 URL 不适用于 file_get_contents(服务器阻止请求 - 与 cURL 请求相同)。
    猜你喜欢
    • 1970-01-01
    • 2016-07-01
    • 2012-12-25
    • 1970-01-01
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    相关资源
    最近更新 更多