【问题标题】:perl script sometime fails to create socket connection when called from php从 php 调用 perl 脚本有时无法创建套接字连接
【发布时间】:2012-10-23 11:16:52
【问题描述】:

我正在尝试制作一个网页,人们可以在其中运行 moss 并检查源代码文件中的相似性。
为此,我通过 php 上传文件并使用 php 中的“exec”将这些文件作为参数调用moss script,并将输出转储到单独的文本文件中。该代码有时可以正常工作,但有时会在上传文件后停止。
以下是脚本中的 sn-p

$server = 'moss.stanford.edu';
$port = '7690';
.
.    
$sock = new IO::Socket::INET (
                                  PeerAddr => $server,
                                  PeerPort => $port,
                                  Proto => 'tcp',
                                 );
die "Could not connect to server $server: $!\n" unless $sock;
$sock->autoflush(1);
.
.

它无法创建连接,并且在此 sn-p 的第四行之后不会继续 - 'die "Could not connect to server $server: $!\n" unless $sock; em>'

这不会一直发生,但有时它工作得很好,有时却不行。
但是,当我通过 ssh 登录到我的网络主机(顺便说一句,godaddy)并在终端中使用相同的参数执行脚本时,它总是有效!

有人可以帮我解决这个问题,服务器上出了什么问题,有时脚本在通过浏览器执行时会死掉?

【问题讨论】:

  • 是的,我做错了,感谢您指出。 :)
  • 它会死吗? $! 是什么? $@ 说什么?实现的一个怪癖(与跨平台超时支持有关,IIRC)意味着 IO::Socket::INET 在$@ 而不是$! 中传达错误。这是不明显的记录(tm),在我看来很遗憾,但确实如此。

标签: php perl sockets


【解决方案1】:

由于它在另一台机器上运行良好,问题可能出在您的网络或 Perl 安装的细节上,或者与浏览器/PHP 交互有关。最容易检查的是它是否是您的网络。

看看你是否可以用 Perl 以外的东西重现网络问题。也许telnet moss.stanford.edu 7690 很多次。这将确定问题是 Perl 还是您的网络连接不稳定。

我还会让ping moss.standford.edu 继续运行并尝试在浏览器中重现问题。如果在您遇到问题的同时 ping 掉线了,那就是网络问题。

【讨论】:

  • 当脚本完全在godaddy服务器上运行时,我这边的网络问题如何成为问题?我是学生,在我的大学里他们已经阻止了这个端口(7690),这就是为什么我试图在godaddy服务器上运行脚本并通过网页使用它。
  • @Panks 我明白了,当您说您正在登录以在本地运行“脚本”时,您的意思是 Perl 脚本,而不是调用 Perl 脚本的 PHP 脚本。我以为你在本地和远程服务器上尝试 PHP。在这种情况下,我们需要看看您是如何从 PHP 调用 Perl 程序的。
  • 实际上无论哪种方式都可以正常工作,如果我登录到 godaddy 并直接在终端中运行 perl,或者如果我在终端中执行 php 文件,然后使用 'exec' 命令调用 perl 脚本.在这两种情况下,它都可以正常工作,并且结果会被转储到终端中。
  • 这里是 php 的代码:github.com/panks/moss-it/blob/master/index.php 它和我上面说的有点不同,它在第 47 行调用了一个 python 文件 'test.py' 并进行了一些预处理并调用了实际的 perl script. 尽管脚本死掉的问题仍然存在,即使调用 moss(perl) 脚本它是直接从 php 使用 exec 进行的。
【解决方案2】:

在研究此错误 DAYS ... 并确认我的代码和服务器设置都完美无缺后,“连接被拒绝”错误的原因是共享服务器问题而不是端口阻塞。强>

含义... Hostgator 和 GoDaddy 等托管公司阻止了许多端口!由于安全问题,这是可以理解的。您不能简单地在远程服务器上选择要使用的端口。

测试你的服务器/客户端/端口/脚本的方法是使用更常用的端口打开远程服务器的端口。 (即:8080、80 等)由于打开这些端口存在安全风险,请仅在测试脚本所需的时间内保持端口打开,然后再次关闭。

如果您的脚本处理正确,那么您需要找到一个您的共享托管公司不会阻止的端口。

*另一个提示:共享托管公司也可能有代理。这可能会增加更多的“阻塞/连接”问题。

我希望这可以减轻其他人花费我无数小时试图解决此问题的时间。

【讨论】:

    猜你喜欢
    • 2013-02-03
    • 2015-06-20
    • 2015-04-25
    • 1970-01-01
    • 2017-02-12
    • 1970-01-01
    • 1970-01-01
    • 2018-06-27
    • 1970-01-01
    相关资源
    最近更新 更多