PHPのshort_open_tagが!
今日はテスト用に空いてるPCを使ってFedora13でサーバーを組んだんですが、予想外のところで引っかかってしまいました。
このサーバーは今までEUC-JPで動かしてたMySQLとPHPを全てUTF-8で動作させるためのテスト用です。
UTF-8での動作テストは1年ほど前に一度テスト用のサーバーで実施済みなんですが、近いうちに現在EUC-JPで稼働しているお客様のサーバーをUTF-8に変更することになりそうなので、もう一度確認しておこうってことで。。
お客様のサーバーはFedora10なんですが、どうせならついでにOSも最新版でテストしてOSごと入れ替えちゃった方が良いだろうってことで最新版のFedora16をインストールしようとしたら、、
メモリーが足りない!って怒られちゃいました。
…テスト用のPCが古すぎた。。w
他に空いてるPCも無いし追加するメモリも無いので、とりあえずこのPCでも入れられるFedora13をインストール。
続いてMySQL、Apache、PHPをインストールしてそれぞれUTF-8で動作するように設定しました。
接続テストも問題なく終わったんで、現在お客様のところで使ってるEUC-JPで書かれたPHPスクリプトをUTF-8に変換してUP。
このPHPスクリプトはMySQLのデータベースから商品を検索・表示する単純なプログラム(ただしデータ表示部分は条件分岐が入り組んでてけっこう複雑)なんですが、ブラウザで検索かけると出力結果ページがエラーになっちゃいます。
エラーログを見ると「syntax error, unexpected ‘}’」と出ています。
これは「{」に対して「}」が余計にあるってことなんですが、現状でチャンと動いてるプログラムですからそんなはずはありません。
で、PHPプログラムをじ~っくり眺めていたら、、
「<?php { 」で始まるスクリプト部分に1ヶ所だけ「<? { 」のところがありました。
おっ!これか!?
早速「<? { 」を「<?php { 」に変えてみると、案の定ちゃんとページが表示されました、、が。。
今度は肝心な検索結果のデータ部分が空白になってます。
ここで気が付けば良かったんですが、UTF-8の文字コードの設定が原因だと思い込んでしまい、php.iniやmy.cnf、httpd.confの設定を繰り返すはめに。。
3時間以上もいろいろいじくり回した挙句どうにも直らず、もう一度PHPのスクリプトをじっくり見ていたら、、
データ表示部が「<?=$row[‘abc’] ?>」になってることにやっと気が付きました。
これって最初のエラーと同じじゃん!
でもこれはエラーログには出てこなかったんで、なかなか気が付きませんでした。
当然、これを「<?php echo $row[‘abc’]; ?>」のように正式な表記に書き換えたらバッチリ表示されました。
それにしても今までは問題なかったのに何で・・・?
実はphp.iniの「short_open_tag」が以前はデフォでOnだったのがOffになってたんです。
だから「<?」や「<?=」のような略式の表記では正常に動作しなかったんですね。
勝手にデフォ設定変えてんじゃねぇよ!
…って、最初から正式な表記で書けよ!って話ですよね。。w
いや~まいりました。
※どうやらshort_open_tagがデフォでOffになってたのは、最近増えてるXMLが原因だったようです。
short_open_tagがOnになってると、PHPスクリプト内で「<?xml・・・」とXML宣言したときにそれをPHPのコードと間違えて解釈しちゃうからってことらしい。
ちなみにshort_open_tagが有効だったFedora10のPHPのバージョンは「php-5.2.9-2」。
OffになっていたFedora13の方は「php-5.3.6-1」でした。
…メジャーアップデートでもないのにこの違い!PHP恐るべし!!w