CakePHP – 1.3のPHP7移行と延命 その弐

前回の続きだ。

今回は実際にLEMP設定したEC2インスタンスにCakePHP1.3をデプロイしてみようと思う。

とは言え、実はすでにしてもうCakePHP1.3はダウンロードできなくなっている。これはサポートが切れてるわけで、仕方がない。

たまたまアーカイブを持っていたので、これを使うことにする。幸いにも最終バージョンだった。使いたいやつは心して落とせよ。

CakePHP1.3.21

そういえばなんもやってない

PC買い替えてからというもの、もともとゲーム用に構築したマシンでもあり、開発用のツールなどが全然入ってなかった。

Windowsで最強のコンソールであるCMDerも、WindowsのパッケージマネージャであるChocolateyも、当然Node.jsもGit Bashも入ってない。
ファイルをアップロードするSCPソフトのFilezillaも当然入ってない。

というわけで、RLoginのSCP機能をつかって、zipファイルをそのままアップしてしまおうと思う。

実はこのボタンをクリックすると、ファイル転送アプリが起動するのだ。

あんまり超絶SCPって感じには作られてないっぽいので、転送中にターミナルをいじったりすると、転送が止まったりする。
特に今回は無料枠だけど念のため一番安いオレゴンのEC2を使ってるので、ネットワーク的に遅い。

だから今回みたいにCakePHP1.3のzipを1個だけ送信するなら良いけど、普段はちゃんとFilezilla使ったほうが良いと思う。

というわけで、/var/www直下にzipファイルを転送した。

デプロイする

基本的にSCPてのはファイル1個1個を暗号化したりして送信するので遅い。zipファイル1個だけなら暗号化も1回ですむので、zipを解凍するのはサーバ側で行うほうがスマートだ。

これで/var/www/cakephp-1.3.21フォルダができるので、htmlフォルダに入れ替える。

これで/var/www/htmlの中身がCakePHP1.3になった。

念のため、所有者をec2-userにしておく。

次はNginxの設定ファイルだ。CakePHP専用の書き方が有る。

# vi /etc/nginx/conf.d/virtual.conf

中身を以下のように書き換える。

その後はNginxを再起動すればOK。

ブラウザでチェック

おそらくエラーでCakePHPのいつもの画面は表示されないと思う。本来真っ白けっけのジンジロゲだが、Google Chromeとやらのおせっかい機能で、ブラウザのエラーページが表示される。

実はもう、この時点でCakePHP1.3とPHP7がぶつかり合ってるのだ。

ログを見る

大人なんだからちゃんとログを見よう。

はい、出ました。

IPアドレスは伏せ字。

で、これからこういったPHPのエラーを修正しながら、CakePHP1.3をPHP7対応していくことになる。

修正内容

大前提として、これからやる作業は以下の内容になる。

  • CakePHPのコアをいじる
    • 古い書式を新しい書式に書き換える
    • PHPで使われてるクラスをCakePHP向けに書き換える
    • オーバーロードの対策を練る

そのため、エディタは一括置換が可能なATOMを使って作業してみる。オーバーロードの部分はなかなか手強い。

ATOMの一括置換

まずはデスクトップなどに解凍したcakephp-1.3.21をATOMで読み込み、cakeフォルダを右クリックし、Copy Project Pathを選択する。

その後Ctrl+Shift+FでGrep+Replaceを表示し、一番下の段にコピーしたパスを貼り付ける。

あとは必要に応じて検索したいキーワードを一番上にタイプし、書き換えたい文字列を真ん中にタイプ後、Replace Allボタンで一気に書き換えてくれる。

Filezillaを使う

やっぱりファイルまとめて一気にアップロードしたいので、Filezilla落としてくることにした。
最初からインストールしておけばよかったかな。

Filezillaの初期設定は個人的に気に入らないので、少しだけ設定をいじることにする。

転送の同時転送から最大同時点総数部分を2から4にしておく。これで一気に4ファイル送受信しようと試みる。

インタフェースでは、レイアウトをエクスプローラ、メッセージログの位置を転送キューペイン内のタブとしてに変更する。

次にメニューの表示からクイック接続バーのチェックを外す。

次に、ブックマークからブックマークの追加を選択し、デスクトップを追加しておく。

最後に、ツールボタンの一番左側のサイトマネージャを開くボタンを開き、接続先情報を作る。

設定 内容
ホスト 接続先サーバのIPアドレス
プロトコル SFTP
ログオンの種類 鍵ファイル
ユーザ ec2-user
ファイルを開く pemファイルを指定

つづいて詳細タブを開き、ローカルの場所とリモートの場所を設定しておき、ついでに同期ブラウジングを使用にチェックしておくと、アップロード先を間違えないで住む。

これで接続が可能だ。

で、前回やってなかったかもしれないので、/var/www/の中身を書き込み可能にしておく必要がある。

これでOKだ。

unexpected ‘new’ (T_NEW) 対策

これはクラスをオブジェクト化する際にnew演算子をつかって参照で代入するときに出るエラーだ。

=& new= newに一括置換すればOK。

ただし、数カ所に= & newという記述も有るので、= & new= newにする作業も必要になる。

検索文字列 置換文字列
=& new = new
= & new = new

一括置換が終わったらcakeフォルダごとアップロードする。

アップロード後はブラウザをリロードしてログを更新させる。

Cannot use ‘String’ as class name as it is reserved 対策

これは、CakePHPが使っているStringクラスがPHPの型名と同じ名前であることと、PHP7では型名で使われてる名前はクラスで使えないよ、というエラーになる。

ということで、単純に名前を変えてしまえばOKだ。

StringCakeStringに一括置換する。

検索文字列 置換文字列
class_exists(‘String’) class_exists(‘CakeString’)
import(‘Core’, ‘String’) import(‘Core’, ‘CakeString’)
String:: CakeString::
LIBS . ‘string.php’; LIBS . ‘cake_string.php’;

次に、ファイル名とクラス名を変更する。

cake/libs/string.phpcake/libs/cake_string.php

ファイル名を変更したので、アップロードする前にリモート側のcake/libs/string.phpは削除しておく。

その後cakeフォルダを丸ごとアップロードすればOK。

アップロード後はブラウザをリロードしてログを更新させる。

CakePHPが現れる

上記2個の対策をすると、一旦CakePHP1.3のビューが表示されるようになる。

此処から先は、ログを見ないでもブラウザでエラーを確認できるので楽になる。

予めapp/config/core.phpを開き、

にしておこう。

実際に稼働中のCakePHP1.3で作られたプロジェクトは、こう簡単には行かないと思うが、基本的にコアを修正しても動かないのはユーザランド側に問題があるということになる。なので、都度修正するしかない。

おわり

次回はビュー周りなどを中心にPHP7対応化していこうと思う。

ところで話は変わるが

動くダレノガレ。