エス技研

WordPress、CakePHP、PHP、baserCMSなどの Web系システムを中心に情報を提供します!


サーバ移転、PHPバージョンアップでPHPのソースコードが表示される・ショートタグのPHPが動かない

      2017/03/11

サーバ移転、PHPのバージョンアップでショートタグが認識されずPHPのソースコードが表示される

 

PHPのソースが表示される原因の一つ・ショートタグの利用

 

  • PHPのバージョンアップをした。
  • サーバを移転した。
  • ローカル環境から本番環境に移した。

 
そうしたら PHPが動かなくなった!
という場合の対処方法についての解説です。
 
 
現象としては、以下のような状態。

  • PHPが動いていない(画面が真っ白など)。
  • 画面を見ると PHPのソースが見えている。

 
 
その原因は、PHPのショートタグ「<? ?>」の設定ではないでしょうか?
 
 
設定は、php.iniの「short_open_tag」の設定を下記の様に変更するとうまくいくのではないでしょうか?
 
 short_open_tag Off
 
  ↓
 
 short_open_tag On
 
 
この「short_open_tag」のデフォルト設定が、PHPのバージョンによって異なります。
そのため、サーバを移転したり、PHPのバージョンを変えることで「short_open_tag Off」となり、PHPのショートタグが動かなくなる、という不具合が発生するわけです。
 
 

PHPのショートタグとは?

 
PHPのプログラムを記述する際、PHPのソースコードの部分が PHPであることを宣言するために
 

 
の様に「<?php …… ?>」で PHPのソースコードを囲みます。
 
これが PHPの基本形です。
 
 
ですが「<?php」を短縮して、下記の様に「<? …… ?>」で PHPのソースコードを囲むだけで PHPと認識させようとするものをショートタグと言います。
 

 
ずいぶん短くなりましたね(笑)。
 
 

<?= $text ?>というショートタグもある

 
<?= $text ?>

<?php echo $text; ?>
の短縮させた記述方法です。
 
この記述方法も同様に php.iniの「short_open_tag」の設定に基づいて処理されます。
 
 
ちなみに、WordPressで記事の中にプログラムの処理を呼び出すときに使うのは「ショートコード」です。ショートタグと混同しやすいのでご注意ください。
ショートコードについては「WordPress投稿にPHPを記述するショートコードの使い方add_shortcode」に記事を書いていますので、良ければご覧ください。
 
 

PHPのショートタグ「short_open_tag」を有効、無効にする設定

 
先に説明した PHPのショートタグですが、これを有効にするか、無効にするか、は php.iniに設定をするところがあります。
 
php.iniを開いていただいて、「short_open_tag」を検索します。
 

 
これが「Off」であれば、ショートタグは「無効」になっています。
「On」であれば、ショートタグは「有効」になっています。
 
On/Off を必要に応じて切り替えてください。
 
 
php.iniの設定を変更した内容を有効にするために Apacheを再起動してくださいね。
 
 


 

PHPのショートタグ「short_open_tag」を .htaccessで設定

 
PHPのショートタグ「short_open_tag」は、php.iniで設定することができます。
 
ですが、サーバによっては php.iniを変更することができない場合もあると思いますので、そのような場合は .htaccessでも設定することができます。
 
下記の設定を .htaccessに設定すれば OKです。
 

 
 

ショートタグ「short_open_tag」の問題点

 
このショートタグの問題点は、「short_open_tag off」の状態で、PHPのソースコードを「<? …… ?>」で囲んでいた場合は、PHPの処理が動かないだけではなく、PHPのソースコードが丸見えになってしまう、という点です。
 
 
ショートタグを書いたページの HTMLソースを表示してみてください。
PHPのソースコードが丸見えになっていると思います。
 
とはいえ、PHPのソースコードが見える状態になっていたとしても、それだけならまだ何とかなります。
ですが、データベースに接続するための情報や、管理画面にログインするための情報を記述した設定ファイルまでもが見えるような状態になっていたのであれば最悪です。
 
そのため、ショートタグが使える設定になっているサーバであったとしても、ショートタグ(<? …… ?>)は使わず、標準タグ(<?php …… ?>)で記述するようにしておくべきでしょう。
 
 

PHPのショートタグ・short_open_tagは Offが推奨

 
PHPのショートタグの利用は推奨されていません。
ショートタグの設定である、short_open_tagは Offが推奨されています。
 
その理由の一つとして、XMLの記述と混同する場合があるためです。
XMLの記述は、「<?xml version=”1.0″ …… ?>」の様に記述しますが、ショートタグが有効の場合は、これを PHPのタグとして処理しようとしてしまうことになります。
 
そのため、基本的に short_open_tagは Offで利用する方がいいのですが、どうしても Onの環境で XMLを使用する必要がある場合は、XMLのタグを PHPで出力する方法を検討してみるといいでしょう。
 

 
 

ショートタグ「short_open_tag」のデフォルト設定

 
short_open_tagに絡む問題は、PHPのバージョンによってデフォルトの設定が違うことも問題が発生する可能性を高めています。
 
それぞれのバージョンとデフォルトの設定について下記にまとめました。
 

