Laravel 4 を PHP 7 環境へ移行したお話。
2018.06.10
この記事は最終更新日から1年以上が経過しています。
どもです。
今回は、とあるWebサービスをLaravel4で作成したはいいが長年放置していていたので、
サーバー環境もさくらサーバーから、conohaへと移動させたいなと思い、思い切って行ってみました。
laravel4をPHP7環境へと移動させて見た話です。
データベース移動
まずは、MySQLダンプでデータベースのデータをまるっとダンプ。
$ mysqldump --single-transaction -u DBユーザ名 -p DB名 > 出力先ファイル名
新しい方のサーバーに同じDB名のデータベースで作成。
$ mysql> create database データベース名;
ダンプデータをまるっとインポート。
$ mysql -u ユーザー名 -p データベース名 < dumpファイル名
そのまま、Laravelのアプリケーションフォルダをまるごと移動。
適当なサブドメインを設定してブラウザからアクセス。
表示するかな。。
と淡い期待を持ってアクセスしてみたところ、エラー。
Whoops, looks like something went wrong.
Whoopes!!
まぁそうですよね。
とりあえず、デバッグ出来るようにエラーログが表示するように修正。
app/config/app.php
'debug' => true,
HTTP_USER_AGENTのエラー
どうやら、/bootstrap/start.phpで、エラーになっている。
PCとスマホで表示切り替えを行うためのscriptのところが原因だったようでした。
/bootstrap/start.php
$ua = $_SERVER['HTTP_USER_AGENT'];
といった、ユーザーエージェント取得のサーバー変数でコケている様子。
どうやら、FastCGIのphp-fpmを動かしていると、ユーザーエージェントの取得の環境変数 $_SERVER[‘HTTP_USER_AGENT’];が使用できないとかとか。
とりあえず、nginxの設定を変更してみました。
/etc/nginx/nginx.conf
location ~ \.php$ { ... fastcgi_param HTTP_USER_AGENT $http_user_agent; ... }
ふむ。これで大丈夫だろうと、nginxを再起動。
$ systemctl restart nginx.service || sudo systemctl status nginx.service -l
確認すると、依然として環境変数 $_SERVER[‘HTTP_USER_AGENT’];で、未だコケている。
ふーむ。
調べていると、「HTTP_USER_AGENT」という文字列が使用できない。とかとか。
本当なのか??
とりあえず、別名の環境変数を設定。
/etc/nginx/nginx.conf
location ~ \.php$ {
…
fastcgi_param HTTP_UA $http_user_agent;
…
}
ふむ。いい加減これで大丈夫だろうと、nginxを再起動。
しかし、ダメだ~。
更に調べていくと、「isset」関数で、存在判定行えば良いと言う情報を得て、こちらで判定するところ
isset 関数用いた形に修正。
if(isset( $_SERVER['HTTP_USER_AGENT'])) {
再びアクセス。
やっと、エラーが消えた。
が、こんどは別のエラーが。。。
Function mcrypt_decrypt() is deprecated
ErrorException
うん?何だこのエラー。
ライブラリ(Laravel)側でコケている。
とりあえず、キャッシュをクリアしてみる。
キャッシュクリアコマンド キャッシュを作り直す
$ composer dump-autoload $ php artisan clear-compiled $ php artisan optimize $ php artisan config:cache
と、行ってみたが、特に変化はなく。。
手動でも削除してみる。
cacheが残っているエリア
/laravel/bootstrap/cache/ /laravel/storage/framework/cache/
上記の各ディレクトリで rm -rf *.php を実行。
うーん。これまた特に変化はなく。。
キャッシュなどクリアしてもダメだな。。
再び、色々調べた結果。
とりあえず、「mcrypt_decrypt」非推奨関数は PHP 7.1.0 で 非推奨となり、PHP 7.2.0 で削除 されたとのこと。
お。おう。
また、mcryptモジュールも10年以上まったくメンテされていないという理由で削除されたということ。
お。おう。
うーん。。
どうしよう。。
と、これまた色々調べた結果。
どうやら、こちらの一文を入力すれば解決するみたい。
error_reporting(E_ALL ^ E_DEPRECATED);
app/config/app.php
error_reporting(E_ALL ^ E_DEPRECATED);
「app/config/app.php」に上記を追加。
こちらでどうだ!!
キター
ということで、DNSの移行もして無事、Laravelの移行が完了しました。
そこそこ時間を使ってしまいました。
でわではぁ。
終わり。