サーバ移転、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であることを宣言するために
1 2 3 |
<?php echo "s-giken"; ?> |
の様に「<?php …… ?>」で PHPのソースコードを囲みます。
これが PHPの基本形です。
ですが「<?php」を短縮して、下記の様に「<? …… ?>」で PHPのソースコードを囲むだけで PHPと認識させようとするものをショートタグと言います。
1 2 3 |
<? echo "s-giken"; ?> |
ずいぶん短くなりましたね(笑)。
<?= $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」を検索します。
1 |
short_open_tag = Off |
これが「Off」であれば、ショートタグは「無効」になっています。
「On」であれば、ショートタグは「有効」になっています。
On/Off を必要に応じて切り替えてください。
php.iniの設定を変更した内容を有効にするために Apacheを再起動してくださいね。
PHPのショートタグ「short_open_tag」を .htaccessで設定
PHPのショートタグ「short_open_tag」は、php.iniで設定することができます。
ですが、サーバによっては php.iniを変更することができない場合もあると思いますので、そのような場合は .htaccessでも設定することができます。
下記の設定を .htaccessに設定すれば OKです。
1 |
php_flag short_open_tag Off |
ショートタグ「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で出力する方法を検討してみるといいでしょう。
1 |
echo '<?xml version="1.0" encoding="Shift_JIS"?>' . "\n"; |
ショートタグ「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にすると突然動かなくなった!!なんてことも発生するわけです。
というか、私の環境でそうやって動かなくなりましたので、この記事が産まれたワケですね。
(私はショートタグは使いませんが、流用したソースにショートタグが書いてあったわけです。念のため。)
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
配列の値をテキスト表示する際に「、」でつなげるときの処理方法の一例
配列の値を「、」でつないで出力する際、単純にforeachで繰り返し処理をすると「イヌ、サル、キジ、」となるが文字列最後の「、」を出力しない方法を3つ解説している。
-
指定した数で文字列を丸める(n文字目で…にする)関数substr、mb_substr、mb_strimwidthの違い
文字列を指定された数で抜き出すPHPの関数、substr、mb_substr、mb_strimwidthについての解説。似た関数だが引数の指定方法が違ったり、文字数がバイト数か文字数かも違ったり、注意が必要だ。
-
sleepの秒指定は整数のみなので1.5秒はsleep、usleepを組み合わせる
PHPのプログラム処理を遅延させる「sleep()」は整数秒単位。「usleep()」は1秒未満のマイクロ秒単位。では「1.5」秒はどう表現するのか。「sleep()」「usleep()」を組み合わせる。その解説。
-
CentOS6、7のPHPを5.3から5.6、7.0、7.1にバージョンアップする手順の解説
CentOS6系、7系のPHPバージョンを5.3から5.6、7.0、7.1にアップする作業手順と解説。yum updateコマンドを使い作業時間は約10分。コマンドの解説や引数の意味なども解説しているので役に立つはず。
-
PHPで1ヵ月前、先月、今月1日、来月末の日付などの算出はDateTimeImmutableを使う
PHPには日時をオブジェクトとして生成する関数「DateTimeImmutable」「DateTime」が用意されている。これを利用して1ヶ月後、月初日、月末日、5日後などを指定して日付を取得できる。
-
ECCUBE mtb_constants initパラメータ設定の項目を追加する方法
ECCUBEのパラメータ設定で設定できる項目を追加する方法を説明します。
-
cURLを利用する際の注意点「
&
」があるURLは「”
」で囲むcURLでURLはダブルクォーテーションで囲む。LinuxでもWindowsでもコマンドでは「&」は意味を持つ文字のためエラー原因になる。クォーテーションは常につけておく方が無難。
-
JSON形式の値を配列形式に変換・PHPでは json_decode()、json_encode()
JSONとは「JavaScript Object Notation」の略でテキストベースのデータフォーマット。JSONの値をPHPで配列に変換するWebツールの紹介とその処理「json_encode()」「json_decode()」関数の解説。
-
WindowsのXAMPPのPHPではstrptimeは使用不可。代替はdate_parse_from_formatを使う
strptimeはWindowsのPHPには未実装。LinuxとMacで挙動が異なる。PHP8.1で非推奨になる。なので日付のチェックはdate_parse_from_formatを使おう。使い方を詳細解説。
-
PHPでスクレイピング。phpQueryとphp-simple-html-dom-parserの比較と設置方法
「PHP スクレイピング」で検索すると「phpQuery」ばかりヒットするが、10年以上も放置されている。なので今も開発が続いている「PHP Simple HTML DOM Parser」をオススメする。