Last Updated on 2022年6月24日 by かんりにん
社内にある開発環境のphp5.3環境にてパーサーのエラーが毎回出力されるので、ざっと調べて修正。
具体的には、
”PHP: syntax error, unexpected $end, expecting ‘]’ in ~”というエラーが出る。
ちなみにPHPのバージョンは古いです(5.3.3…もうメンテナンスモードw)
参考リンク:お世話になっております。
parse_ini_file
http://php.net/manual/ja/function.parse-ini-file.php
parse_ini_file 関数の INI_SCANNER_RAW モードでは DSN が適切にパースされない問題
http://blog.sarabande.jp/post/10652583954
phpbrowscap
https://code.google.com/p/phpbrowscap/issues/detail?id=11
原因1)parse_ini_fileの変更の影響を受けている?
# php -v PHP: syntax error, unexpected $end, expecting ']' in /etc/php.d/browscap.ini on line 57 PHP 5.3.3 (cli) (built: Jul 29 2010 17:04:59) Copyright (c) 1997-2010 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies #
これは、php5.3以降でparse_ini_fileの挙動が変わったことが原因の様子。
UserAgentの判定条件にて、”[~]”で囲まれた部分のなかにセミコロン”;”が含まれると書式エラー(syntax error)となってしまう。
syntax errorと判定される個所の例。
[Mozilla/4.0 (compatible; smartBot/1.*; checking links; *)]
原因は、“PDO の DSN で区切り文字として使われているセミコロンがコメントとして解釈されてしまう”らしい。
(http://blog.sarabande.jp/post/10652583954 から引用)
なので、セミコロンの前にバックスラッシュを入れてあげると修正されるとのこと。
修正内容
[Mozilla/4.0 (compatible\; smartBot/1.*\; checking links\; *)]
ただし、browscap.ini内の該当箇所はすごく多いのでスクリプトを使って解決したいところ。
bash+sedで片付けようとしていたところ、たまたま以下のサイトにてスクリプトを発見。
http://stackoverflow.com/questions/7615290/browscap-ini-throwing-an-error-when-loading-php-command-line-php-cli
にて、セミコロン部分の手前にバックスラッシュを追加するスクリプトが提供されていたので、このスクリプトを使ってiniファイルを修正。助かりました。
スクリプト引用です。
<!--?php<br /--> $browsecap = file('browscap.ini'); foreach( $browsecap as &$row ) if ( $row[ 0 ] == '[' ) $row = str_replace( ';', '\\;', $row ); file_put_contents( 'fixed_browscap.ini', $browsecap );
上記のスクリプトにて、セミコロン問題は解決。ふう、やれやれ。
原因2)browscap.iniのファイルフォーマットの問題
上記のセミコロン問題を片づけて、スクリプトを実行後、エラーチェックを兼ねてphp -v を再度実行したところ、こんどは別のsyntax errorが発生。
# php -v PHP: syntax error, unexpected $end, expecting ']' in /etc/php.d/browscap.ini on line 4016 PHP 5.3.3 (cli) (built: Jul 29 2010 17:04:59) Copyright (c) 1997-2010 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
ということで、エラーにあった4016行目をチェックしてみると…
4013 [Ace Explorer] 4014 Parent=Miscellaneous Browsers 4015 Browser="Ace Explorer" 4016 ←該当行 4017 [Enigma Browser*] 4018 Parent=Miscellaneous Browsers 4019 Browser="Enigma Browser" 4020 4021 [Godzilla/* (Basic*\; *\; Commodore C=64\; *\; rv:1.*)*] 4022 Parent=Miscellaneous Browsers
該当の4016行目は空となっており、別の文字コードでも改行コードも含まれていないっぽく、色々調べてみたものの、記述内容に異常はなさそうかと思いつつfileコマンドで調べてみたところ、原因と思われる結果が。
# file /etc/php.d/browscap.ini /etc/php.d/browscap.ini: Windows INF file
え?”Windows INF file”って…orz
ということで、Windowsの設定ファイルとして認識されていた様子。案外こういう単純な原因って多いかも。
ちなみに/etc/php.d以下にある他のiniファイルは…
# file /etc/php.d/curl.ini /etc/php.d/curl.ini: ASCII text
# file /etc/php.d/pdo.ini /etc/php.d/pdo.ini: ASCII text
となっており、通常のテキストファイルとして認識されている様子。
browscap.iniのサイト( http://tempdownloads.browserscap.com/ )を見てみたところ、browscap.iniはwindows用とphp用にそれぞれ用意されており、どうやらダウンロードした人がwindows用を指定していた様子。
Windows向けのものは“Do not use with PHP!”、PHP用のものは“Use only with PHP!”となっており、ダウンロード時に確認が可能。
ということで、要はiniファイルをWindows iniファイルでなくtextとして読めればOKなんだけど、ひとまずphp用のphp_browscap.iniをダウンロードし再度セミコロンを修正、ファイル名を
php_browscap.ini→browscap.iniへ修正して、とりあえずエラー修正完了。
ただし、ファイルの認識結果が…
# file php_browscap.ini php_browscap.ini: Lisp/Scheme program text
PHP用として落としてきたphp_browscap.iniもASCII textでなく、“Lisp/Scheme program text”と認識されてしまうのが微妙。
touch php_browscap.iniした後で直接書き出しても同様になってしまう。
ひとまずphp -vでsyntax errorが回避されたことを確認したので、いったん対応はclose。
最後はsyntax errorも解消。
# php -v PHP 5.3.3 (cli) (built: Jul 29 2010 17:04:59) Copyright (c) 1997-2010 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
やっぱりちゃんとしたファイル形式で読ませないと気持ち悪いので、対処方法は手が空いたらそのうちに調べてみることに。たぶんすぐ治せるんじゃないかと思いつつ。
それにしてもPHPのバージョン、社内用とはいえビルドから3年…5.3もメンテナンスモードに入っているし、いい加減アップデートしておかなくちゃ…(独り言)