harumaki.net

インフラ屋の覚書や、ラーメン食べある記とか。

dev GNU/Linux php トラブルシュート

[PHP] browscap.iniで出たsyntax errorの問題をなんとなく修正

投稿日:2013年8月16日

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もメンテナンスモードに入っているし、いい加減アップデートしておかなくちゃ…(独り言)

-dev, GNU/Linux, php, トラブルシュート
-

執筆者:


comment

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

CAPTCHA


関連記事

no image

クラスタリング/heartbeat

[pukiwiki] #topicpath #contents *クラスタリング/heartbeat [#t91d7900] 2台のホスト間でのクラスタリングを構成する。以下のような機能を提供する。 …

no image

[メモ]cdコマンドで、ひとつ前のディレクトリに戻る場合[bash]

シェルでの作業中に、ふたつのディレクトリを行ったり来たり、ということが多いとき cdとかのオプションで指定できないかな?とmanを探っていたら、ふつーにあった(汗 $ cd – (オプション&quot …

TsungでWebサイトの負荷テストを試す

  Tsung(読み方が不明なんだけど、サン、あるいはサング、かな??)を試したログ。 haproxyとバックエンドサーバーへの負荷テストにあたって、目安のため1000リクエスト/秒くらいから負荷テス …

nagios​/plugin​/SNMP​/インストール(コンパイル版)

  [pukiwiki] **nagiosプラグインの環境セットアップ(コンパイル版) [#oac4bee6] リモートホストへsnmpで値を取得する”check_snmp_*&#8221 …

no image

[Linux]statコマンド

ファイル、および当該ファイルのファイルシステムのステータスを表示する。 実際には、指定したファイルのinode情報を表示するコマンドの様子。 -参考にしたサイト お世話になっております! Linux …