我正在尝试使用Perl从RRD工具输出图像。我在下面发布了CGI脚本的相关部分:
sub graph
{
my $rrd_path = $co->param('rrd_path');
my $RRD_DIR = "../data/";
#generate a PNG from the RRD
my $png_filename = "-"; # a '-' as the filename send the PNG to stdout
my $rrd = "$RRD_DIR/$rrd_path";
my $png = `rrdtool graph $png_filename -a PNG -r -l 0 --base 1024 --start -151200 -- vertical-label 'bits per second' --width 500 --height 200 DEF:bytesInPerSec=$rrd:bytesInPerSec:AVERAGE DEF:bytesOutPerSec=$rrd:bytesOutPerSec:AVERAGE CDEF:sbytesInPerSec=bytesInPerSec,8,* CDEF:sbytesOutPerSec=bytesOutPerSec,8,* AREA:sbytesInPerSec#00cf00:AvgIn LINE1:sbytesOutPerSec#002a97:AvgOut VRULE:1246428000#ff0000:`;
#print the image header
use bytes;
print $co->header(-type=>"image/png",-Content_length=>length($png));
binmode STDOUT;
print $png;
}#end graph
这在命令行上运行正常(perl graph.cgi> test.png) - 当然,以及在我的Ubuntu 10.04开发机器上注释掉标题。但是,当我移动到Centos 5生产服务器时,它没有,并且浏览器接收的内容长度为0:
Ubuntu 10.04 / Apache:
Request URL:http://noc-student.nmsu.edu/grasshopper/web/graph.cgi
Request Method:GET
Status Code:200 OK
Request Headers
Accept:application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Cache-Control:max-age=0
User-Agent:Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.517.36 Safari/534.7
Response Headers
Connection:Keep-Alive
Content-Type:image/png
Content-length:12319
Date:Fri, 08 Oct 2010 21:40:05 GMT
Keep-Alive:timeout=15, max=97
Server:Apache/2.2.14 (Ubuntu)
来自Centos 5 / Apache Server:
Request URL:http://grasshopper-new.nmsu.edu/grasshopper/branches/michael_dev/web/graph.cgi
Request Method:GET
Status Code:200 OK
Request Headers
Accept:application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Cache-Control:max-age=0
User-Agent:Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.517.36 Safari/534.7
Response Headers
Connection:close
Content-Type:image/png
Content-length:0
Date:Fri, 08 Oct 2010 21:40:32 GMT
Server:Apache/2.2.3 (CentOS)
内容长度的use bytes
和手动设置在那里试图解决问题,但没有它们就是一样的。与STDOUT上的binmode
设置相同。该脚本可以在两台机器上的命令行中正常工作。
答案 0 :(得分:4)
查看我的How can I troubleshoot my Perl CGI program。通常,在命令行上运行程序与从Web服务器运行程序之间的区别在于不同的环境。在这种情况下,我希望rddtool不在路径中,或者webserver用户无法运行它。
反引号仅捕获标准输出。 Web服务器错误日志中可能存在一些标准错误输出。
答案 1 :(得分:1)
您确定您的网络用户可以访问您的数据吗?尝试让CGI将png写入文件系统,这样你就可以确保它正确生成了。如果是,问题出在传输(标题,编码等)上。如果没有,它与Web服务器无关,可能与权限有关。