- 投稿日:2020-04-05T23:02:57+09:00
Docker for MacのLaravel アプリケーションのが遅い?それ、ファイルをいっぱいマウントしてるからかもです。
はじめに
皆さんこんにちは!
tyamahoriです。普段はLaravel/PHPを利用してシステム開発しています。基本的にLocal開発環境はDocker for Macを使って構築しています。
お恥ずかしい話しながらこれまでDocker for Mac、遅いなぁ。。と思いながら開発をしていました。ただ、さすがに我慢できなくなってきたので色々と調べながらある程度速度を改善することができたので、コチラにまとめて行きたいと思います。
結論
ファイルのマウントを極力少なくする!
これです。今までのLocalのDocker環境の構築に追いて、無頓着にファイルのマウントを行っていました。これは遅いわけです。。先人の知恵を参考にさせていだきました。
その他にもよくあるのがdocker-syncを導入する案。これに関してはそのとおりなのですが、docker-syncを導入しなくては行けなかったり、それ用にymlファイルなどを書かなくてはいけないので、ちょっと面倒なんですよね。。
というわけで
Laravel プロジェクトに以下のファイルをローカルのMacにマウントしないやり方で改善ができました。
- vendorディレクトリ
- storageディレクトリ
実際の方法
docker-compose.yml を見てもらった方が速いかと思います。
コードはコチラ
docker-compose.ymlversion: '3' services: laravel-docker-for-mac-nginx: image: nginx:1.17.9 container_name: laravel-docker-for-mac-nginx ports: - 80:80 environment: TZ: Asia/Tokyo volumes: - ./nginx/default.conf:/etc/nginx/conf.d/default.conf - ../../laravel/public:/opt/laravel/public - storage-volume:/opt/laravel/storage #ここがポイント depends_on: - laravel-docker-for-mac-php laravel-docker-for-mac-php: build: php container_name: laravel-docker-for-mac-php volumes: - ../../laravel:/opt/laravel - vendor-volume:/opt/laravel/vendor #ここがポイント - storage-volume:/opt/laravel/storage #ここがポイント - ./php/php.ini:/usr/local/etc/php/php.ini working_dir: /opt/laravel environment: APP_NAME: laravel-docker-for-mac APP_KEY: base64:I7Rrg/XK0hG//wlbPdvURt7+VXXSDS2F+QYK3R45k/M= DB_CONNECTION: mysql DB_HOST: laravel-docker-for-mac-mysql DB_PORT: 3306 DB_DATABASE: laravel DB_USERNAME: laravel DB_PASSWORD: laravel LOG_CHANNEL: daily APP_DEBUG: 'true' APP_ENV: local APP_URL: http://localhost TZ: Asia/Tokyo laravel-docker-for-mac-mysql: image: mysql:8.0 container_name: laravel-docker-for-mac-mysql command: --default-authentication-plugin=mysql_native_password ports: - 3306:3306 volumes: - db-volume:/var/lib/mysql - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf environment: MYSQL_USER: laravel MYSQL_ROOT_PASSWORD: laravel MYSQL_PASSWORD: laravel MYSQL_DATABASE: laravel MYSQL_ALLOW_EMPTY_PASSWORD: 'no' TZ: Asia/Tokyo volumes: #ここがポイント storage-volume: driver: local vendor-volume: driver: local db-volume: driver: localGitHubにソースをアップしてますのでコチラも確認ください。
https://github.com/tyamahori/laravel-docker-envポイント
- volumesを利用し、storageディレクトリとvendorディレクトリのファイル群を格納する用にしています。Macのローカルに直接マウントしないように対応しています。
- これでDocker for Mac のスピード改善が見られます。
注意点あり!!
ただ単純にdocker-compose up を行い、Laravelお決まりのセットアップコマンドを行おうとするとエラーがあったり、IDE(自分の場合はPhpStorm)の補完が効かなくなったりします。ちょっとした対応が必要です。
stroageディレクトリの扱い
上記のdocker-compose.ymlでそのまま
docker-compose up
すると、コンテナ内部のLaravelプロジェクトの中に、storageディレクトリがありません。docker cp
コマンドを利用して、初回の立ち上げ時に storageディレクトリをコンテナ内部に作るようにしました。Laravelのcache関連のファイルやDebugbarの関連ファイルがコンテナ内で保存されるようになります。vendorディレクトリの扱い
PhpStormを使っている場合、ローカルにvendorディレクトリがないと補完が効いてくれません。。(
コンテナ内部のvendorディレクトリをうまく見に行く方法があれば誰か教えてください。。自分はそこまでPhpStormを使いこなせてません。。。。
)ではどうするのか、
docker cp
コマンドを使ってコンテナ内部のvendorの中身をローカルのMacに持ってきます。docker cp
の時間と、PhoStormが cpされたvendorディレクトリの中身を読み込む時間がどうしてもかかってしまいますが、それが終わればDocker for Macの速度が改善されます。でもそれをコマンド叩いてやるのめんどくさい。。
安心してください!シェルスクリプトでコマンド処理をラップしました。短いコマンドでいい感じにdocker cpをしてくれるように作り込みました。その他コマンドをいくつか作ってあります。詳細はコチラ
最後に
ぜひ、お手元で試してほしいです!色々とツッコミどころあったら遠慮なくご連絡ください。
# コピペ用 $ git clone git@github.com:tyamahori/laravel-docker-env.git $ cd laravel-docker-env/docker/formac $ ./formac setup $ ./formac logs # ログを出したい人用 $ ./formac down
- 投稿日:2020-04-05T17:02:38+09:00
Laravel で $_SERVER['QUERY_STRING'] を取得する
$_SERVER['QUERY_STRING']
が欲しかったのです。たとえば、URL が
http://example.com/hoge?piyo=1&piyo=2
であれば、であれば
piyo=1&piyo=2
部分を取得したいのです。結論以下のように書きました。
$request->getQueryString();これは、laravel の内部で使っている symfony が用意しているメソッドです。
他には、以下のようにもかけます。
str_replace($request->url(), '', $request->fullUrl()); http_build_query($request->query());違い
$_SERVER と getQueryString の違いはエンコードされるかどうかです。
$_SERVER['QUERY_STRING'] => "key=hoge&piyo=;alert(1)" $query => "key=hoge&piyo=%3Balert%281%29"
- 投稿日:2020-04-05T17:02:38+09:00
Laravel で $_SERVER['QUERY_STRING'] を取得するいくつかの方法
$_SERVER['QUERY_STRING']
が欲しかったのです。たとえば、URL が
http://example.com/hoge?piyo=1&piyo=2
であれば、であれば
piyo=1&piyo=2
部分を取得したいのです。結論以下のように書きました。
$request->getQueryString();これは、laravel の内部で使っている symfony が用意しているメソッドです。
他には、以下のようにもかけます。
str_replace($request->url(), '', $request->fullUrl()); http_build_query($request->query());違い
$_SERVER と getQueryString ではエンコードに少し違いがあります。
'?a=A&b="B"&c;alert(1);&d=あ' request()->getQueryString() => "a=A&b=%22B%22&c%3Balert%281%29%3B=&d=%E3%81%82" $_SERVER['QUERY_STRING']; => "a=A&b=%22B%22&c;alert(1);&d=%E3%81%82"それと、Laravel の feature テストとかだと
$_SERVER
の方はUndefined index: QUERY_STRING
になっちゃう。
- 投稿日:2020-04-05T15:41:52+09:00
Laravel 使用頻度の高そうなコマンド
目的
- Laravelで使用頻度の高そうなコマンドをまとめる
- 自分が必要に感じたものを随時追加してゆく
ローカルサーバの起動
アプリ名ディレクトリで下記コマンドを実行する。
$ php artisan serveマイグレーションファイルを作成する。
- マイグレーションファイルに命名規則はないが、どんな修正をDBに与えるのかがわかりやすいファイルである必要がある。
テーブルの新規作成
アプリ名ディレクトリで下記コマンドを実行する。
$ php artisan make:migration create_テーブル名_table --create=テーブル名既存テーブルにカラム追加等の途中からテーブルに修正を加える
アプリ名ディレクトリで下記コマンドを実行する。(下記のコマンドは〇〇カラムを追加する時のコマンドの例)
$ php artisan make:migration add_〇〇_column_テーブル名_table --table=テーブル名マイグレーションファイルのマイグレート
マイグレート
アプリ名ディレクトリで下記コマンドを実行する。
$ php artisan migrateロールバック
アプリ名ディレクトリで下記コマンドを実行する。
$ php artisan migrate:rollback
- 投稿日:2020-04-05T14:19:27+09:00
PHP【Laravel】:POSTの設定とCSRF対策について
PHPのフレームワークLaravelでPOSTを使い値を送信する際の注意点について学んだのでメモ。
POSTを使うなんてプログラミングを学び始めの頃、見よう見まねでできたのに、何今頃つまずいているんだと凹みながら色々調べていたら、Laravelでは少し勝手が違うようだった。
まず、以下のコードを書きを実行したら、「419のHTTPステータスエラー」が出た。
ビュー
sample.blade.php<h1>タイトル</h1> <p class="name">ようこそ!{{$msg}}さん</p> <form method="POST" action="/sample"> 名前を入力してください<br> <input type="text" name="msg"> <input type="submit"> </form>ルーティング
web.phpRoute::get('/sample', 'SampleController@test'); Route::post('/sample', 'SampleController@test');コントローラ
SampleController.phpclass SampleController extends Controller { public function test(Request $request){ $data['msg'] = $request->msg; return view('sample.sample', $data); // }原因はCSRFトークン:
原因はCSRFトークンでした。
Laravelでは、クロスサイトリクエストフォージェリ対策として、CSRFトークンを使用することができます。Laravelではミドルウェアにデフォルトで
kernel.php\App\Http\Middleware\VerifyCsrfToken::classという記載があります。
kernel.phpprotected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, // \Illuminate\Session\Middleware\AuthenticateSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, ],なのでCSRF対策の仕組みを実際に使う必要があります。
修正
ビューに@csrfを追記。
sample.blade.php<h1>タイトル</h1> <p class="name">ようこそ!{{$msg}}さん</p> <form method="POST" action="/sample"> @csrf 名前を入力してください<br> <input type="text" name="msg"> <input type="submit"> </form>もしくは、ミドルウェアで無効化(コメントアウト)。
kernel.phpprotected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, // \Illuminate\Session\Middleware\AuthenticateSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, // \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, ],
- 投稿日:2020-04-05T14:18:59+09:00
Laravelのartisanコマンドでルートを検索する(オプションまとめ)
概要
業務内で、Laravelで書かれているソースコードを読んでいる時に、ルーティングを効率的に検索する必要に迫られることがあります。ですので、オプションを使って効率的に検索する方法をまとめてみました。
ルート一覧の表示方法
php artisan route:listルートをパスから探す
php artisan route:list --path==api/user/like+--------+--------+---------------+------+----------------------------------------------+------------+ | Domain | Method | URI | Name | Action | Middleware | +--------+--------+---------------+------+----------------------------------------------+------------+ | | POST | api/user/like | | App\Http\Controllers\LikeApiController@store | api | +--------+--------+---------------+------+----------------------------------------------+------------+ルートを名前から探す
php artisan route:list --name==user+--------+----------+------------+-------------+--------------------------------------------+------------+ | Domain | Method | URI | Name | Action | Middleware | +--------+----------+------------+-------------+--------------------------------------------+------------+ | | POST | update | user.update | App\Http\Controllers\UserController@update | web | | | GET|HEAD | {userName} | user.index | App\Http\Controllers\UserController@index | web | +--------+----------+------------+-------------+--------------------------------------------+------------+ルートをHTTPメソッドから探す
php artisan route:list --method=delete+--------+--------+-------------------------------+-----------------------+------------------------------------------------------+------------------------------------------------------+ | Domain | Method | URI | Name | Action | Middleware | +--------+--------+-------------------------------+-----------------------+------------------------------------------------------+------------------------------------------------------+ | | DELETE | _debugbar/cache/{key}/{tags?} | debugbar.cache.delete | Barryvdh\Debugbar\Controllers\CacheController@delete | Barryvdh\Debugbar\Middleware\DebugbarEnabled,Closure | | | DELETE | delete/{delete} | | App\Http\Controllers\PostController@delete | web | +--------+--------+-------------------------------+-----------------------+------------------------------------------------------+------------------------------------------------------+複合検索も可能
php artisan route:list --method=post --name=like --path=unlike+--------+--------+---------------------------+--------------+---------------------------------------------+------------+ | Domain | Method | URI | Name | Action | Middleware | +--------+--------+---------------------------+--------------+---------------------------------------------+------------+ | | POST | user/{user}/unlike/{post} | like.destroy | App\Http\Controllers\LikeController@destroy | web | +--------+--------+---------------------------+--------------+---------------------------------------------+------------+逆順で表示
php artisan route:list --method=DELETE -rソートの方法
php artisan route:list --method=DELETE --sort=name
- 投稿日:2020-04-05T11:57:49+09:00
Vagantを使ってLaravelを動かす
はじめに
初学者が最初に躓きやすいと言われる環境構築ですが手順をしっかり追い、そこで何が行われているを簡単にイメージすることが大事だと痛感しました。
そこで私的メモ程度に構築手順を書き記します。
あくまで私の環境ではこの手順で動くものであって、全員がこれで動くとは限らないので参考程度でお願いいたします。
また初学者であるがゆえに問題点があるかと思います。修正箇所やご指摘いただけると幸いでございます。この記事でやること
- vagarantを使ってcentOS環境の構築。
- その環境下でPHP、Laravel、MySQLを導入。
- Nginxを立ち上げ、プロジェクトにログイン機能を実装する。
今回使うもの
- Vagrant
- vbguest
- CentOS7
- Nginx
- PHP7.3
- Laravel6.x
- MySQL5.7
上記に接続できる環境があることを前提に手順を追っていきます。
環境を構築してゆく
作業ディレクトリの準備
まずは仮想環境に接続できる作業スペースを作成していきます。
ターミナル上でLinuxコマンドで作業ディレクトリを作成します。
今回は仮にvagrant_lessonとします。
mkdir vagrant_lesson cd vagrant_lessonディレクトリ移動後に使用するboxを指定してあげましょう。
今回はcentOS7を使用します。
vagrant init centos/7 # 実行後以下のようになれば成功 A `Vagrantfile` has been placed in this directory. You are now ready to `vagrant up` your first virtual environment! Please read the comments in the Vagrantfile as well as documentation on `vagrantup.com` for more information on using Vagrant.vagrantfileの編集
vagrant_lessonのVagrantfileをエディタで開き、以下記述に変更します。
1 コメントアウトを外す
config.vm.network "forwarded_port", guest: 80, host: 8080 # 今回ip番号は以下を使用します config.vm.network "private_network", ip: "192.168.33.15"2 記述を適当な箇所に追加
config.vm.synced_folder "./", "/vagrant", type:"virtualbox"vagrantの起動
# Vagrantfileがあるディレクトリにて以下コマンドの実行 vagrant up
macbook air だとここあたりからpcがうなりだすかもしれませんがゆっくり見守ってあげましょう。
ちなみに起動や停止などのコマンドはこちらを参考
【まとめ】Vagrant コマンド一覧仮想環境に接続する
ssh接続で環境に接続します。
今回作業するディレクトリ内で以下コマンドを実行するだけです。
vagrant ssh # 実行後以下のようになれば成功 [vagrant@localhost ~]$パッケージの導入
開発を使用する上で必要なパッケージをインストールします。
仮想環境につながった状態で以下コマンドを実行します。
[vagrant@localhost ~]$ sudo yum -y groupinstall "development tools"これで作業するディレクトリの下準備が完了しました。
続いて実際に環境構築していきます。
環境構築~導入編~
このセクションでは環境構築に必要なものを仮想環境にインストールしていきます。
PHP7.3の導入
centOSのデフォルトのPHPのバージョンは5.4.16です。
一方で今回使用するPHPのバージョン7.3なので、それがインストール出来るようにcentOSの設定を変更します。変更といってもコマンドを入力するだけです。
# EPELのリポジトリを追加 sudo yum -y install epel-release wget # インストール先を最新の状態に更新します sudo wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm # REMIのリポジトリを追加 sudo rpm -Uvh remi-release-7.rpm # php7.3をインストール sudo yum -y install --enablerepo=remi-php73 php php-pdo php-mysqlnd php-mbstring php-xml php-fpm php-common php-devel # バージョン確認 php -v # バージョンが7.3.x であれば成功composerの導入
次にLaravelとそれに必要なcomposerをインストールしていきます。
まずはcomposerを導入します。
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" php composer-setup.php php -r "unlink('composer-setup.php');" # グローバルコマンドを使用するためにfileを移動 sudo mv composer.phar /usr/local/bin/composer # バージョン確認 composer -vバージョンが確認できれば成功です。
Laravel6.xの導入
ではLaravelのバージョン6.xを導入していきます。
準備としてLaravelを導入するディレクトリに移動しましょう。
# 移動して cd /vagrant # Laravel6.0をインストール composer create-project laravel/laravel=6.0 --prefer-dist laravel_sample # 移動して cd laravel_sample/ # バージョン確認 php artisan --version # 6.xになっていれば成功です。Nginxの導入
最新のバージョンをインストールするため以下コマンドでファイルを編集します。
sudo vi /etc/yum.repos.d/nginx.repo
下記内容を追記します。
[nginx] name=nginx repo baseurl=http://nginx.org/packages/mainline/centos/\$releasever/\$basearch/ gpgcheck=0 enabled=1入力方法は
i
でインサートモードにし、編集後esc
でインサートを終了し:wq
で保存&終了します。間違ってしまったら
:q!
しましょう。ではインストールしましょう。
# laravel_sampleでコマンド実行 sudo yum install -y nginx # バージョン確認 nginx -vインストール成功したらNginxを起動してみましょう。
起動コマンドは以下のとおりです。
sudo systemctl start nginx
Nginxのwelcome画面が表示されれば成功です。
環境構築~Laravel表示編~
では、今表示されているNginxの画面からLaravelのホーム画面になるように設定していきます。
Nginxの設定ファイルを編集します。
sudo vi /etc/nginx/conf.d/default.conf
server { listen 80; server_name 192.168.33.15; # Vagranfileでコメントを外した箇所のipアドレスを記述してください root /vagrant/laravel_sample/public; # 追記 index index.html index.htm index.php; # 追記 #charset koi8-r; #access_log /var/log/nginx/host.access.log main; location / { #root /usr/share/nginx/html; # コメントアウト #index index.html index.htm; # コメントアウト try_files $uri $uri/ /index.php$is_args$args; # 追記 } # 省略 # 以下の該当箇所のコメントアウトを指定の箇所外し、変更する場所もあるので変更を加える location ~ \.php$ { # root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /$document_root/$fastcgi_script_name; # $fastcgi_script_name以前を /$document_root/に変更 include fastcgi_params; }続いてphpインストール時にインストールしたphp-fpmの設定fileを編集していきます。
sudo vi /etc/php-fpm.d/www.conf
;24行目近辺 user = apache ↓ 変更 user = vagrant group = apache ↓ 変更 group = vagrant編集が完了したらNginxを再起動してphp-fpmを起動しましょう。
# Nginx再起動 sudo systemctl restart nginx # php-fpm起動 sudo systemctl start php-fpmForbidden という403エラーが出た場合
sudo vi /etc/selinux/config
この記述を変更してくだい。
# 変更前 SELINUX=enforcing # 変更後 SELINUX=disabled保存を反映させるためにvagrantを再起動しましょう
exit #ログアウト vagrant reload #再起動再起動後、ssh接続しましょう。
vagrant ssh接続が完了したらNginxを再起動してphp-fpmを起動しましょう。
# Nginx再起動 sudo systemctl restart nginx # php-fpm起動 sudo systemctl start php-fpmLaravelのhomeが表示されたらエラ−解決です。
環境構築~DBに接続編~
mysqlの導入
rpmにリポジトリを追加しインストールします。
sudo wget http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm sudo rpm -Uvh mysql57-community-release-el7-7.noarch.rpm # インストール sudo yum install -y mysql-community-server # バージョン確認 mysql --version #バージョンが確認できたら成功ですmysqlに接続
sudo systemctl start mysqld sudo cat /var/log/mysqld.log | grep 'temporary password' #以下表示される。文末がパスになるのでコピーする 2017-01-01T00:00:00.000000Z 1 [Note] A temporary password is generated for root@localhost: ******** mysql -u root -p #パスワードが求められるので先程コピーしたものを入力 Enter password: ********接続後パスワードを変えます。
-- パスワードはダブルクオーテーションで囲む mysql > set password = "新たなpassword(必ず大文字小文字の英数字 + 記号かつ8文字以上)";DBを作成
最後に実際に使用するDBを作成しましょう。
mysql > create database DBの名前; -- 以下表記で成功 Query OK, 1 row affected (0.00 sec)作成したプロジェクトに登録・ログイン機能を実装してゆく
仮想環境に繋いだまま、作成した
laravel_sample
に移動しましょう。移動後、以下コマンドを実行するだけでLaravelホーム画面に登録機能とログイン機能が実装できます。
composer require laravel/ui 1.* php artisan ui vue --auth # 以下が表示されれば成功 Vue scaffolding installed successfully. Please run "npm install && npm run dev" to compile your fresh scaffolding. Authentication scaffolding generated successfully.先程設定した
http://192.168.33.15/
を開きし、右上にregisterとloginの項目があれば成功です。さいごに
環境構築と言われ難しいイメージを感じたかもしれませんが、何がどの役割を持っているかイメージできれば割と理解しやすいかと思います。
ただ私も6割程度の理解ですのでこれからこの辺りの知識は深める必要があると感じました。参考サイト
- 投稿日:2020-04-05T11:34:12+09:00
<router-view>のタグがそのまま表示される
- 投稿日:2020-04-05T02:28:06+09:00
GitHub_Laravelのリポジトリに脆弱性アラート
発生
どうやらsymfony/http-foundationのバージョンが低いことがvulnerability(脆弱性)に繋がっているらしい。。
暫定対応
Laravelのフォルダを「symfony/http-foundation」でgrep検索し、「composer.lock」というファイルをGitHubのいう通りに書き換え。
composer.lock"require": { "php": ">=5.5.9", "symfony/http-foundation": "5.0.7" "symfony/http-kernel": "~2.7|~3.0|~4.0|~5.0" },ローカルでLaravelアプリが正しく動作する事を確認し、
GitHubへ変更をプッシュ。エラーはクリアになりました。恒久対応
laravel newを実行するたびにcomposer.lockファイルを毎回書き換えるのは面倒ですよね。
Laravelをアップデートすれば良い気がするので、出来たらまた書きます。