レンタルサーバーであるロリポップを利用しているサイトで、新しいドメインを取得した時に現在だとPHPのバージョンが5.6のCGI版かモジュール版が選択できるようになっています。その時に昔からのphpのコードを移植してサービスを作ろうとした時に問題が起きたのでどのように解決したのかメモして起きます。
このページの目次
phpのバージョンアップで起きた問題
下記、レンタルサーバーのロリポップを利用しています。
レンタルサーバーを利用していると問題の切り分けが非常に面倒なのですが、どのように調査すればいいのかのメモもして起きます。
細かくログを取得したり、全て検証できる訳ではありませんが、ひとまずエラーが出なくなるように改善できたので、問題についてと、その解決策について記載します。
mysql関数が利用できなくなった
結論としては、ロリポップ関係なくphpのバージョン5.6からmysql_connectなどのmysqlの関数が利用できなくなりました。それが原因で発生していた問題です。
ロリポップには警告が出ない
ロリポップには警告などがなく、利用しているコードのエラーを自動的に検出してお知らせするなどそういうことがないので気づきませんでした。
ロリポップのお問い合わせ対応から問い合わせて見ましたが、問い合わせの時にどういう問題が起きているか切り分けられていないと解決しないので、コードの問題なのかどうかまで切り分けておくと良いでしょう。
ロリポップのサーバー設定で変更すること
ロリポップのサーバーの設定を見直したり、問い合わせしてみて、色々コードを変更してみて調査していてやっと気づきました。(気づくのが遅いという可能性もありますが。。)
error_displays は on にしておくことをオススメします。
mysqli, pdoのどちらかを利用してみることをオススメします。
mysqli , pdoの記述方法の事例
// user data取得例 $user_name = $_GET['user_name']; $url = parse_url(getenv("CLEARDB_DATABASE_URL")); $server = $url["host"]; $username = $url["user"]; $password = $url["pass"]; $db = substr($url["path"], 1); $link = mysqli_connect($server, $username, $password, $db); $pdo = new PDO("mysql:host=".$server.";dbname=".$db.";charset=utf8", $username, $password); $result = $pdo -> query("SET NAMES utf8;"); $result = $pdo->prepare("select * from dbname "); $result->execute(); $users = $result->fetch();
全ページにsession_startを入れる必要ができた
session_startは$_SESSIONを利用するときに活用しますが、これをsession_startの前後に空白や改行が入っていないかチェックしておく必要があります。
また、session_startが入っていない状態で、エラーログを出力しておかなければ、なぜセッションがページを跨いだときに保持されないかなど、デバッグが難しくなります。
デバッグ時にはエラーログを出力できるように「error_displays」などのサーバーの項目をロリポップ上からドメイン指定をして、onに切り替えておくことをオススメします。
デバッグがしにくいと問題の切り分けが難しいので、最初にやっておくと良いです。
セッションが利用できなかった時の解決策まとめ
- session_startを利用しているかどうか確認
- session_startの入れている場所に改行、空白が入ってないかどうか
- mysql関数を利用しているphpのバージョンが5.6より下のバージョンだったかどうか
シンプルにまず上記の3つを確認してみることをオススメします。