我正在使用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);
答案 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();
也许有人知道为什么这不起作用?我猜这是一个许可问题,但我在这方面有经验。