繁体   English   中英

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

[英]Laravel exec() produce a mysql-dump empty file

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

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

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

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

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

好吧,我在使用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);

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM