ロリポップ!でPHPのSESSION、POSTが動かないときの対処法
Posted: Last Update:
レンタルサーバーのロリポップ!で、ログイン認証ページやコメント投稿ページが動作しない、白い画面になった、見慣れないPHPのエラーが表示される…。そんな時に、まず試したいのがPHPの設定変更です。それでも治らないときに原因を特定する方法と、各原因の対処法も詳しく紹介します!
この記事の目次
- エラーの原因はPHPのセッションかも?
- 最初に試してみて!PHP設定の変更
- output_bufferingを「1」にしても治らないときのはPHPのエラーを確認
- 表示されたエラーに対応する
- エラー1「Sessionが既に始まっている」
- エラー2「headerが既に送られている」
- エラー3「headerを変更することができない」
- Warning: session_start(): Cannot start session when headers already sent in...
- Warning: Cannot modify header information - headers already sent by...
- まとめ
エラーの原因はPHPのセッションかも?
入力フォームとセットでよく利用されるPHPのセッション(SESSION)。PHPの「$_POST」と組み合わせることで、ログイン画面や、コメント投稿、お問い合わせページなどに頻繁に利用される手法です。しかし、レンタルサーバー「ロリポップ!」の初期設定では、SESSIONとPOSTが動作しません(少なくとも筆者は動きませんでした)。
SESSIONとPOSTが動作していないときのよくある現象として「画面が白くなる」ことがあげられます。エラーの原因となっているPHP以降を読み込めなくなり、ページが表示されなくなってしまうのです。(PHP設定でPHPのエラーを表示している場合には、白い画面の代わりにPHPのエラーが表示されます)
ロリポップで、SessionやPostが動かないときには、最初にPHP設定の変更を試してみてください。
最初に試してみて!PHP設定の変更
ロリポップ!でログイン認証ページやコメント投稿ページが動作しない。そんな時に最初に確認したいのが、PHPの設定変更です。
「ロリポップ!」の「ユーザー専用ページ」>「サーバーの管理・設定」>「PHP設定」からphp.iniの設定を行いましょう。「PHP設定」最下部の「その他」から「output_buffering」を探して、「0」を「1」に変更し、「php.iniを設定する」をクリックします。
→
この変更でエラーが回避できた方!おめでとうございます!
この設定を行っても引き続き起こる方は、原因を詳しく確認する必要があります。次の小見出しから原因の特定と対処法を紹介していますので、試してみてください。
output_bufferingを「1」にしても治らないときのはPHPのエラーを確認
「output_buffering」を「1」にしてもエラーが引き続き発生する…。そんな時には、PHPのエラー内容を確認する必要があります。
「ロリポップ!」の「ユーザー専用ページ」>「サーバーの管理・設定」>「PHP設定」からphp.iniの設定を変更します。「PHP設定」最下部「そのほか」の「display_errors」を「Off」から「On」に変更し、「php.iniを設定する」をクリックします。※この設定はサイトの修正が完了したら必ずOffに戻してください。
なお、画面上に表示されるエラーには、ファイルのフルパスも含まれます。フルパスは第三者に知られると悪用されるおそれもあります。エラーが発生しているページに第三者が接続する可能性が高い場合には、PHPのエラーは表示しないほうが賢明です。その場合は、該当のページを一時的に別の場所に移してテストをするなど、工夫してみてください。
表示されたエラーに対応する
「display_errors」をOnにしたら、エラーが発生しているページに改めて接続してみましょう。先ほどは白かった画面に、英語でエラー内容が表示されていると思います。
続きの記事では、よくある4つのエラーへの対処法を紹介します。
- Notice: session_start(): A session had already been started - ignoring in...
- Warning: Cannot modify header information - headers already sent by...
- Warning: session_start(): Cannot start session when headers already sent in...
- Warning: Cannot modify header information - headers already sent by...
この一覧に該当のエラーがない場合は、ネット検索すると様々な対処法が出てきます。画面に表示されているエラーのファイル名の直前までをコピーして、検索してみてください。
エラー1「Sessionが既に始まっている」
Notice: session_start(): A session had already been started - ignoring in...
上記のエラーが表示される場合には、エラーページのPHPを変更する必要があります。エラーが表示されるページのファイルを開いて、「session_start();」の部分を「if(!isset($_SESSION)){ }」でサンドイッチしてみましょう。
(変更前)session_start();
}
このエラーは、既に始まっているsessionを、再度はじめようとしている時に表示されます。遷移後のページに改めてsessionを始める指示があると、「もうセッションは始まっています」というエラーが出てしまいます。if分で「セッションが始まっていない場合だけセッションを開始」と指定することで、エラーを回避することができます。
この設定をした後に、「Warning: session_start(): Cannot start session when headers already sent in...」とページに表示される場合には、小見出し「エラー3」の設定も確認してください。
エラー2「headerが既に送られている」
Warning: Cannot modify header information - headers already sent by...
上記のエラーが表示される場合には、エラーページのPHPを変更する必要があります。エラーが表示されるページのファイルを開いて、「header("Location: example.XXXX");」をセッション指定の直後に持ってきましょう。下記は一例なので、どこに配置するか確認が必要です。多くの場合は「$_SESSION['XXXX']」の直後が目安になります。「$_SESSION['XXXX']」の下にif文があり、「header("Location: example.XXXX");」がif文の中にある場合には、if文内の最初に設置することになるでしょう。
(変更前)echo "ABCABCABC";
header('Location: example.xxx');
}
header('Location: example.xxx');
echo "ABCABCABC";
}
このエラーは、header部分よりも先にbody部分を記述していると発生します。HTTP レスポンスにはheader部分とbody部があり、かならずheaderを先に送信する決まりがあります。上記の例では、「header('Location: example.xxx');」がheaderで、「echo "ABCABCABC";」がbody部分です。header部分を先に記述することにより、エラーを解消できます。
この設定をした後に、「Warning: session_start(): Cannot start session when headers already sent in...」とページに表示される場合には、小見出し「エラー3」の設定も確認してください。
エラー3「headerを変更することができない」
Warning: session_start(): Cannot start session when headers already sent in...
Warning: Cannot modify header information - headers already sent by...
上記のエラーが表示される場合には、最初の設定に戻ってロリポップのPHP設定を変更する必要があります。
「ロリポップ!」の「ユーザー専用ページ」>「サーバーの管理・設定」>「PHP設定」からphp.iniの設定を行いましょう。「PHP設定」最下部の「その他」から「output_buffering」を探して、「0」を「1」に変更し、「php.iniを設定する」をクリックします。
→
エラーが表示されているページソースには、「header("Location: example.XXXX");」という構文がPHPに記載されていると思います。この「example.XXXX」で指定されたHTMLを、変数に保存してブラウザに送信する機能が「output_buffering」です。「output_buffering」が「0」(無効)になっていると、HTMLを変数に保存することができず、エラーが発生してしまいます。「output_buffering」を「1」(有効)にすることにより、エラーを解消することができます。
まとめ
ロリポップ!でPHPのSESSIONとPOSTを利用したページにエラーが発生する場合には、まず「output_buffering」を「1」にしてみてください。それでもエラーが発生する場合には、PHPのエラーを画面に表示させて、エラーごとに対応します。
作業後には「display_errors」をoffにすることを忘れずに!「ロリポップ!」>「ユーザー専用ページ」>「サーバーの管理・設定」>「PHP設定」>「その他」>「display_errors」を、「on」から「off」に変更し、「php.iniを設定する」をクリックすれば、エラーは画面に表示されなくなります。
筆者はHTMLとPHPでサイトを構築しています。ローカル環境ではうまく動いていたSESSION/POSTが、ロリポップのサーバーでは動かず、頭を抱えました。そんな経験から書いた今回の記事、同様の問題でお困りの方の助けになれば幸いです。