CakePHP3・Herokuでfileログを見たい

CakePHP3・Herokuでfileログを見たいって時ありますよね。

前回はconsoleログでしたので、今回はfileログの見方を説明します。

とはいえ、これもスクール時代の講師の方に教えていただきました。

感謝しかありません。

それでは見ていきましょう。

【自分の環境】
macOS Catalina
PHP7.4.2
CakePHP3.8
MAMP5.7
Apache2.2
MySQL5.7

ログ設定の確認

設定はapp.phpです。

Herokuを使っている方はapp_heroku.phpかもしれません。

自分は以下のようになっています。

        'custom' => [
            'className' => FileLog::class,
            'path' => LOGS,
            'file' => 'custom',
            'levels' => ['notice', 'info'],
        ],

カスタムという名前のログで、ログレベルはnoticeとinfoに絞っています。

そしてclassNameはFileLogですね。

これはログがファイルとして出てくる設定です。

fileログの見方を見ていきましょう。

Herokuコマンドを使う

Herokuコマンドを使うだけです。

と言いつつ、かなり苦労した部分です。

ログ設定により出てきたログファイルをローカルに持って来ればいいんです。

と言っても、最初はやり方が本気でわかりませんでした。

Herokuからローカルにコピーする方法は「heroku ps:copy filename」です。

以下に公式ドキュメントを載せておきます。

Heroku Exec (SSH トンネリング) | Heroku Dev Center

filenameは何にする?

ですが、単純に「filename」に「custom.log」とするだけでは動かずエラーになります。

パスを合わせなければなりません。

自分の場合、「filename」を「/app/logs/custom.log」とすると動きました。

つまりコマンドとしては「heroku ps:copy /app/logs/custom.log」です。

これで行ける方はいいですが、行けない方は、まずHerokuのパス構造を「heroku run bash」で探らなければなりません。

「heroku run bash」と打つと、Herokuの中にbashで入れますので、そこからpwdしたりlsしたり(基本的なコマンドです)すれば、ログがどこに出力されているかわかります。

これでパスを合わせてください。

ローカルのログ出力場所

これはルートディレクトリです。

これを何とかズラしてデスクトップなどにしたかったのですが、できず、失敗続きです。

いいやり方があったら教えてください。

終わりに

以上となります。

fileログの見方でした。

Herokuからローカルにコピーしてくる方法なんて、全くわからなかったです。

教えてくれた方に感謝ですね。

ありがとうございました。

CakePHP3・Herokuでconsoleログを見たい

CakePHP3・Herokuでconsoleログを見たいっていう時ありますよね。

特に自分が設定したログの出力方法がconsoleログだったので、気になっていました。

恥ずかしながらHerokuでの見方が自分はググってもわからなかったので、その見方を説明します。

ちなみにスクール時代の講師の方に頼って教えていただきました。

それでは見ていきましょう。

【自分の環境】
macOS Catalina
PHP7.4.2
CakePHP3.8
MAMP5.7
Apache2.2
MySQL5.7

ログ設定の確認

ログ設定はapp.phpですね。

Herokuを使っている方はapp_heroku.phpかもしれません。

自分は以下のようになっています。

'Log' => [
        'debug' => [
            'className' => 'Cake\Log\Engine\ConsoleLog',
            'stream' => 'php://stdout',
            'levels' => ['notice', 'info', 'debug'],
        ],
        'error' => [
            'className' => 'Cake\Log\Engine\ConsoleLog',
            'stream' => 'php://stderr',
            'levels' => ['warning', 'error', 'critical', 'alert', 'emergency'],
        ],
    ],

classNameがconsoleなことから、consoleログとして出力することがわかります。

fileログの方はclassNameがfileになっていると思います。

今回はconsoleログの見方なので、その見方をご紹介します。

Herokuコマンドを使う

Herokuコマンドを使うだけです。

ターミナルで、アプリのディレクトリに移動し「heroku logs」 と打ちます。

