おべんきょうメモ

Web制作の勉強メモ ほぼほぼ自分用

PHPメモ 共通関数編

PHPでなんか作るとき用のメモ
どのページでも概ね記述が必須なような、function.php等の共通ファイルに書いとくべき項目をまとめた

ログ

開発環境では何かしらの不具合が発生したときにすぐその箇所が特定できるよう都度ログに書き出せるようにしておく ぶっちゃけどこをどう書き出すべきなのかまだちゃんとわかってないけど慣れだよね そうだね
とりあえずログを書き出す場合は以下の記述

<?php 
// ログを取るか
ini_set('log_errors', 'on');
// ログの出力ファイルを設定
ini_set('error_log', 'php.log');

ini_setでphp.iniの値を書き換えている
この記述だとログはphp.logに書き出されるよ

デバッグ用の関数

error_log($str)がエラーログに書き出すための関数
なんだけどそれをそのまま使うんじゃなくてちょっと手を加えて使いやすいように独自の関数で用意する

<?php
// デバッグフラグ
$debug_flag = true;

// デバッグログ関数
function debug($str)
{
    global $debug_flag;
    if ($debug_flag) {
        error_log('デバッグ:' . $str);
    }
}

本番環境に投げるときにもデバッグし続けたらたくさんのユーザーが(いるかどうかはともかく)接続する度にログが吐き出されて無限にログファイルが肥大化する、しかし上げるときにわざわざデバック箇所だけ探して削除する作業は気が遠くなる

そういうわけでデバッグを書き出すかどうかのフラグを用意してそれがtrueのときだけログとして出す関数を準備してそれを使うようにする

任意の箇所で

<?php
debug('読み込み開始');

みたいに書くと

[22-Nov-2018 10:36:08 Asia/Tokyo] デバッグ:読み込み開始

という感じでログに書き出される

お手本にした動画で'デバッグ:'と入れるのがデフォのようだったので僕もそれに則ったがぶっちゃけ僕個人は見にくくない……?と思ったので自分ひとりで作るときは抜いてもいいかもしれん

セッションの準備

ログイン周りの情報を一時的に保存してくれるセッション
それを使うための設定

セッションファイルの置き場を変える

<?php
// セッションファイルの置き場を変える
session_save_path("/var/tmp/");

デフォルトだとセッションの有効期限が上手く働いてくれない場合があるので変えるとのこと
調べたところによると 複数アプリケーションのセッションファイルを同じ箇所に置いている場合、それらアプリケーションのセッションの有効期限が異なっているとその中で一番早い有効期限に全アプリが合わせてしまうという特性がある模様

ガーベージコレクションが削除対象にするセッションの有効期限を設定

<?php
ini_set('session.gc_maxlifetime', 60 * 60 * 24 * 14);

GarbageCollectionだからgc_maxlifetimeなんですね
第二引数は秒単位、この場合は14日指定なので60秒×60分×24時間×14日
ちなみにガーベージコレクションは期限を過ぎたら即削除という訳ではなく、期限を過ぎたものを100分の1の確率で削除する

Cookieの有効期限を設定

<?php
ini_set('session.cookie_lifetime', 60 * 60 * 24 * 14);

こっちも秒単位で指定
Cookieの有効期限を延ばすことでブラウザを閉じてもログイン情報を保持できる

セッション開始

<?php
// セッション開始
session_start();
// セッションIDを新しく生成したものと入れ替える(なりすまし防止)
session_regenerate_id();

セッション変数$_SESSIONを利用するときはsession_start();の宣言が必須
session_regenerate_id()はセッションの中身そのままIDだけ別のものに入れ替えるよ その都度変更することで他人にセッションID抜かれてなりすまされるのを防いでいるってことかな

画面遷移したときに諸々の情報をログに書き出す

画面遷移をしたときにセッションの情報とか現在の時間とかをログに出すようにしとくといざというときに便利だと思われ
書き出しとくと良さそうなのは

  • セッションID session_id()
  • 現在日時 time()
  • セッション変数の中身 print_r($_SESSION, true)
  • (ログイン状態の場合)ログイン期限のタイムスタンプ

あたりだろうか

上で設定したdebug($str)なんかを利用してログに書き出してあげる

<?php
debug('セッションID:' . session_id());

こんな感じ

print_r()は変数の値をわかりやすく表示してくれるらしい、ただデフォルトだと「その場で表示する」という特性がある(この関数単体でログに出力できるという認識でいいのかな)ためdebug()(=error_log())やらechoみたいな出力タイプのものと一緒に使っちゃうと意図しない挙動をする 変数に代入も出来ない

じゃあどうしたらいいかと言うと第二引数にtrueをつけてあげる そうすると「結果を文字列で返す」という挙動に変わるのでdebug()なりerror_log()なりで出力してあげてもいいし変数に代入してもいい