「開発環境とリリース環境はできるだけ差異がないようにする」というのは、どの言語でも基本原則ですね。
ですが、そこがWeb開発の難儀なところで…
「事前に聞いていた環境と違う」とか「そもそも誰もそこをヒアリングしていなかった」とか「いざリリースという段階で発覚した」とかいうことが往々にして発生します。
古いバージョンに適合するように調整するのは、基本的には面倒な作業です。
特に「古いバージョンでは利用できない関数」を利用していると、本当に悲惨なことになります…
今回は「そこまで悲惨ではないのだけれども、特定に時間を使ってしまった」事例ということで「session関数」と「header関数」、「pdo関数」について扱います。
session関数とheader関数について
まずは「session関数」と「header関数」ですが、共通するポイントとしては「何か出力済だと正常に動作しない」という点です。
解決方法は、ファイルの先頭に以下の記述を追加することです。
ob_start();
「ob_start関数」ですが、出力バッファリングを有効にする関数です。
「何か出力済だと正常に動作しない」ので、「出力をバッファに入れておく」という雑な解決方法ですね。
どうやらPHP 7系では、この「何か出力済だと正常に動作しない」点が、緩和されているように見受けられます。
例えば、単ページでフォームを処理する際に「if文の中でsession_startを記述する」などの場合、PHP 7系ではエラーを吐くことが少ないようです。
(というか、実際にエラーは吐かれてなかった)
header関数の場合であれば、全ての処理を終えた後にリダイレクトする場合などが該当すると思われます。
一切出力しないDB更新系のファイル(POSTでフォームの内容を受け取って処理し、リダイレクトして戻るだけ)がエラー吐いたので「ああ、こういうことだったなそういえば…」となってしまいました。
pdo関数でエラーになる場合
実際に遭遇したエラーで、こちらの方が特定が難しかったのですが…
「new pdo()」に記載する文字列に空白を含んでいると、認証(new)のタイミングではじかれるというエラーが発生しました。
このエラーがPHPのバージョンに起因するものなのか、sqlのバージョン等に起因するのかは不明です。
正直、どれだけコードを確認しても、どれだけ不具合を検索しても原因が特定できず、かなり混乱しました。
まとめ
古いバージョンに適合させるより、同じ環境で構築できる方が良いよね…