2009-11-09 69 views
1

我想提交一个表格到一个CGI脚本localy(w3c-markup-validator),但它使用curlapache太慢,我想在另一个脚本中使用这个CGI脚本超过5000次。 ,目前需要一个多小时。如何在不使用curl和apache2的情况下在本地使用Perl CGI?

我该如何直接将表格提供给CGI脚本(我用curl上传文件)?

编辑:这似乎是太复杂,我需要的时间,所以我等了1个半小时,每次我需要测试我生成的xhtml文件。 在明确的我没有测试任何下面的答案,所以问题将保持开放。

+0

使用cUrl你可以指定任何地址来上传文件?或者我错过了什么? – 2009-11-09 15:56:16

+1

您在您的控制下调用的CGI脚本,还是您实际上在网站上发起DOS攻击? – 2009-11-09 16:12:26

+0

它在我的控制之下,因为它在我的/ usr/lib/cgi-bin中,它是w3c-markup-validator,我想精确验证一批xhtml文件6537。 – 2009-11-09 16:27:39

回答

3

根据脚本的细节,您可以使用HTTP::Request::AsCGI创建假CGI环境,然后使用“do”操作符获取CGI脚本。但是在速度和可维护性方面,最好的办法是将脚本工作的重要部分分解到自己的模块中,并将CGI重写为该模块的客户端。这样,你不要作为一个CGI调用它 - 你正在谈论的批处理作业现在将只是另一个程序使用相同的模块来做同样的工作,但没有CGI或Web服务器环境进入方式。

+0

感谢您的帮助!我会尝试HTTP:Request :: AsCGI;这不是我的脚本它是W3C标记验证检查Perl脚本;我没有找到任何模块来这样做。因为我不是perl的导师,所以我不认为我会重构W3C的工作。 – 2009-11-09 16:33:57

1

CGI是一个非常简单的API。它所做的只是从环境变量(用于GET请求)或从stdin(用于POST请求)读取数据。所以你所需要做的就是设置环境并调用脚本。请参阅docs for details

+1

这并不像你认为的那么简单。在文件上传的情况下,您还需要设置mime编码。它不会直接从STDIN中读取文件。 – 2009-11-09 16:08:59

+0

感谢您的建议,如果我没有试过所有的答案,我可能会使用整齐。 – 2009-11-09 16:37:03

+0

+1你说得对;您必须对文件进行属性编码。但是这并不难:mime头几乎是静态的,长度来自环境变量,所以剩下的只是数据的编码。 – 2009-11-09 16:37:58

2

好的,我看了这个东西的源代码,并不容易从所有其他的东西中提取验证的东西。所以,这是我的意愿。

首先,沟渠curl。为每个要验证的文件启动一个新进程并不是一个好主意。您将需要编写一个驱动程序脚本,其中包含一个URL列表,并将它们提交到运行于localhost上的本地服务器。事实上,以后你可能想要对其进行并行化处理,因为无论如何,通常会有大量的活动进程存活。那么,我超越自己。

此脚本可以使用LWP,因为您所做的只是将一些数据提交给localhost上的CGI脚本并存储/处理结果。您不需要完整的WWW::Mechanize功能。

至于validator CGI脚本,您应该将其配置为mod_perl registry script。确保你预先加载了所有必要的库。

这应该会将每秒钟处理的文档从1.3增加到更可口的东西。

+0

我正在使用curl那样:curl -F output = soap12 -F“uploaded_file = @/path; type = text/html“http:// localhost/w3c-markup-validator/check;你说得对,这不是一个好主意。驱动程序脚本如何工作?我会给所有的文件卷起LWP? Thansk! – 2009-11-09 17:07:21

+0

您使用LWP将该文件和任何其他选项提交给CGI脚本。没有必要'卷曲'。当然,你也可以使用'libcurl'。请参阅http://search.cpan.org/perldoc/WWW:Curl – 2009-11-09 17:33:37

0

如果脚本使用CGI.pm,则可以通过在命令行中通过提供'-debug'开关(在CGI.pm中,在use语句中)运行它。然后,您可以发送post变量在stdin上。您可能需要稍微调整脚本才能完成此项工作。

+0

w3c-markup-validator perl脚本,不使用cgi.pm – 2009-11-16 16:38:40

相关问题