Windows中无法通过PHP的exec识别正版命令

时间:2018-07-24 14:54:09

标签: php mysql windows exec

问题:-

我正在尝试在 windows 中使用PHP和mysqldump备份MySQL数据库。当我使用Wamp服务器时,以下脚本会根据需要提供鲜艳的转储

<?php
   $dbhost = 'localhost';
   $dbuser = 'root';
   $dbpass = '';
   $dbname = 'avita';
   $path = "c:/program files/mysql/mysql server 5.5/bin/";
   $backup_file = "d:/avita/".$dbname . date("Y-m-d-H-i-s") . '.sql';
   $command = $path."mysqldump -u$dbuser ". "avita 2>&1 $backup_file";

   exec($command, $output);
   print_r($output);
?>

可以使用 windows命令行进行相同操作,而不会出现任何问题:-

enter image description here

问题是,当我使用PHP-MySQL-Apache手动安装在同一台计算机上运行同一脚本时,输出如下所示:-

输出:-

  

Array([0] =>'c:/ program'不被识别为内部或   外部命令1 => 可运行的程序或批处理文件。 )

我应该怎么解决这个问题?

1 个答案:

答案 0 :(得分:1)

有几个重叠的误解。

  1. %PATH%(或* nix环境中的$PATH)。手动命令行起作用的唯一原因是因为您已经切换到MySQL目录,并且Windows检查 current 目录。当提示简单显示时,请尝试运行mysqldump(与上面一样,没有任何目录限定符)

    C:\> 
    

    发生了什么事?它没有用,但是为什么呢?

  2. 接下来,回想一下PHP的exec()是外壳的薄包装。假设您正在运行上面给出脚本的shell。缺少已知目录,我们假设我们位于根目录中:

    C:\>c:/program files/mysql/mysql server 5.5/bin/mysqldump.exe
    `c:/program` is not recognized as an internal or external command,
    operable program or batch file
    

    完全一样的问题! ... 所以发生了什么事?报价。 Shell将空格解释为令牌定界符,因此Shell抱怨c:/program不是有效的可执行文件。尝试用引号引起来,现在外壳程序会理解带空格的整个“怪异”路径都是第一个参数,实际上是我们想要的可执行文件的路径:

    C:\>"c:/program files/mysql/mysql server 5.5/bin/mysqldump.exe"
    

    突然它按预期工作了!

  3. PHP有一系列“剪纸”,其中之一是对此类可执行文件的“明智”处理。 PHP在这里类似于C,因为您必须自己进行转义。考虑:

    $command_parts = [
      escapeshellarg("${path}mysqldump.exe"),
      escapeshellarg("-u$dbuser"),
      "avita",    # no escapeshellarg here, as avita is visually "clean"
      "2>&1",     # no escapeshellarg here, as 2>&1 is visually "clean"
      escapeshellarg($backup_file)
    ];
    $command = implode(' ', $command_parts);
    exec( $command );
    

从这里开始,您的脚本应该可以正常工作。