如何从Perl CGI脚本调用curl?

时间:2009-11-30 17:43:20

标签: perl curl cgi

我有一个CGI(perl)脚本试图使用open命令调用curl:

@curl = ('/usr/bin/curl', '-S','-v','--location', $url, 
                          '-H', 'Content-Type:'.$content_type,
                          '-H', "Authorization: $authorization",
                          '-H', "X-Gdata-Key:$gdata_key",
                          '-H', "Content-Length:$content_length",
                          '-H','GData-Version:2',
                          '--data',"\@$filename");

然后执行如下:

open CURL, "-|", @curl;

该程序在命令行中运行良好,但当我尝试在浏览器中运行时,页面最终会超时。

我需要在服务器或脚本中更改哪些内容才能使其正常工作?

3 个答案:

答案 0 :(得分:1)

您应该检查open是否成功并且还明确尝试close管道,检查错误。如果出现错误,die会显示错误消息。然后在服务器错误日志中找到错误消息。

答案 1 :(得分:1)

除了Sinan的建议之外,你所获得的超时可能指向一个长时间运行的过程 - 在CGI下运行时总是一个问题。请查看其他解决方案,如队列管理器。我在这些情况下使用Beanstalk。但我听说过有关GearmanThe Schwartz

的好消息

我还学到了很多关于在this article

的CGI下运行花费大量时间的流程

答案 2 :(得分:1)

查看错误日志并查看错误

[Mon Nov 30 14:59:07 2009] [error] slurp_filename(
'/var/www/vhosts/mydomain.net/httpdocs /youtube/youtube.pl') / opening: (2)
No such file or directory at /usr/lib64/perl5/vendor_perl/5.8.6/
x86_64-linux-thread-multi/ModPerl/RegistryCooker.pm line 540 

我认为这与我将XML作为文件而不是字符串传递的事实有关。这是一个新命令,它与作为字符串传递的xml一起使用:

@curl = ('/usr/bin/curl', '-S','-v','--location', $url, '-H',
'Content-Type:'.$content_type,'-H',"Authorization: $authorization",'-H',
"X-Gdata-Key:$gdata_key",'-H',"Content-Length:$content_length",'-H',
'GData-Version:2','--data',"$xml");

我仍在使用以下命令打开/调用curl:

open CURL, "-|", @curl;

它现在在浏览器中成功运行,并返回我请求它的值。