2017-09-11 11 views
0

私はデータベースからSQLファイルをダンプするカスタムartisanコマンドを作った。Laravel 5.4 - カスタムアーティザンコマンド "アクセスが拒否されました。"

ここにはコマンドの内容が記載されています。

私はこの構文とそれに 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ファイル内にある:

protected $signature = 'db:dump'; 

次のコマンドそのものです。それが助けになるなら、私はそれの中に何が入っているかを提供します:

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

コマンドを実行する代わりに印刷して、コマンドラインに貼り付けることはできますか?それは動作しますか? – Anders

+0

@アンダー何を意味するのですか?申し訳ありませんが、私は完全にそれで失われています。 exec($ command)の代わりにxD –

+0

do dd($ command)を実行します。印刷された文字列をコピーしてコピーし、コマンドラインでテストします。 – Anders

答えて

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); 
    } 
} 

bottomlineは、私に問題があるのですが、それがアクセスできないフォルダ。私はまだなぜか分からない、私は管理者としてコマンドプロンプトを開こうとした。しかし、それでも動作しません。

0

コメントから、あなたのスクリプトを生成し、実行しようとしているコマンドは(あなたdd($command)の代わりにexec($command)にしようとしたときに見られるように)であることを説明します。

<output-file>はので、あなたのホームディレクトリにある
mysqldump -h 127.0.0.1 -u root -p'' db_salesandinventory > <output-file> 

おそらく書き込み可能です。同じ権限エラーで、手動でコマンドを実行すると失敗することにも言及しました。だから問題はLaravelとは関係ありませんが、MySQLサーバーへのアクセスは問題ありません。

まず、ユーザー名とパスワードが正しいかどうかをテストします。あなたのコンソールで試してみてください:

mysql -u root -p db_salesandinventory 

-hなし)パスワードの入力が求められ、スクリプトで使用しているパスワードを入力します。それがうまくいかない場合は、間違ったu/pを使用していて、それらを修正してスクリプトをもう一度試してみてください。

の場合は、ルートユーザーが127.0.0.1に接続できないことを意味します。 MySQLの場合localhost127.0.0.1と同じではないので、そのIPを使用しているrootユーザのアクセスを有効にする必要があります。as described in this question

+0

@Jan Ariel San Joseがこの助けをしましたか? –

関連する問題