php - 在 Windows 中,PHP 的 exec 无法识别正版命令

标签 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' is not recognized as an internal or external command, 1 => operable program or batch file. )

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

最佳答案

存在一些重叠的误解。

  1. %PATH%(或 *nix 环境中的 $PATH)。手动命令行工作的唯一原因是您已经更改为 MySQL 目录,并且 Windows 会检查当前目录。当提示符简单地显示时,尝试运行 mysqldump (就像上面一样,没有任何目录限定符):

    C:\> 
    

    发生了什么?它不起作用,但为什么呢?

  2. 接下来,回想一下 PHP 的 exec() 是 shell 的一个薄包装器。假设您正在运行上面给出的脚本的 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 不是有效的可执行文件。尝试使用引号,现在 shell 理解带有空格的整个“奇怪”路径是第一个参数,实际上是我们想要的可执行文件的路径:

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

    突然间它就按预期工作了!

  3. PHP 有一系列“ Papercut ”,其中之一就是对像这样的可执行文件的“理智”处理。 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 );
    

从这里开始,您的脚本应该按预期工作。

关于php - 在 Windows 中,PHP 的 exec 无法识别正版命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51501727/

相关文章:

MySQL 的联合和排序通过帮助

c - 如何在 Windows 中为 CMAKE 构建指定特定的编译器

C#/.NET Timers 和 Win32 Sleep 函数都不准确

node.js - 无法在Windows上npm安装react-native

php - 写入 webroot 目录之外的文本文件

php - ajax提交表单信息

php - 从临时表中选择时出错

javascript - 动态创建表和行

sql - 使用查询进行渐进计数?

mysql - 在 MySQL 5.7 中创建具有 NULL 时间戳列的表