バージョン デフォルト 設定場所 その他
PHP 4.0.0 On PHP_INI_ALL “<?=”と”<?” の両方に影響
PHP 5.3まで Off PHP_INI_PERDIR “<?=”と”<?” の両方に影響
PHP 5.4以降 On PHP_INI_PERDIR “<?=”は常に使用可(設定変更不可)

 
PHP 5.4がリリースされたのが 2012年3月1日ですので、最近サーバを構築しているものについてはすでに 5.4以上になっていると思いますので、あまり遭遇しなくなる不具合ではあるのでしょう。
 
ただ、このような設定によって不具合の原因にもなりますし、デフォルトで設定が変わりやすい項目でもあります。
また、先にも書きましたが、不具合が起きた場合のリスクが大きい設定でもありますので、不具合が起こらないよう、ショートタグは使わないように PHPのソースを記述する習慣を付けておく方がいいでしょう。
標準タグの方が推奨ですからね。
 
 
ちなみに、XAMPP環境では、デフォルトの設定が上記の設定とは違う場合があるようですので、上記のバージョンでなかった場合も phpinfo()などで設定を確認してみてください。
 
 

ショートタグ<?= $text ?>は PHP5.4から常に有効に

 
先に解説した「<?= $text ?>」と記述するショートコートですが、PHPのバージョンが 5.4からは常に有効になるように仕様変更がされています。

「<? ?>」は XMLの宣言とかぶりますが、「<?= $text ?>」だとかぶることがないからっていうことなのかもしれませんが、これだけ有効にして誰得なのでしょうね?
 
 

ショートタグ「short_open_tag」・ロリポップサーバは要注意

 
ロリポップサーバは、「short_open_tag」の設定について注意が必要です。
 
ロリポップサーバは、PHPのバージョンは、5.2、5.3、5.4と選択することができます。
デフォルトの設定は 5.2ですので、「short_open_tag」は「On」になっていますが、PHPのバージョンを最新にするために 5.4に上げた場合は、「short_open_tag」は「Off」になってしまうわけです。
 
そのため、開発段階では 5.2で開発し、ショートタグを利用してソースを作成していた方が、本番公開のタイミングに合わせて PHPのバージョンも変更しようとして 5.4にすると突然動かなくなった!!なんてことも発生するわけです。
 
というか、私の環境でそうやって動かなくなりましたので、この記事が産まれたワケですね。
(私はショートタグは使いませんが、流用したソースにショートタグが書いてあったわけです。念のため。)

 - PHP・Smarty・ECCUBE

GoogleAdwords

GoogleAdwords

最後までお読みいただきましてありがとうございます。
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!

Message

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

下記の空欄を埋めてください。 * Time limit is exhausted. Please reload CAPTCHA.

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

※入力いただいたコメントは管理者の承認後に掲載されます。

  関連記事

QRコード作成ライブラリ「cakePHP-QR-Code-Helper」をPHPで使うカスタマイズ
QRコード作成ライブラリ「cakePHP-QR-Code-Helper」をPHPで使うカスタマイズ

CakePHP2用のQRコード作成ライブラリ「cakePHP-QR-Code-Helper」をプレーンのPHPでも使うためのカスタマイズ方法を解説。1ファイルを設置するだけでQRコードが作れるため使い勝手がいい。

SEO対策用タイトル、ディスクリプションの文字数カウントツール

SEO対策に使える文字数カウントツールで文字数の条件の説明も行っています。

Smartyの Syntax Errorの原因はスペースかも

Smartyのなかなか原因がつかめない Syntax Errorの原因はスペースかもしれません。

リダイレクトループが原因で「ERR_TOO_MANY_REDIRECTS」「このページを表示できません」が出たときの対策12事例+α

リダイレクトループ、自動転送設定ループの原因の解説とその対応方法を含め事例 12例を挙げて説明。

路線・駅検索をPHPで実装する方法解説。GoogleMapsの緯度経度から計算し検索
路線・駅検索をPHPで実装する方法解説。GoogleMapsの緯度経度から計算し検索

路線・駅検索の仕組みの構築は大変。登録する側も最寄り駅が多い場合は大変。なので簡易に実装するため緯度経度に基づき直線距離を計算する処理を考案して実装して、その処理を解説。

PHPでスクレイピング。phpQueryとphp-simple-html-dom-parserの比較と設置方法
PHPでスクレイピング。phpQueryとphp-simple-html-dom-parserの比較と設置方法

「PHP スクレイピング」で検索すると「phpQuery」ばかりヒットするが、10年以上も放置されている。なので今も開発が続いている「PHP Simple HTML DOM Parser」をオススメする。

PHPで特定の日間の日付を for、strtotimeで表示する

ある特定の間の日付の情報を for文、strtotimeを使って作成し、その解説をしています。

QRコード(二次元バーコード)作成サービスを公開
QRコード(二次元バーコード)作成サービスを公開

QRコード(二次元バーコード)を生成するサービス。QRコードにする文字列を入力するだけで QRコードが簡単に作れる。オプションとして、画像サイズ、余白サイズ、エラー訂正レベルがある。

PHPのソースで見慣れない記号が出てきた・アロー演算子(->)、ダブルアロー演算子(=>)

PHPのプログラムソースには見慣れない記号が出てきます。その意味や調べ方です。

Smartyの修飾子regex_replaceで正規表現の後方参照・PHPではpreg_replace

ECCUBEで使われているSmartyで文字列を正規表現で置換し後方参照で値を利用する装飾子regex_replaceの解説です。細かな条件がありますので注意が必要です。