- 投稿日:2020-07-04T21:33:08+09:00
ChonohaVPSのCentOS7にLaravelアプリをデプロイ
さくらのレンタルーサーバで運用していたものをChonohaVPSに移管しようとしたらハマりまくったので、覚えていることをメモ。
コンポーザの入れ忘れ
プロジェクトフォルダだけ持っていってもLaravelは動かない。
開発は手元のローカル端末でやってGitにアップロードしたものをCloneするだけだから、サーバ側にはコンポーザはいらないかと勘違いしていた。
公開して閲覧できるようにするためにもコンポーザは必要なので、インストールする。なんだかわからないけど500
500だからファイルはあるんだろうけど、ブラウザにはそれしか書いていないし、開発ツール開いても何もヒントがない。
付近のフォルダで、フレームワークのない単独のphpファイルが動いているのでlaravelの何かがおかしいと思うんだけどエラー内容がわからなくて途方にくれた。最終的にはアパッチのエラーログをtail -fしてブラウザをリロードしたら問題のパスがログに出てきたので修正したら治った。
/var/log/httpd/ に ログがあるのでそれのどっかにあった。どれか忘れたけど、とにかく謎の500でハマったらこの辺のログを tail -f で監視するとヒントがあるかも。
アプリ名/public/index.php の中にララベルのpublic以外のフォルダへのパスが書いてあるのでそれを合わせる。
参考にしたページの通りに書いたのだが、ディレクトリ構成が自分と違ったのでパスがズレた。
その方の場合はpublicフォルダを公開フォルダの/var/www/html へ mv で移動して読めるようにするやり方だったのでindex.phpをいじる形になっていたけど、自分は ln -sで 公開フォルダからソフトリンクでパスをつなぐやり方にしたので、デフォルトのまま触ったらダメだった。DBの設定が間違っている
ここで、見慣れたLaravelの綺麗なエラー画面になった。
whoops!とか出るやつ。
ここまできたら後一息って感じ。.envの設定が間違っていた。
ホスト名にサーバのipアドレスを書いたけど、localhostが正しかった。
ただし私の場合はってだけで必ずしもそうではない。
私の場合、同じサーバにDBを構築しているので、そこのサーバ側から見るとlocalhostになるってことで、決して手元の操作端末という意味ではない。
phpMyAdminでDBを見ると接続しているホスト名が表示されているので、これに合わせると多分繋がるはず。
私の場合はここがlocalhostと表示されているのがヒントになって上記の対応をした。トップページしか表示されない
紆余曲折してやっとトップページが表示できたと思ったら、今度はそこしか見れない。
/etc/httpd/conf を vi で開いて
/var/www/ と /var/www/html/
のところにある
AllowOverride None を AllowOverride All に変更する。
オーバーライドを許可するだから、多分 web.php でルーティングできるようにするって事かな?
あれが多分URLを上書きしているって事だろう。これで動いた。
丸一日かかった・・
- 投稿日:2020-07-04T20:58:58+09:00
【PHP7.4】laravelで日付をフォーマットする方法
備忘録として
開発環境
・ゲストOS: Windows10 home10
・ホストOS: WSL2 Ubuntu20.04
・PHP7.4
・Laravel Framework 7.17.2目標
・viewに日付を表示する際に(2020/07/03)という形で表示する
実装例
laravelでオブジェクトのcreated_atプロパティを表示すると、デフォルトでは以下のような形で出力されます。
コード
<span>{{$item->created_at}}</span>出力結果
2020-07-03 04:34:04これでも機能的には問題ないですが、できればフォーマットを整えて表示できるようにしたいです。以下のようにするとフォーマットを変えて出力できるようになります。
コード
<span>{{$item->created_at->format('yy/m/d')}}</span>出力結果
2020/07/03PHPの公式ドキュメントには日付のフォーマット方法が多数紹介されています。
参考資料
- 投稿日:2020-07-04T15:15:21+09:00
Laravel シンボリックリンクが切れた時の復旧方法
Laravel のStorage を使っていて、シンボリックリンクが切れてファイルの読み込みができなくなる時があります。
その時の復旧方法を備忘録的に残します。
シンボリックリンクの設定
php artisan storage:linkこれでシンボリックリンクの設定ができます。
Storage フォルダがroot直下にでき、/public 直下からリンクが張られます。
それでうまくいっていたはずが、色々やるうちに変わったり外れてしまった場合の対処法です。
シンボリックリンクの確認
ローカルの場合、仮想環境のサーバにログインします。
プロジェクトのフォルダまで移動し、ls -la でシンボリックリンクを確認します。
vagrant@homestead:~/code/project$ cd public vagrant@homestead:~/code/project/public$ ls -la total 24 drwxr-xr-x 1 vagrant vagrant 384 Jul 4 02:52 . drwxr-xr-x 1 vagrant vagrant 960 Jun 28 07:37 .. drwxr-xr-x 1 vagrant vagrant 96 Jun 16 11:26 css -rw-r--r-- 1 vagrant vagrant 6148 May 15 06:23 .DS_Store -rw-r--r-- 1 vagrant vagrant 0 Apr 10 07:56 favicon.ico -rw-r--r-- 1 vagrant vagrant 603 Apr 10 07:56 .htaccess -rw-r--r-- 1 vagrant vagrant 1823 Apr 10 07:56 index.php drwxr-xr-x 1 vagrant vagrant 96 Jun 16 11:26 js -rw-r--r-- 1 vagrant vagrant 71 Jun 28 07:38 mix-manifest.json -rw-r--r-- 1 vagrant vagrant 24 Apr 10 07:56 robots.txt lrwxr-xr-x 1 vagrant vagrant 45 Jul 4 02:52 storage -> /User/hogehoge/code/project/storage/app/public/ drwxr-xr-x 1 vagrant vagrant 128 May 15 08:02 voice仮想環境なのに /User/hogehoge/code/project/storage/app/public/ みたいなパスになっていたら間違いです。
シンボリックリンクを削除する
リンクが間違っていたら、unlink でリンクを削除します。
vagrant@homestead:~/code/project/public$ unlink storage正しいパスでシンボリックリンクを設定する
シンボリックリンクの設定は ln -s [正しいパス] [storage] です。
正しいパスは、$pwd でプロジェクトrootのパスを確認し、/project/storage/app/public/ を設定。
vagrant@homestead:~/code/project/public$ ln -s /home/vagrant/code/project/storage/app/public/ storageついでに: 本番環境でシンボリックリンクが繋がらないとき
単純に繋がっていないだけのことが多いので、サーバにログインして、storage:link しましょう。
php artisan storage:link参考
- 投稿日:2020-07-04T15:13:43+09:00
Docker&LaravelでSQLSTATE[HY000] [2002] Connection refusedが出た時の対処法
はじめに
こんなエラーでた。
terminalSQLSTATE[HY000] [2002] Connection refused (SQL: select * from information_schema.tables where table_schema = laravel and table_name = migrations and table_type = 'BASE TABLE') at vendor/laravel/framework/src/Illuminate/Database/Connection.php:671 667| // If an exception occurs when attempting to run a query, we'll format the error 668| // message to include the bindings with SQL, which will make this exception a 669| // lot more helpful to the developer instead of just the database's errors. 670| catch (Exception $e) { > 671| throw new QueryException( 672| $query, $this->prepareBindings($bindings), $e 673| ); 674| } 675| +37 vendor frames 38 artisan:37 Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))結論
configがしっかり反映されていなかったので、以下のコマンドでconfigに
.env
の内容を反映させると解消された。terminal(Docker内)$ php artisan cache:clear $ php artisan config:cache対処法
php artisan tinker
で.envの内容が反映されているか確かめるterminal(Docker内)$ php atisan tinker >> config('database') => [ "default" => "mysql", "connections" => [ "sqlite" => [ "driver" => "sqlite", "url" => null, "database" => "xxx", "prefix" => "", "foreign_key_constraints" => true, ], "mysql" => [ "driver" => "mysql", "url" => null, "host" => "mysql", // この辺に注目 "port" => "3306", "database" => "xxx", // この辺に注目 "username" => "xxx", // この辺に注目 "password" => "xxx", // この辺に注目 "unix_socket" => "", "charset" => "utf8mb4", "collation" => "utf8mb4_unicode_ci", "prefix" => "", "prefix_indexes" => true, "strict" => true, "engine" => null, "options" => [], ], # 以下省略configに、
.env
の内容が反映されてなかったら結論で示したコマンドでどうにかなるかも(自分は解決した)
- 投稿日:2020-07-04T15:08:37+09:00
【Laravel】PortGallery作成日誌 2020-07-04
現在作成中のアプリの外観
この記事について
僕は現在PortGalleryと言うWebアプリを作成しています。
使用言語はphp(Laravel)です。
どうして記事にしたのかと言うと、Twitter転職を始めたものの
中々良い結果に結びついていない事から生じた焦りと、アプリを開発する過程での
リアクションをどなたかから頂きたかった、そしてやらざるを得ない状況を
作るという3つの理由からです。
このアプリの現時点でのコードはこちらです↓
https://github.com/otake619/PortGalleryPortGalleryについて
PortGalleryは、ポートフォリオ投稿型SNSです。
具体的には、各アカウントが自分のポートフォリオの切り取り画像とリンクを
PortGalleryにアップします。
そのポートフォリオについてユーザー間で評価したり、
コメントを付けたりすることで自身のポートフォリオ
への「客観性」が持てるというメリットがあります。完成までの工程について
・要件定義
・UI設計
・コードを書く ←今ここ
・コードを綺麗に(リファクタリング)する
・テスト
・デプロイ
という流れになっています。コードを書く、と言う段落が今回の制作では
一番比重が大きくなっているので、コーディング
の段階を更に細分化してコーディング
・MDBootstrapでUIを作成 ←今ここ
・検索機能の実装
・イイね機能の実装
・評価機能の実装といった流れになります。
※MDBootstrapとは、MaterialDesignBootstrap(マテリアルデザインブートストラップ)の事で、
詳しい使い方は省きますが、導入するとGoogleが提唱したデザインシステムの1種である「マテリアルデザイン」でUIを設計することが出来ます。
公式へのリンクはこちらです→ https://mdbootstrap.com/2020/07/04に学んだこと
アプリを作成している中で学んだことを毎回この段落に書くことにします。
・認証系(新規登録、ログインなど)の画面でのエラーをユーザーに伝えるとき(パスワード間違い、メールアドレス間違いetc...)Laravelではどうやって伝えるのか悩んでいて、validation.phpのエラーメッセージ"This name field is required."などの値を直接書き換えればよいのかと思っていたところ、この記事を友人に共有してもらい解決した↓
https://qiita.com/samuraibrass/items/d71c08e144dbbf98e348解決策としては、日本語化のパッケージを作成された方がいらっしゃるので、そのパッケージをダウンロードして表示するようにする、でした。
2020/07/06に学んだこと
・Gitをなるべく活用する姿勢がついてきた。pushはともかく、自分の尺度ではあるけど
一定の間隔でコミットしている。コミットをせず、プロダクトが出来たと思った段階で
コミット→プッシュという全然gitの旨味を活かせてない活用の仕方はやめた。
gitで定期的にコミットするメリットとしては、いつでもコミットした段階に
戻れる、という事がメリットとして大きいと感じた。例えばある機能Xを追加で作成していた際に
そのX機能を追加する前までは上手く動いていた機能Yが突然かみ合わなくなってうまく動かなくなった、なんて時にはgitでバージョンを戻すのがGoodだと思った。・aタグに変数Xを載せて、別ページでその変数Xを受け取りたい場合がある。
そうした時は、コントローラーでリクエストを受け取り別ページに変数Xを渡す、と言う手段を今日採った。
例として、ユーザーXのuser_id=1とする。Twitterとかでよく見かける別ユーザーのアイコンやTweetをクリックした際にユーザーXに関する情報を表示させたいとき、コントローラーにて”どのユーザーの情報を表示させたいのか?”が分からないと(対象のuser_idが不明の時)データベースからユーザーXに関する情報は持ってくることが出来ない。そうした場合はGETを利用して、aタグに載せた値をコントローラーで受け取って、
別ビューに渡す方法がよいのでは、と思っている。
具体的なコードは、php(timeline.blade.php)<a href="/evaluation/post_eval?user_id={{$portfolio->user_id}}"></a>のaタグをクリックした際に、対象のユーザーXのuser_idを載せてコントローラーへと渡して
php(EvaluationController.php)public static function show(Request $request) { $user_id = $request->input('user_id'); return view('PortGallery.evaluation_post', ['user_id' => $user_id]); }viewメソッドでevaluation_post.blade.phpにユーザーXのuser_idを渡している。
デモgifだとこんな感じになります↓
※評価アイコンをクリックした後、ジャンプしたページに表示されている
2や3と言う数値が対象のuser_idです。この値をもとにして、対象ユーザーの情報をデータベースから取り出してきて表示する、という流れです。
- 投稿日:2020-07-04T14:52:03+09:00
Laradock でLaravel + SQLServerの環境を用意する
Laradockの取得
基本は 公式ドキュメント を参照
// 作業用ディレクトリにlaradockをクローンする git clone https://github.com/Laradock/laradock.git // envファイルをコピーする cd laradock cp env-example .env本記事は公式ドキュメントの新規作成用のプロジェクト手順に従い、次のディレクトリ構成となる想定です。
作業用フォルダ ├ laradock └ lara-test(新規プロジェクトフォルダ)dockerをビルドする前に行う設定
.envの修正
基本設定
APP_CODE_PATH_HOST
に作成予定のプロジェクト名を入力するAPP_CODE_PATH_HOST=../lara-test/SQL Server用設定
DB名、SA用パスワード、ポート番号を設定する。
パスワードは8文字以上で大文字小文字記号数字の4種類から3種以上含んでいる必要があります。パスワード ポリシー### MSSQL ################################################# MSSQL_DATABASE=master MSSQL_PASSWORD="yourStrong(!)Password" MSSQL_PORT=1433WORKSPACE用のインストールオプション、PHP_FPM用のインストールオプションをtrueに変更する。
### WORKSPACE ############################################# WORKSPACE_INSTALL_MSSQL=true ### PHP_FPM ############################################### PHP_FPM_INSTALL_MSSQL=trueそれぞれtrueにしないとDB接続時に次のようなエラーが発生します。
Illuminate\Database\QueryException could not find driverdocker-compose.ymlの修正
ボリュームコンテナーを使用するための修正(Macでのみ必須)
デフォルトでは
${DATA_PATH_HOST}
のディレクトリにマウントするように設定されていますが、Macの場合はそのままだとエラーが出ます。エラー内容2020-05-08 06:49:33.62 Server Error: 17113, Severity: 16, State: 1. 2020-05-08 06:49:33.62 Server Error 87(パラメーターが間違っています。) occurred while opening file '/var/opt/mssql/data/master.mdf' to obtain configuration information at startup. An invalid startup option might have caused the error. Verify your startup options, and correct or remove them if necessary.2020年6月時点ではMac上ではホストのディレクトリマウントがサポートされていないためです。
https://docs.microsoft.com/ja-jp/sql/linux/sql-server-linux-configure-docker?view=sql-server-ver15#mount-a-host-directory-as-data-volume現時点では、SQL Server on Linux イメージを使用した Mac 上の Docker のホスト ボリューム マッピングはサポートされていません。 代わりにデータ ボリューム コンテナーを使用してください。
回避するためにはデータボリュームコンテナを用意してそちらを使用する必要があります。
volume定義例volumes: mssqlvolume: driver: localvolumes: # - ${DATA_PATH_HOST}/mssql:/var/opt/mssql - mssqlvolume:/var/opt/mssqlインストール時に使用される環境変数の変更
設定可能な環境変数はこちら
### MSSQL ################################################ mssql: build: context: ./mssql environment: - MSSQL_PID=Express - MSSQL_DATABASE=${MSSQL_DATABASE} - SA_PASSWORD=${MSSQL_PASSWORD} - ACCEPT_EULA=YDeveloperエディションにするなら
MSSQL_PID=Developer
に変更、言語を日本語にしたいならMSSQL_LCID=1041
に変更など。以降は基本的にMySQLの場合などと同様。
失敗したら、画面に表示されるエラーログやdokcer logs
でログを確認する。コンテナを立ち上げてプロジェクトを作成する
docker-compose up -d workspace nginx mssql php-fpmでコンテナをビルド & 立ち上げて
docker-compose exec workspace bashでコンテナに入って
composer create-project --prefer-dist laravel/laravel .でプロジェクトを作成する。
コンテナ上では/var/www
下にファイルが配置され、ホストPC上ではAPP_CODE_PATH_HOST
で設定したプロジェクトフォルダに各ファイルが配置されている状態となります。コンテナ上にLaravelのファイルが作成される/var/www# ls -a . artisan composer.lock .editorconfig .gitattributes phpunit.xml resources storage vendor .. bootstrap config .env .gitignore public routes .styleci.yml webpack.mix.js app composer.json database .env.example package.json README.md server.php testsこの状態で http://localhost を開くとlaravelのデフォルトページが表示されることが確認できます。
Laravel側のDB設定と疎通確認
Laravel用の.envでSQL Server用の設定をする
新規作成されたlaravelのプロジェクトの.envを編集
DB_CONNECTION=sqlsrv DB_HOST=laradock_mssql_1 DB_PORT=1433 DB_DATABASE=master DB_USERNAME=SA DB_PASSWORD='""yourStrong(!)Password""'
docker-compose.yml
のデフォルトのパスワードではダブルクォートが入っていますが、そのまま.env
に記載すると除外されてしまうので、上記のような対応が必要です。疎通確認
routes/web.php
にRoute::get('/test/', function () { return json_encode(\Illuminate\Support\Facades\DB::select("select @@version")); });を追加して、 http://localhost/test/ でSQL Serverのバージョン情報が表示されたらSQL Serverに接続ができています。
- 投稿日:2020-07-04T02:08:48+09:00
【Laravel】 チェックアウト時に実行すべきコマンド集
- 投稿日:2020-07-04T00:44:20+09:00
DockerのmariaDBにログインできずに困った話
目的
- Docker環境のmariaDBにログインできず困った話をまとめる。
実施環境
- ハードウェア環境
項目 情報 OS macOS Catalina(10.15.5) ハードウェア MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) プロセッサ 2 GHz クアッドコアIntel Core i5 メモリ 32 GB 3733 MHz LPDDR4 グラフィックス Intel Iris Plus Graphics 1536 MB 前提条件
- 下記の先輩の記事と自分の記事を参考に環境を構築した。
困るまでの経緯
- 下記の手順を実行してDockerにてLaravelの開発環境を構築した。
マイグレーションの結果を確認するためにMacのターミナルから下記コマンドを実行してPHPのdockerコンテナに入った。
$ docker exec -it PHPのコンテナ名 bashDockerコンテナ内で下記コマンドを実行してmariaDBにログインを試みた
$ mysql -u ログインmariaDBユーザ名 -p困った現象
先のコマンドを実行してmariaDBにログインを試みたが下記のエラーが出力された。
>bash: mysql command not foundアプリ側でマイグレーションをしたことがあったためこの時点で混乱してしまった。
解決までの経緯
別のターミナルのウインドウにて下記コマンドを実行してmariaDBのコンテナに入った。
$ docker exec -it PHPのコンテナ名 bashmariaDBのDockerコンテナ内で下記コマンドを実行してmariaDBにログインを試みた
$ mysql -u ログインmariaDBユーザ名 -p正常にログインすることができた。
何が間違えていたのか
- PHPのコンテナ内でmariaDBにログインしようとしていた。
- mariaDBはmariaDBのコンテナからでないとログインすることはできない。