所以我做了一个自定义artisan
命令,它将从我的数据库中转储一个sql文件。
这是命令内部的内容。
我用这种语法命名db:dump
:
protected $signature = 'db:dump';
接下来是命令本身:
public function handle()
{
$ds = DIRECTORY_SEPARATOR;
$host = env('DB_HOST');
$username = env('DB_USERNAME');
$password = env('DB_PASSWORD');
$database = env('DB_DATABASE');
$ts = time();
$path = database_path() . $ds . 'backups' . $ds . date('Y', $ts) . $ds . date('m', $ts) . $ds . date('d', $ts) . $ds;
$file = date('Y-m-d-His', $ts) . '-dump-' . $database . '.sql';
$command = sprintf('mysqldump -h %s -u %s -p\'%s\' %s > %s', $host, $username, $password, $database, $path . $file);
if (!is_dir($path)) {
mkdir($path, 0755, true);
}
exec($command);
}
所以所需的所有信息都在我的.env
文件中。如果它会有所帮助,我也会提供它里面的内容:
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:3WuXKyS70VX+V/Ic5QjuVcmFbzsqTkJehiQA7q9s9gk=
APP_DEBUG=true
APP_LOG_LEVEL=debug
APP_URL=http://localhost
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=db_salesandinventory
DB_USERNAME=root
DB_PASSWORD=
BROADCAST_DRIVER=log
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
有了这些信息,一切都准备就绪,希望它可以起作用。
但每当我在命令提示符下执行命令时:
php artisan db:dump
它总是说“访问被拒绝。”
我在这里失去了任何领先优势,我不知道会出现什么问题。
编辑:当我用$this->info('TEST');
替换命令时,它会起作用。它就像一个console.log命令或某种类型。我想说的是,我的命令中出现了一些错误,限制了我这样做。
答案 0 :(得分:0)
在评论中,您描述了您的脚本生成并尝试执行的命令(如dd($command)
所示,而不是尝试exec($command)
):
mysqldump -h 127.0.0.1 -u root -p'' db_salesandinventory > <output-file>
其中<output-file>
位于您的主目录中,因此可能是可写的。您还提到手动运行该命令失败并出现相同的权限错误。所以这个问题与Laravel无关,而是你对MySQL服务器的访问。
首先测试您的用户名和密码是否正确。在您的控制台上尝试:
mysql -u root -p db_salesandinventory
(没有-h
)。系统将提示您输入密码,输入您在脚本中使用的密码。如果它不起作用,你使用错误的u / p,修复它们并再次尝试你的脚本。
如果 工作,则表示不允许root用户连接到127.0.0.1
。对于MySQL,localhost
与127.0.0.1
不同,您需要为使用该as described in this question的root
用户启用访问权限。
答案 1 :(得分:0)
我设法找到了问题并采取了一些其他方法来阻止它。
不幸的是,我无法访问C:\Users\PCNAME\
,我的项目已保存在那里。我正在尝试将数据库转储到项目路径中,但无法访问它。
作为替代方案,我更改了转储位置的路径,我将其设置为C:\salesandinventory\backups\
以下是整个代码:
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class MySqlDump extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'db:dump';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Runs the mysqldump utility using info from .env';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$ds = DIRECTORY_SEPARATOR;
$host = env('DB_HOST');
$username = env('DB_USERNAME');
$password = env('DB_PASSWORD');
$database = env('DB_DATABASE');
$mysqlpath = 'C:\xampp\mysql\bin\mysqldump';
$ts = time();
// $path = 'database' . $ds . 'backups' . $ds . date('Y', $ts) . $ds . date('m', $ts) . $ds . date('d', $ts) . $ds;
$path = 'C:\salesandinventory\Backups' . $ds . date('Y', $ts) . $ds . date('m', $ts) . $ds . date('d', $ts) . $ds;
$file = date('Y-m-d-His', $ts) . '-dump-' . $database . '.sql';
$command = sprintf($mysqlpath . ' --user=' . $username . ' --password=' . $password . ' --host=' . $host . ' ' . $database . ' > ' . $path . $file);
if (!is_dir($path))
{
mkdir($path, 0755, true);
}
exec($command);
}
}
最重要的是,我的文件夹存在问题,因为它无法访问。我仍然不知道为什么,我尝试打开命令promt作为管理员。但它仍然无效。