FLINTERS Engineer's Blog

FLINTERSのエンジニアによる技術ブログ

PHP小ネタ

こんばんは。新人konoです。

本当はDBの全文検索比較を載せようと思っていたのですが、準備が間に合わなかったのでPHPの小ネタでも。

レコードが700万件近くあるので抽出〜INSERT〜インデックス作成にかなり時間がかかってしまいまして。


なので、全文検索ネタは次回に回すことにします。

OSSの2大DBであるMySQLとPostgres、2大商用DBのOracleDB2のそれぞれを比較しようと思っています。

で、PHPの小ネタでお茶を濁すことにしたのですが、とりあえず最近やられたネタになります。

PHPの閉じタグは使わないか、ちゃんと閉じましょう!

 (出来れば使わないようにしましょう)

閉じタグとは ?> のことですが、閉じタグの後に文字列を挿入したり、改行やら入れているとエラーの原因になるのでやめましょう。

実際に私がハマったのは、どこかで読み込まれていたphpファイルの 「?>」 の後に「半角スペース」と「改行」が入っていたために
header() 関数使ったタイミングでエラーで落ちるという現象でした。

スタックトレースの内容見ると「Cannot modify header information」と出力されていたのですが、header() 関数を使っている箇所を見ても特に問題なさそうだしと、しばらく悩みました。

閉じタグの後に文字列があると、PHPはHTMLヘッダに出力するらしく、その後にheader() 関数でHTMLヘッダを出力しようとしてエラーになっていたようです。

プチハマりました。

とりあえず、プロジェクトのソースを全部検索して駆逐しておきましたよ。

PHPのコードのみ記述しているソースでは閉じタグは不要なので、出来れば使わない方が無難です。

HTMLやJavaScriptPHPのコードが混在している場合は閉じタグが必要なので、その際は?>EOFとする必要があります。


・strptime()、strftime()関数はWindowsに存在しないので注意

本番サーバはLinux、ローカルでの開発はWindowsという人がかなり多いと思いますが、ローカルでの検証でWAMP使う人というのも割と多いかと思います。

そういう時に注意したいのが、Windowsには存在しない関数です。

その一つがstrptime()関数で、あるコードの中でこの関数を使用していたため、Linuxの検証サーバでは動くけど、Windows上ではエラーになるという現象に悩まされました。

他にも、あまり使わないと思いますが、sys_getloadavg()関数やdio_tcsetattr()関数などもWindowsにはない関数なので注意が必要です。

こういった関数は使わないに越したことがないのですが、気付かず使っちゃったりしますよね。