在加载PHP(命令行- PHP_CLI)时抛出错误


Browscap.ini throwing an error when loading PHP (command line - PHP_CLI)

我有一个cronjob来总结浏览器统计数据。这个cronjob加载数据,然后使用get_browser() PHP函数解析浏览器信息。

我是这样做的:

cd /etc/php5/cli/conf.d
me@ubutnu:/etc/php5/cli/conf.d$ sudo wget http://browsers.garykeith.com/stream.asp?Lite_PHP_BrowsCapINI -O browscap.ini
2011-09-30 15:14:18 (890 KB/s) - `browscap.ini' saved [185384/185384]

然后cronjob运行:

php /usr/local/cron/summarizeStats.php --option=browserStats --date=yesterday

,我得到这个错误:

PHP:  syntax error, unexpected $end, expecting ']' in /etc/php5/cli/conf.d/browscap.ini on line 51

我做错了什么?由于

这些browsecap文件现在似乎有一个错误。在浏览器规范中,它们似乎包含未转义的分号";"。您可以使用这个小脚本来修复这个问题:

<?php
$browsecap = file('browscap.ini');
foreach( $browsecap as &$row )
    if ( $row[ 0 ] == '[' )
        $row = str_replace( ';', ''';', $row );
file_put_contents( 'fixed_browscap.ini', $browsecap );

有点晚了,但是在不修改的情况下使用file仍然存在问题。我使用以下脚本下载并更改browscape .ini,以便它可以在我的服务器上工作。

#!/bin/sh
url="http://browscap.org/stream?q=PHP_BrowsCapINI"
curl -L -o browscap.ini ${url}
sed -I "" -E 's/;/'';/g' browscap.ini
sed -I "" -E 's/['';]{40}/;;;/g' browscap.ini
sed -I "" -E "s/''/''''/g" browscap.ini
mv browscap.ini /usr/local/etc/php/browscap.ini

解释
  • 第一个sed用''
  • 转义每个;
  • 第二sed是返回评论到以前的状态(慢),替换只是4或5个分号会导致错误,因为有一些部分的字符串像这样的(;;;;)。这可以在搜索部分中使用^';这样的东西进行优化,并且在替换部分中只使用单个;,需要在我放入
  • 之前进行测试
  • 第三sed是转义单引号使用在"让我们加密…"部分和在其他几个地方像这个'*'

不要忘记调整你的browscape .ini的最终目的地。此外,更新后不需要重新启动Apache或PHP,因此将此脚本放在某个地方并设置cron job。

sed可用于转义分号,如下所示:

sed 's/;/''';/g' browscap.ini > browscap_escape.ini

这也将捕获所有注释,但您可以再次使用sed来捕获这些注释。

如下所述github.com/browscap/browscap/issues/119