如何使用system()从CGI文件中调用异步Perl脚本

问题描述 投票:2回答:3

通过说我已经阅读了关于SO以及网络搜索的许多不同文章来开始我的问题,但找不到适合我实际情况的任何内容。

实际上,问题很简单。我有一个CGI脚本(Perl)在Web服务器上提供动态页面,并且当用户加载某个页面时,我想让CGI脚本使用system()调用.pl文件来进行一些“整理”。它正在Windows NT环境中运行。

用于测试目的的CGI脚本是test1.pltest1.cgi,例如“ https://www.awebsite.com/test1.pl”。

test1.pl(生成网页的CGI脚本)

#!/usr/bin/perl

print "Content-type: text/html\n\n";

print "Hello user, this is a test page.";

system("start C:/path/to/script/test2.pl");

print "Page is fully loaded and housekeeping is being done, even though this page is now fully loaded";

test2.pl(正在执行“内务处理”的独立.pl文件,与test1.pl正在执行的操作异步)]

#!/usr/bin/perl

#just a counter that takes a while to complete, to verify test2.pl is running
for ($x=0; $x <= 100000; $x++){print "$x ";}

确定,请记住,这是为了测试操作,而不是功能。从命令行运行test1.pl时,它可以正常工作。

[从浏览器运行test1.pl时,这会一直在服务器上提示“ openWith.exe”(在任务管理器中查看)。我的.pl文件是可执行文件,因此这与文件类型未知或不知道如何与Perl命令行解释器一起运行无关。我无法弄清楚这里发生了什么,以及当通过Web界面调用时为什么它无法运行来自test1.pl的系统命令。

没有从用户输入传递任何参数。 test1.pl只需运行test2.pl来做一些内务处理,但是我无法让test1.pl等待test2.pl完成后再继续。因此,test2.pl应该由test1.pl启动并继续运行-同时,test1.pl已经完成其工作。我确实[[not需要或想要捕获test2.pl的任何输出。

我希望我已经清楚地解释了这一点。即使实际代码会复杂得多,我也使用了简单的示例。在这一点上,它甚至没有运行这些简单的示例脚本,因此,此时的实际功能代码并不重要。

感谢任何可以帮助我的人。顺便说一句,我尝试为test1.pl设置“完全控制”权限,但这无济于事。同样,此“ openwith.exe”确实让我在这里循环。

perl asynchronous cgi system external
3个回答
1
投票
start C:/path/to/script/test2.pl依赖于在.pl文件和perl可执行文件之间建立关联。您可能已经在用户上进行了设置,但Web服务器可能没有。

您可以进行设置。或者您不能使用start,而是直接将程序传递给perl。具体执行方式取决于Perl的安装方式和Web服务器的设置。您也许可以只使用perl.exe

system('perl.exe C:/path/to/script/test2.pl');

或者您可能必须通过完整路径。

system('C:/path/to/perl.exe C:/path/to/script/test2.pl');

请参见the documentation for start以获取更多详细信息。


请注意,从Perl程序运行Perl程序并不理想。一旦开始传递数据并检查错误,就会有很多难以调试的东西会出错。

而不是考虑将该代码用作子例程,并使用startfork在后台运行它。或者更好的方法是,将threadsDancer之类的Web框架用于link it之类的作业队列。


0
投票
最后弄清楚了(像往常一样,我自己决定)。事实证明,施文(Schwern),您处在正确的轨道上。即使.pl文件关联是通过控制面板建立的,可以使用Perl命令行解释器打开,但Windows文件类型关联还是存在问题(我什至不完全了解)。我终于在这里找到了TRUE问题的答案:Minion

特别是这里的这一部分:

您必须在.pl文件扩展名和Perl运行时之间创建文件关联。在命令提示符下,键入以下内容。

Perl not running in Windows 10
我希望这可以帮助可能遇到相同问题的人。

-1
投票
您可以保留环境(cgi / web)的语义,并将script2设置为自己的CGI脚本,然后在script1中向其触发异步http请求。您可以使用assoc .pl=PerlScript ftype PerlScript=c:\perl\bin\perl.exe %1 %* 。但是您必须小心,不能从外部调用script2,例如通过检查客户端IP。

而且,由于这是一个cgi,script1可能可以并行运行多次,因此script2也是如此,但是最终您将其调用。因此,您必须确保在发生这种情况时不要弄乱事情。

© www.soinside.com 2019 - 2024. All rights reserved.