通过php调用awstats cgi查询统计结果

By zhujinliang. Filed in 软折腾  |   
标签:, , ,
Home  

网上多见awstats与apache配合使用,因为apache能直接调用cgi程序。而且nginx只能在一边看每天生成的静态页面,如果想在nginx上执行cgi,需要用一个perl的脚本,如此文所述,实现cgi宿主功能,将cgi请求变为fcgi请求。

研究了一下,发现我们可以通过php执行shell命令的能力来调用cgi程序,如此一来,我们不仅可以方便地调用awstats,而且同时可实现一些权限检查等功能。

不过具体实现起来还遇到了不小的问题,这篇博文最初想的题目是“php对cgi想说爱你不容易”,具体怎么回事,大家耐心往后看吧。

cgi原理原来很简单,就是一个可执行的文件或脚本,使用环境变量传递HTTP请求参数,使用stdin传递post内容(如果有的话),使用stdout输出。输出内容类似HTTP请求的响应,先是HTTP响应头,空一个空行,再是响应实体。

知道了这些,我们就可以用php来调用cgi脚本了。通过putenv()函数写入环境变量,写入的环境变量只作用于此次php调用,然后通过proc_open执行命令,然后操作stdin、stdout、stderr三个管道进行输入输出,最后处理输出的数据,关闭进程,即可完成。

Github上有一个PHP-CGI-Wrapper,以及这篇文章:Wrapping Perl with PHP,可供参考。

由此一来,我们可以节约掉一个常驻进程,不过存在一个明显的问题:perl脚本需使用与php相同的用户。

本来我没意识到这个问题的严重性,但偏偏是awstats,他的配置文件都默认存放在/etc/awstats/目录下,php的www用户居然无法访问该目录。

以我的linux操作水平,研究了半天,没法让www用户访问/etc/下的文件,索性将配置文件搬到/home/awstats下面,然后尝试修改awstats的默认配置。

在awstats那奇葩的代码中搜索关键词,找到修改方法:

编辑 /usr/local/awstats/wwwroot/cgi-bin/awstats.pl,在sub Read_Config中,约1701行,修改PossibleConfigDir中列出的目录,awstats将在列出的目录中搜索配置文件。

如果使用辅助工具,工具中可能有指定的目录,例如awstats_updateall.pl中,$DIRCONFIG指定批量更新时搜索的目录。

至此,道路基本铺通,然后我制作了一个简单的查询界面,为每个站点设置了一个密码,这样放在我的主机上的其他网站可以通过自己的密码查看统计报表。

代码很简单,而且比较丑陋,就不拿出来了。

其他的问题:自己“深度定制”awstats时,难免遇到超链接路径的问题,awstats输出的路径往往不是我们想要的。一个笨法是通过php做文本替换,不过研究了下awstats代码,可以简单修改下来改变超链接指向的路径:

awstats超链接地址生成依靠$AWScript和$NewLinkParams,后者是使用之前通过一系列正则整理出来的,源于$QueryString,$QueryString即传入的QueryString,较难修改。

$AWScript在17364行左右被赋值:
$AWScript = ( $WrapperScript ? "$WrapperScript" : "$DirCgi$PROG.$Extension" );

awstats通过Querystring传入的参数有config,month,year,output,framename等,如果开启按天统计,还可以有一个day参数。

config 参数指示awstats输出哪个配置的报表,我们可以在php中读取此参数做权限检查。
month,year及day 参数即要查看年月日。
output 参数指示报表页面,默认的摘要页是main,其他详细页面的名称可以在awstats生成的静态文件的文件名中找出来。
framename 参数指示生成页面是框架的哪部分,报表主体,也是静态页生成的那部分,是mainright,其他部分我们可以通过php产生,不必绕道cgi。

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*