Windows上的WGET通过PHP exec()不起作用

从PHP通过exec()调用时,我无法使wget工作。

代码是:

exec('wget -b --timeout=300 --no-check-certificate -O c:\wgetlog.txt http://localhost/project/someparam/somevalue > c:\wgetout.txt')

被调用的URL是来自基于Zend Framework的项目中的一个操作,它处理MySQL数据库中的一些数据。

执行上述操作时,只会创build“c:\ wgetout.txt”,并且为空。

设置如下:

  • Windows 7的
  • XAMPP
  • PHP版本5.3.5
  • wget从这里的最新版本
  • PHP的safe_mode是closures的

wget安装在“C:\ Program Files(x86)\ GnuWin32 \ bin”中,并将其添加到Windows PATHvariables中。

我知道wget安装程序正在工作,因为当运行上面的exec参数(如回显)

wget -b --timeout=300 --no-check-certificate -O c:\\wgetlog.txt http://localhost/project/someparam/somevalue > c:\\wgetout.txt

在命令提示符下,它运行良好,我在数据库中得到了预期的结果,同时创build了两个文件“C:\ wgetlog.txt”和“C:\ wgetout.txt”,后者包含wget的输出(进程ID等等)。

后期编辑:

得到它的工作感谢Crontab的build议,并使用调用wget的绝对path,也用双引号括起来。

使用WSH COM对象来运行它而不是普通的exec()

另外,在Windows上,如果输出不指向某处,则-b参数不起作用。 由于我对输出不是特别感兴趣,因此我将它指向> NUL 2>&1 (这也包括错误)。

我很快做了这个function来帮助我在Windows机器上testing我的项目,并让wget工作,所以在这里,如果有人认为它有用:

 public function execWget($URL, $intTimeout = 30, $blnInBackground = true) { if (preg_match("/Win/i", PHP_OS)) { $runCommand = '"C:\Program Files (x86)\GnuWin32\bin\wget" ' . ($blnInBackground?'-b ':'') . '--timeout=' . (int)$intTimeout . ' --no-check-certificate ' . $URL . ($blnInBackground?' > NUL 2>&1':''); $WshShell = new COM("WScript.Shell"); $oExec = $WshShell->Run($runCommand, 7, false); } else { $runCommand = 'wget ' . ($blnInBackground?'-b ':'') . '--timeout=' . (int)$intTimeout . ' --no-check-certificate ' . ($blnInBackground?'-O /dev/null ':'') . $URL . ($blnInBackground?' > /dev/null 2>&1':''); exec($runCommand); } } 

请注意,它是为我自己的设置(绝对pathwget )而定制的,仅用于testing目的(只使用Windows机器进行testing,实际生产机器运行Linux),操作系统检查方法可能不是最好的。

Solutions Collecting From Web of "Windows上的WGET通过PHP exec()不起作用"

尝试使用绝对路径wget – 它可能不在您的脚本的路径。 为了避免使用绝对路径,你可以尝试添加putenv("PATH=<whatever-paths-you-need-colon-delimited>"); 在您访问wget之前的脚本中。 另一种方法是直接修改任何运行你的web服务器的用户的PATH环境变量(因此无论哪个用户运行PHP解释器)。