【问题标题】:Persist an FTP connection PHP resource across AJAX calls跨 AJAX 调用保持 FTP 连接 PHP 资源
【发布时间】:2011-05-27 08:25:51
【问题描述】:

我有一个可以通过 AJAX 与 FTP 服务器交互的多用户 PHP Web 应用程序。该应用程序允许用户浏览 FTP 站点。 Javascript 进行 AJAX 调用,该调用与返回给定目录中文件和目录列表的服务器脚本通信。

这很好用。但是,每次请求目录列表时,服务器都必须重新建立与 FTP 服务器的连接,这需要很长时间。

我需要跨 AJAX 调用保持 FTP 连接 PHP 资源。换句话说,连接必须保持打开状态,并且我必须能够使用该资源运行 ftp_nlist(),而无需在每次新的 AJAX 调用时重新建立连接或重新验证(当然,直到连接超时) .

谁能想到办法做到这一点?

【问题讨论】:

  • 您必须能够创建一个单例类型的 ftp 类并将其存储在某个地方。保留连接对象的唯一位置是在 Apache 内存中,我认为这意味着自定义扩展。如果可能的话,这听起来是个不错的项目。

标签: php ajax ftp connection persistent-connection


【解决方案1】:

我认为在 PHP 中使用 FTP 库是不可能的。我看到有人在 PHP 中甚至有一个feature request,但似乎没有对其采取任何行动。

我能想到的唯一方法是使用第 3 方 FTP 客户端来保持连接打开并通过 PHP 与其交互。 (除了第 3 方 ftp 客户端,您可以只使用操作系统内置的 FTP 功能。Windows 提供它们,Linux 通过“ftp”程序提供它们。)

【讨论】:

  • 有人知道这样的第三方库吗?
  • 查看linuxreviews.org/software/ftp-clients上列出的 CLI 客户端
  • 我的应用需要能够同时管理数十个 FTP 连接。因此,多个用户可以连接到不同的服务器。是否有在 PHP 应用程序中使用这些 CLI 客户端的教程/文章?
  • 可能不是针对此特定实例的教程,但通常,要使用 PHP 执行任何外部程序,您可以使用 exec() 函数。 exec('someftpprogram -arguments -go -here')您只需填写命令即可完成所需操作,就像您通过终端窗口运行 FTP 客户端一样。
  • 不过,我想知道的是,如果我要使用 exec() + CLI 程序,一旦创建连接,我将如何继续使用它?
【解决方案2】:

很抱歉在没有明确答案的情况下添加混乱,但这可能会有所帮助: http://www.eecho.info/Echo/php/client-url-library-php-curl/ 看来您可以控制打开和关闭连接,但是就将此变量返回给客户端并使其重新使用而言,我不确定这是可能的(也可能只是将自己清理掉,超出您的控制),或者,您可能(取决于最终环境)考虑使用 Java 后端,您可以编写一个简单的服务器并在顶部添加 FTP 代码(嗯...蛋糕)。您需要为此做的一些示例如下:

http://fragments.turtlemeat.com/javawebserver.php

http://www.javaworld.com/javaworld/jw-04-2003/jw-0404-ftp.html

这假设对服务器环境中运行的内容有相当大的控制权,但实际上取决于您基本上拥有服务器或拥有完全的权限来做您想做的事情(至少像他们宣传的 Amazon EC2)。您可能可以使用 Tomcat 或其他一些 JSP 容器来实现这一点,并使用 JSP 而不是编写自己的服务器,但我不知道您是否能够保持它们的连接,因为它有点与 PHP 相同可以说,服务器通常“即时”解释文件。

【讨论】:

  • 所以本质上这将是一种守护进程方法,其中守护进程代表网站,作为代理,并与 FTP 和 SFTP 服务器对话。我可能还需要一些协议来与守护进程交互。这是你想的方向吗?
  • 是的,因此您必须在客户端和自定义服务器之间建立某种协议来请求或发布文件(幸运的是,您可以完全控制它,可以在 java 中使用 xerces.jar for XML ,还不错),我假设您在这里有一些时间来制定此协议和功能,这是我认为我曾经提出的盒装解决方案中最远的……您也可以从中得到一些用处this:mina.apache.org/ftpserver 这种听起来很有趣,但现在尝试自己也太费时间了,祝你好运。
【解决方案3】:

您无法使用 PHP 的普通 ftp 类函数创建持久 FTP 连接。是所有用户都在访问同一个 ftp 服务器,还是您正在运行 ftp Web 界面?如果多个用户连接到同一台服务器(具有相同的权限),您可以实施缓存解决方案。

【讨论】:

  • 每个用户都可以连接到任意 FTP 服务器,并传递他们的凭据。
【解决方案4】:

我最终使用全局变量(例如 $my_global)完成了这项工作。我有一个 ConnectionPooler 单例类,它管理存储在哈希中的连接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-27
    • 2015-08-14
    • 2011-05-11
    • 2012-07-07
    • 2011-05-27
    • 1970-01-01
    • 2011-08-08
    • 2011-08-01
    相关资源
    最近更新 更多