Laravel exec()生成一个mysql-dump空文件

时间:2015-09-18 15:21:55

标签: php mysql laravel xampp

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

使用: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);

3 个答案:

答案 0 :(得分:1)

实际上,在开发环境中,通常不为数据库设置密码。这就是为什么你的命令不起作用的原因。

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

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

答案 1 :(得分: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等待该过程完成,但没有办法确定,将其放在一边,因为进程可能由不同的用户拥有它所以' d如果你创建了一个临时文件,然后将输出数组的内容闪存到它中,而不是希望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 :(得分:0)

我没有针对这个问题的解决方案,但我知道应该可以做到这一点。如果我在终端中输入以下命令,则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();

也许有人知道为什么这不起作用?我猜这是一个许可问题,但我在这方面有经验。