するとログがバーっと出てきます。

ログ記録 | Heroku Dev Center

このHeroku公式ドキュメントのログ記録にいろいろ載っています。

少し補足すると、さっきのログは過去ログしか見れません。

リアルタイムでログを見たい場合は「heroku logs --tail」と打ちます。

これらは先ほどのHeroku公式ドキュメントのログ記録にも載っていますので、見てみてください。

終わりに

以上となります。

ログはセキュリティ的に外せないので、見方を知っておきたいですよね。

これでconsoleログは見れると思います。

fileログは?という方のために、次回fileログについてお話します。

とはいえ、ただの受け売りですが…。

ありがとうございました。

CakePHP3・Herokuでデプロイしたサイト全体をhttpsにしたい(SSL化)

CakePHP3・Herokuでデプロイしたサイト全体をhttpsにしたい時ありますよね。

なんか難しい設定が必要なのかと思ってましたが、意外と簡単な設定でできました。

その手順を説明していきます。

【自分の環境】
macOS Catalina
PHP7.4.2
CakePHP3.8
MAMP5.7
Apache2.2
MySQL5.7

やることは2つ

まずRouter.phpを設定します。

そしてwebrootにある「.htaccess」を設定します。

この2ステップです。

どちらか一方ではダメみたいです。

まずRouter.phpを設定

結構深いところにあります。

vendor/cakephp/cakephp/src/Routing/Router.phpを開いてください。

該当部分は以下のようになっています。

(書き換え前)

Configure::write('App.fullBaseUrl', $base);

上記を下記に書き換えます。

(書き換え後)

Configure::write('App.fullBaseUrl', 'https://'.$_SERVER["HTTP_HOST"]); // 書き換える

これでサイト全体がhttpsを利用するようになります。

ただこのままではhttpに飛ばされる設定になっているので、httpに行っちゃいます。

なのでhttpからhttpsに無理やり飛ばす設定をこれからします。

webrootにある「.htaccess」を設定

いきなり補足ですが、webrootなのでスマホ版を作っている方は2つあります。

元々は以下のようになっています。

(書き換え前)

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

(書き換え後)

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTP:X-Forwarded-Proto} !=https // この行を追加
    RewriteRule ^/?(.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L] // この行を追加
    RewriteCond %{REQUEST_FILENAME} !-d // この行を追加
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

3行追加しています。

これでhttpからhttpsに無理やり飛ばす設定になりました。

正直、中身はよくわかってないです。

サイトによっても記述の仕方が違いました。

自分は上記で行けています。

終わりに

SSL化というと何やら難しい設定をしなければならないのかと思いましたが、Herokuでデプロイしたということもあって簡単でした。

これがサーバーから構築するとなると、また話は違ってきそうです。

ただ勉強にはなりそうですね。

いつかはHerokuに頼らない構築をやってみたいと思っています。

ありがとうございました。

CakePHP3でデプロイした本番環境でファビコンの変更をしたい

CakePHP3でデプロイした本番環境のお話です。

ファビコンってありますよね。

ロームだとタブのところに表示されるアイコンのことです。

CakePHP3の場合だと、デプロイした時にCakePHPロゴマークになっています。

これを変えたい時のお話です。

【自分の環境】
macOS Catalina
PHP7.4.2
CakePHP3.8
MAMP5.7
Apache2.2
MySQL5.7

ファビコンの作成

ファビコンがないよって方は、作ってください。

自分は以下のサイトで作りました。

ファビコン作成 favicon.ico 無料で半透過マルチアイコンが作れます

念のためHtmlHelper.phpの記述を見る

だいぶ深部ですが、vendor/cakephp/cakephp/src/View/Helper/HtmlHelper.phpの記述を閲覧します。

if ($type === 'icon' && $content === null) {
                $types['icon']['link'] = 'favicon.ico';
            }

こんなかんじになっていると思います。

$types['icon']['link']に'favicon.ico'が設定されています。

