【问题标题】:"php_connect_nonb() failed: Operation now in progress (115)" happens intermittently“php_connect_nonb() failed: Operation now in progress (115)”间歇性发生
【发布时间】:2013-03-19 06:34:56
【问题描述】:

我们通过 FTP 使用 PHP cron 作业将一些文件发送给第三方。

但有时我们会收到以下错误:

ErrorException [ 2 ]: ftp_put(): php_connect_nonb() failed: Operation 
now in progress (115) ~ MODPATH/fileop/classes/Drivers/Fileop/Ftp.php [ 37 ]

当我说“有时”时,我的意思正是如此;大多数时候它都很好,但大约五分之一的时候我们会得到这个错误。这与文件本身无关,因为如果我们再试一次,它们会很开心。

我们在网上发现了类似的问题 - 与带有 NAT 设备的 bug in PHP 或与防火墙配置有关,但再次暗示,如果是这种情况,它将永远起作用。

那么,为什么这有时会起作用而其他时候却不起作用?

【问题讨论】:

  • 您的 FTP 服务器的版本是多少?更新它可能会修复该软件中的错误。 bugs.php.net/bug.php?id=47110
  • 是的,我见过那个。但是该用户似乎根本无法连接。不确定服务器是什么版本;我需要从第三者那里找出答案。
  • 尝试使用 SCP 而不是 FTP:hypexr.org/linux_scp_help.php
  • 唉,我不能使用 SCP,因为它不是第 3 方提供的选项之一。
  • 我遇到了同样的问题。我可以使用标准 OSX FTP 客户端(传输)连接到 FTP 服务器,但在我的代码中,它根本不会连接它挂起,并返回有关正在进行的错误。但是,如果 Web 服务器与 FTP 服务器位于同一 LAN 中,则不会出现此问题。一旦 Web 服务器在 FTP LAN 之外,就会发生此错误。也不知道怎么解决:(

标签: php linux ftp


【解决方案1】:
ftp_set_option($ftpconn, FTP_USEPASVADDRESS, false);

设置被动连接ftp_pasv($ftpconn, true);之前的这行代码

解决了我的问题

【讨论】:

  • 我的代码:$conn = ftp_connect($server); $login = ftp_login($conn, $username, $password); ftp_set_option($conn, FTP_USEPASVADDRESS, false); ftp_pasv($conn, true); ftp_put($conn, $remote_file, $file, FTP_ASCII);
【解决方案2】:

FTP(S) uses random ports to set up data connections;间歇性成功率表明客户端和/或服务器计算机上的防火墙并非允许所有端口。传入(PASV)数据连接的端口范围可以在 FTP 服务器中设置。

This page 有一个很好的总结:

简单的方法是简单地允许 FTP 服务器和客户端不受限制 通过您的防火墙访问,但如果您想限制他们访问 “已知”端口,您必须了解 4 种不同的场景。

1) 应该允许 FTP 服务器接受 TCP 连接到端口 21,并建立从端口 20 到任何(远程临时)的 TCP 连接 港口。

2) 应该允许 FTP 服务器接受 TCP 连接到端口 21,并且也接受到任何临时端口的 TCP 连接!

3) 应该允许 FTP 客户端与端口建立 TCP 连接 21,并接受从端口 20 到任何临时端口的 TCP 连接。

4) 应该允许 FTP 客户端与端口建立 TCP 连接 21,并与任何其他(远程临时)端口建立 TCP 连接 也一样!

【讨论】:

    【解决方案3】:

    所以,我在对我的 FTP 服务器进行了一些调查并阅读了您提供的elitehosts.com 链接后,正在写这个答案。

    我正在使用 FileZilla FTP 服务器,我必须输入一个特定设置才能使其正常工作。进入服务器设置,有一个名为“被动模式设置”的区域。在该对话框中,有一个名为“IPv4 特定”的区域,在该区域内有一个标记为“被动模式传输的外部服务器 IP 地址:”的设置。这是一个单选按钮选择集,它位于“默认”上,但由于 FTP 服务器是经过 NAT 的,我将单选选项从“默认”更改为“使用以下 IP:”并输入面向外部的 IP我的 ISP 提供的网关地址。

    在我设置之后,它起作用了!不太确定您的 FTP 服务器是否经过 NAT,但我想我会在此线程上提供答案,因为它似乎相关。

    【讨论】:

      【解决方案4】:

      除了 Cees 的回答,我在 ec2 上运行 vsftp 并且不得不注释掉 listen_ipv6=YES,listen=YES 然后“service vsftpd restart”。

      虽然文档说它也会在 ipv4 上侦听,但事实并非如此,这解决了问题。

      【讨论】:

        【解决方案5】:

        对我来说,我所要做的就是删除 ftp_pasv( $ftpconn, true ); 并且一切正常。我还不知道为什么,但我正在努力找出答案,当我找到背后的原因时,我一定会回来的。

        【讨论】:

        • 所以?你找到原因了吗。今天下午我也遇到了这种情况,我按照你说的做了,效果很好。
        • 好吧,我做了一些调查,看起来你不能相信我提出的解决方案......一旦我得到最好的可靠解决方案,我会分享
        【解决方案6】:

        这应该是 jj_dev2 评论下的评论,但由于声誉问题,我无法添加。但也许它会对某人有所帮助,所以我在这里发布。

        我们遇到了与原始帖子中描述的相同的问题。在我们的案例中,它与许多客户合作——除了一个。

        jj_dev2 评论中的解决方案确实对我们有用。所以我们调查了ftp_set_option($conn, FTP_USEPASVADDRESS, false) 实际做了什么。并据此发现,实际上客户的FTPS服务器配置错误。

        作为对 PASV 命令 (ftp_pasv($conn, true)) 的响应,FTP 服务器返回一个 IP 地址,PHP FTP 客户端随后将使用该地址进行数据传输。在我们的例子中,FTP 服务器返回的是一个内部 IP 地址,而不是我们连接的公共 IP 地址。客户必须修复他们的 FTP 服务器设置,以便 FTP 服务器在 PASV 命令响应中发送外部 IP 地址。

        【讨论】:

          猜你喜欢
          • 2021-09-08
          • 2012-04-29
          • 1970-01-01
          • 1970-01-01
          • 2022-12-27
          • 2022-12-28
          • 2022-10-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多