Laravel 5.4 - 自定义工匠命令“访问被拒绝。”

时间:2017-09-11 06:44:26

标签: laravel

所以我做了一个自定义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命令或某种类型。我想说的是,我的命令中出现了一些错误,限制了我这样做。

2 个答案:

答案 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,localhost127.0.0.1不同,您需要为使用该as described in this questionroot用户启用访问权限。

答案 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作为管理员。但它仍然无效。