これはfavicon.icoでファイル検索するとわかるように、赤いケーキのアイコンです。

つまりCakePHPのファビコンです。

このファイルを新たなファビコンで上書きするか、設定を新たなファビコンファイルの名前にすれば、行けそうですね。

この記事では旧ファビコンを新ファビコンで上書き

上書きします。

先ほど作ったファビコンの名前を「favicon.ico」にしてください。

これでwebroot(スマホ版がある方はwebrootが2つあります)にあるfavicon.icoを上書きしてください。

これでファビコンがすり替えられました。

あとはキャッシュを消したり、待ったりする

一旦キャッシュを消しておきましょう。

あとは反映に時間がかかりますので、待ちましょう。

そうすると反映されているはずです。

終わりに

以上となります。

CakePHPのファビコンではさすがに謎なので、最低限消しとくくらいはしたいですよね。

消しとくとクロームの場合、地球になります。

ぜひ自分のファビコンに設定してみてください。

ありがとうございました。

CakePHP3でデプロイした本番環境でdebug_kitを使いたい

本番環境ってエラーを解決したい時ってありますよね。

基本的にはエラーメッセージを出したらNGです。

アウトなのですが、それではエラー解決が難しいです。

CakePHP3と言えばdebug_kitです。

自分はHerokuでデプロイしましたが、その時の設定でdebug_kitをオフにしました。

そうすると「Error An Internal Error Has Occurred」(内部エラーが発生しました)とだけ表示されます。

これじゃ解決できないので、一旦オンにする設定を説明していきます。

ただすいません、自分が調べた中に古い情報もあったみたいで、とにかく手当たり次第やっています。

ご了承ください。

【自分の環境】
macOS Catalina
PHP7.4.2
CakePHP3.8
MAMP5.7
Apache2.2
MySQL5.7

①app.phpをいじる

まずapp.phpをいじります。

Herokuでやっている方はapp_heroku.phpもいじった方がいいです。

