【问题标题】:How can I call curl from a Perl CGI script?如何从 Perl CGI 脚本调用 curl?
【发布时间】:2014-01-09 14:54:27
【问题描述】:

我有一个 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;

该程序在命令行中完美运行,但是当我尝试在浏览器中运行它时,页面最终超时。

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

【问题讨论】:

  • 可能想在服务器故障上问这个
  • 错误日志中有什么内容?很有可能您的网络服务器的 $PATH 中缺少某些内容。
  • 这在纯 Perl 中很容易做到。您是否有理由要使用 curl 而不是 LWP::UserAgent 等?
  • @brian:因为 curl 更好!

标签: perl curl cgi


【解决方案1】:

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

【讨论】:

  • 思南,谢谢。我试过了,程序挂在 open 命令上(我尝试前后退出以发现挂起程序的原因)。错误日志文件包含以下内容,我仍在尝试搜索/找出:[Mon Nov 30 14:59:07 2009] [error] slurp_filename('/var/www/vhosts/mydomain.net/httpdocs/youtube/ youtube.pl') / opening: (2) /usr/lib64/perl5/vendor_perl/5.8.6/x86_64-linux-thread-multi/ModPerl/RegistryCooker.pm 第540行没有这样的文件或目录
  • @Miriam Raphael Roberts:错误消息与您帖子中的代码无关。具体发布发出opening 消息的代码部分。 (2) 向我建议您在标量上下文中评估某个数组,但是如果没有看到实际代码,就不可能说出任何确定的内容。同时显示slurp_filename 函数(为什么不使用File::Slurp?)
【解决方案2】:

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

我还从this article那里学到了很多关于在 CGI 下运行需要大量时间的进程的知识

【讨论】:

    【解决方案3】:

    查看错误日志并看到错误后

    [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 作为文件而不是字符串传递给 curl 的事实有关。以下是与作为字符串传递的 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;
    

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

    【讨论】:

      猜你喜欢
      • 2012-03-10
      • 1970-01-01
      • 1970-01-01
      • 2020-02-04
      • 2010-11-29
      • 2023-03-10
      • 1970-01-01
      • 2023-03-17
      相关资源
      最近更新 更多