【问题标题】:Laravel exec() produce a mysql-dump empty fileLaravel exec() 产生一个 mysql-dump 空文件
【发布时间】:2015-12-15 19:34:50
【问题描述】:

我正在使用 exec() 执行 mysql-dump,但它在 apache 上生成一个空文件,但是当我使用“php artisan serve”时,文件生成正确,输出文件具有相同的用户和组apache 和工匠服务。

使用:Ubuntu 14.04 和 Xamp 5.6.12

$dir = substr(__DIR__, 0, 24).'database/backups/';

$newBackup = Backup::create();

$command = 'mysqldump -uroot lions > '.$dir.$newBackup->getDateTimeString().'.sql';

exec($command);

【问题讨论】:

  • 回显 $command 看看它是什么,检查文件夹是否可写,应该有遗漏的地方
  • 该命令与“工匠服务器”完美配合并生成正确的文件(带有数据),但是当我在 apache 中尝试时只生成一个空文件并且该文件夹是可写的,因为该命令会创建文件但不是数据(0 字节)
  • 尝试从exec 获取输出和退出代码并记录它们,以便查看命令是否成功运行。只需使用exec($command, $output, $exitCode);。也许这与用户权限有关,因为 artisan serve 命令将拥有您的用户权限,而另一个将拥有 Apache 的权限。
  • 这意味着找不到文件。而不是 mysqldump 尝试使用完整的 PATH
  • 退出代码 127 表示 找不到命令。正如@72DFBF5BA0DF5BE9 建议的那样,您应该尝试使用mysqldump 二进制文件的完整路径运行该命令。你可以通过运行 locate mysqldump 找到路径(如果你在 Ubuntu 上,那可能是 /usr/bin/mysqldump)。

标签: php mysql laravel xampp


【解决方案1】:

好的,我在使用 Laravel 5.6 和运行 windows 时遇到了同样的问题。首先,您应该确保包含密码参数(--password-p),即使它为空。

$cmd =
"mysqldump -h " . env('DB_HOST') .
" -u "          . env('DB_USERNAME') .
" -p\""         . env('DB_PASSWORD') . "\"" .
" --databases " . env('DB_DATABASE');

主要问题是,即使有几个消息来源指出 exec 会等到进程完成,也无法确定,撇开这一点不谈,因为进程可能由不同的用户拥有,这可能会更好如果您创建了一个临时文件,然后将输出数组的内容写入其中,而不是希望 mysqldump 为您完成。

$output = [];
$name = "your_random_file_name.sql";

exec($cmd, $output);

$tmppath = tempnam(sys_get_temp_dir(), $name);
$handle = fopen($tmppath, "w");
fwrite($handle, implode($output, "\n"));

最后,将主文件写入您想要的位置,在我的情况下,我将其直接上传到Amazon S3 bucket,然后关闭临时文件。

Storage::disk('myS3bucket')
->putFileAs("backups", new File($tmppath), $name);
fclose($handle);

我知道这似乎是多余的,但正如我上面提到的,没有办法确定。

【讨论】:

    【解决方案2】:

    确实,在开发环境中,习惯上不为数据库设置密码。这就是你的命令不起作用的原因。

    但在生产环境中,你必须为数据库设置密码。

    在您的生产环境中尝试(即使用密码!),您将看到脚本有效。

    【讨论】:

      【解决方案3】:

      我没有解决这个问题的办法,但我知道应该可以做到这一点。如果我在终端中输入以下命令,mysqldump 将起作用:

      mysqldump "--user=root" "--password=" dbname > ~/Desktop/export.sql
      

      但是当我在下面的调度程序中使用这个命令时,我得到一个空文件。

      $schedule->exec("mysqldump \"--user=".env('DB_USERNAME')."\" \"--password=".env('DB_PASSWORD')."\" ".env('DB_DATABASE')." > export.sql")->everyMinute();
      

      也许有人知道为什么这不起作用?我猜这是一个权限问题,但我泄露了这方面的经验。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多