return [
    'DebugKit' => [ // 追加する行
        'forceEnable' => true, // 追加する行
    ], // 追加する行
    /*
     * Debug Level:
     *
     * Production Mode:
     * false: No error messages, errors, or warnings shown.
     *
     * Development Mode:
     * true: Errors and warnings shown.
     */
    'debug' => filter_var(env('DEBUG', true), FILTER_VALIDATE_BOOLEAN), // trueにする

上記のような感じにします。

app.phpの一番上にreturnがあるのですが、その中に'DebugKit'という項目を入れてあげてください。

そして「'forceEnable' => true」してあげてください。

意味は「強制的にON」みたいなかんじでしょうか。

また通常の'debug'も中身を「true」にしてあげてください。

これでapp.php(app_heroku.php)の設定は終了です。

②src/Application.phpの設定

検証できていないんですが、これも恐らく必要かと思っています。

src/Application.phpを以下のように設定します。

(設定前)

//if (Configure::read('debug')) {
            Configure::write('DebugKit.forceEnable', true);
            $this->addPlugin('DebugKit');
        //}

(設定後)

//if (Configure::read('debug')) { // コメントアウト
            Configure::write('DebugKit.forceEnable', true);
            $this->addPlugin('DebugKit');
        //} // コメントアウト

ビフォーアフター を書きました。

ご覧のように「if (Configure::read('debug'))」をなくしています。

とにかくdebug_kitを読み込ませますっていう設定のつもりです。

これはもしかすると不必要かもしれません。

曖昧ですいません。

終わりに

以上となります。

①は絶対に必要ですが、②はちょっとわからないです。

ですが2つ共やったら確実に出るようになることは保証します。

デバッグキットを表示させたいという方はやってみてください。

ありがとうございました。

「composer install」と「composer update」、「composer.json」と「composer.lock」の違い

CakePHPではcomposer使いますよね。

初心者で何かよくわからず使っている方、多いんじゃないかと思ってます。

「composer install」と「composer update」の違いがよくわからない…とかあるあるです。

なんかこの違いを間違えただけでシステムが動かなくなる…とか聞いたことあって、勝手に怯えてました。

なのでcomposerは大事です。

【自分の環境】
macOS Catalina
PHP7.4.2
CakePHP3.8
MAMP5.7
Apache2.2
MySQL5.7

「composer install」と「composer update」の違いをざっくり

ざっくりですが、以下の違いです。

「composer install」をする

「composer.json」は無視され、「composer.lock」の内容を元にライブラリがインストールされます。

この時「composer.lock」はもちろん内容を参照されますが、更新はされません。

「composer update」をする

「composer.json」の内容を元にライブラリがインストールまたはアップデートされます。

またその結果で「composer.lock」の内容が更新されます。

「composer install」と「composer update」の使いどころの違い

composer installは0から環境を作りたいときだと思います。

他人の環境を持ってきたい、別のプロジェクトでも読み込ませたい…などでしょうか。

composer updateはライブラリを追加したいときだと思います。

何かを作っている途中に使われますね。

ここで疑問、「composer.json」と「composer.lock」の違いは?

そういう疑問が生まれると思います。

違いをざっくりですが、以下にまとめました。

json
・自分で記述して作成
・1回目のcomposer installをするとlockを生成
・composer updateでこの内容を元にライブラリをインストールやアップデート

◎lock
・1回目のcomposer installで自動作成
・composer installでこの内容を元にインストール
・composer updateでこの内容が更新

「composer.json」と「composer.lock」の違いの要点

jsonは手動で作る、lockは自動で作られる

jsonを元にlockを作成、lockはjsonを元に作られる

③「composer update」ではjsonを元に動き、lockは更新されるだけ

こんなかんじでしょうか。

終わりに

以上となります。

かなりざっくりなのですが、要点をまとめてみました。

自分も実践の機会が少なく、まだわかっていません。

間違いがあればコメントで指摘していただきたいです。

これが勉強のきっかけになれば嬉しいです。

ありがとうございました。

CakePHP3をHerokuでデプロイしたい③

前回の続きの記事となります。

(前回の記事)

CakePHP3をHerokuでデプロイしたい② - 29歳からエンジニア目指すブログ

以下のQiitaを参考にしてCakePHP3をHerokuでデプロイしていました。

CakePHP3をHerokuで動かす設定 - Qiita

しかしデプロイ後にデバッグすると、Memcachedという分散キャッシュサーバが機能してないと怒られてしまいます。

Memcachedを拡張しないといけないみたいでした。

その方法を見ていきます。

【自分の環境】
macOS Catalina
PHP7.4.2
CakePHP3.8
MAMP5.7
Apache2.2
MySQL5.7

Herokuでのデプロイ後のエラー

デプロイ後にデバッグキットを起動させると、こんなエラーが出ています。

Warning (512): Cache engine Cake\Cache\Engine\MemcachedEngine is not properly configured. [CORE/src/Cache/Cache.php, line 178]

これは翻訳すると、「MemcachedEngine が正しく設定されていない」ということです。

Memcachedをcomposerで入れる

どうやらMemcached拡張機能をcomposerで入れればいいらしいです。

composer.jsonに以下のように書き込みます。

{
    "require": {
       ...,
        "ext-memcached": "*"
    }
}

「ext-memcached」は「Memcached拡張機能」という意味ですね。

これでcomposer updateしていきます。

ところがcomposer updateが通らない

通らないですね。

ターミナルで以下のような注意をされます。

Root composer.json requires PHP extension ext-memcached * but it is missing from your system. Install or enable PHP's memcached extension.

翻訳すると「Root composer.jsonにはPHPのext-memcached拡張機能が必要ですが、あなたのシステムにはありません。PHPmemcached拡張機能をインストールするか、有効にしてください。」と出ます。

自分の解釈では、「ローカル環境にPHPmemcached拡張機能をインストールしないとダメ」ということです。

ローカル環境にPHPmemcached拡張機能をインストールしていく

それではやっていきましょう。

How to install memcached module for php@7.1 on MacOS High Sierra? - Stack Overflow

このスタックオーバーフローに救われました。

英語ですが、2本指クリックで「日本語に翻訳」をすれば全然読めます。

※homebrewが入っていない方は入れておいてください。

①ターミナルで「pecl bundle memcached」と打つ

memcachedディレクトリを作りたい場所で行います。

自分はよくわからずアプリのルートディレクトリで行っていました。

動いているのでよしとします。

②ターミナルで「cd memcached」と打つ

出力したディレクトリ(memcached)に移動します。

③ターミナルで「phpize」と打つ

ググったのですが、正直、意味はよくわかってません。

たくさん記事があるので、ググってみてください。

④ターミナルで「brew install libmemcached zlib」と打つ

libmemcachedとzlibの2つがインストールされます。

すでにインストールされていたら、「インストールされてるよ」と言われます。

⑤ターミナルで「brew list zlib」と打つ

zlibディレクトリを取得します。

以下のかんじで出てきます。

/usr/local/Cellar/zlib/1.2.11/include/ (2 files)
/usr/local/Cellar/zlib/1.2.11/lib/libz.1.2.11.dylib
/usr/local/Cellar/zlib/1.2.11/lib/pkgconfig/zlib.pc
/usr/local/Cellar/zlib/1.2.11/lib/ (3 other files)
/usr/local/Cellar/zlib/1.2.11/share/man/man3/zlib.3

これは「/usr/local/Cellar/zlib/1.2.11」が共通していますね。

これを次に使います。

⑥ターミナルで「./configure --with-zlib-dir=/usr/local/Cellar/zlib/1.2.11/」と打つ

zlibパスを前のコマンドのパスに置き換えてます。

最後の方のパスやバージョンが違ったら揃えてください。

⑦ターミナルで「make」と打つ

何かが作られます。

⑧ターミナルで「make install」と打つ

何かがインストールされます。

⑨該当のphp.iniファイルに拡張子行を追加する

該当のphp.iniファイルがわからなかったら、ターミナルに「php -i」と打って調べてください。

以下の行を探します。

Configuration File (php.ini) Path => /usr/local/etc/php/7.3

パスは自分のものなので、それぞれの環境のものが出ると思います。

そのphp.iniを開いて、以下のように書き加えます。

;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;

(中略)

[memcached] // この行を追加
extension=memcached.so // この行を追加
⑩ターミナルで「heroku restart」

そしてターミナルで「heroku restart」(php.iniの変更を反映させる)してください。

これで反映されると思います。

最後にチェック、ターミナルで「php -m」

php -m」して、リストに「memcached」があれば行けてます。

これでcomposer updateができるようになります。

再びcomposer update

composer.jsonに「"ext-memcached": "*"」を書き込んだら、composer updateします。

上記をしっかりやっていれば、これで行けると思います。

ところが「1 is not a valid serializer engine for Memcached

本番画面を見ると、「1 is not a valid serializer engine for Memcached」というエラーが出るかもしれません。

またエラーか…と思いますが、app.phpで以下の記述をコメントアウトすれば大丈夫です。

'serialize' => true, // コメントアウトする行

これをコメントアウトしてください。

ちなみにapp.phpに複数(3つか4つ)あるので、全部コメントアウトしてください。

よくわかってないですが、これを消せばエラーがなくなります。

終わりに

以上となります。

だいぶ長くなりましたが、これでHerokuの本番画面がエラーなしになるはずです。

CakePHP3をHerokuで動かす設定 - Qiita

上記のQiitaの記事はとても良いのですが、ちらほらこの通りに設定してMemcachedで詰まってteratailで聞いている方がいたので、記録に残しました。

お役に立てば幸いです。

ありがとうございました。