使用PHP进行轮询的网络间文件传输

时间:2013-01-09 13:43:21

标签: php jquery file-io network-programming

我正在设计一个基于Web的文件管理系统,可以概念化为3个不同的服务器:

  1. 托管用户“上传”和管理文件的系统界面(内置于PHP)的服务器(这里没有存储实际文件,它都是元数据)。
  2. 一个单独的登台服务器,用于处理文件。
  3. 文件存储,其中文件在未处理时存储。
  4. 所有3台服务器将基于相同的内部网络* nix。基于Windows的用户将使用Web界面为服务器1上的文件创建初始条目。此文件将从用户的本地驱动器“上载”到服务器3(如果该文件当前不存在于任何位置)网络)或内部网络上的其他网络驱动器。

    我的问题涉及实现我想做的最佳程序化方法,即:

    当用户从网络上传文件(通过网络表单选择来源)时,该文件将作为网络间转移传输到服务器3,而不是通过用户(我相信如果它作为标准的HTTP表单上传发送会发生什么。我知道我可以在每台机器上设置FTP服务器并尝试在不同位置之间使用FXP文件,但这是否优于PHP在服务器1上执行命令(具有全局网络访问权限),以此方式执行跨网络传输?

    第二个问题是这些是我们正在谈论的非常大的文件,每个文件至少一千兆字节或两个,所以传输不会是即时的。我需要一些方法来轮询传输状态,并将其返回到Web界面,以便用户知道发生了什么。

    或者,这个上传可以保持与用户的当前视图异步运行,但我仍然需要一种方法来检查传输的状态以确保它完成。

    那么,如果使用FXP解决方案,如何实现轮询?如果从shell使用文件移动/复制命令,是否可以进行任何形式的轮询? PHP / JQuery解决方案是非常可以接受的。

    我对这个问题的最后一部分涉及到Windows网络驱动器映射。用户可以映射驱动器(并从中选择文件),任意指定的映射驱动器。他们的G:\可能与\ server4 \ some \ location \其中有关,但可能是通过Web表单提供给服务器的任何驱动路径只会发送G:\文件路径。 有没有办法确定映射网络驱动器的“真实路径”?

    任何解决方案都将用于在处理文件时将文件从服务器3转移到服务器2 - 重点是这些巨型文件不必先通过用户的本地计算机。

    如果您有任何意见,请告诉我,如果不清楚,我会尽量让这个问题更加贴切。

2 个答案:

答案 0 :(得分:1)

据我所知(我可能错了),没有标准方法可以从浏览器确定映射驱动器的UNC路径。

执行此操作的唯一方法是在网页中进行某种控制。可能是ActiveX或闪存。我见过ActiveX这样做,但不是flash。

过去在设计需要知道用户映射驱动器的UNC路径的基于Web的系统时,我必须将驱动器转换为UNC路径存储服务器端。虽然知道哪个驱动器将映射到UNC路径,但我确实有一种奢侈。如果用户可以设置任意路径,那么这显然不起作用。

好吧,因为我拖延和避免真正的工作,我已经考虑过这个。

我将在前言中说我不是Linux专家,而我将要描述的系统刚刚被认为是我的头脑而不是你想要放的东西进入任何一种生产。但是,它可能会帮助您走正确的道路。

那么,你有3台服务器,接口服务器(我假设是LAMP堆栈?)你的Staging Server和你的文件存储服务器。您还将拥有客户端计算机和网络共享。出于此设计的目的,您的网络共享托管在您的文件存储可以scp的nix框中。

您可以创建跟踪和存储有关文件等信息的前端网站。这还将保存有关正在复制的文件的详细信息,这些文件位于暂存等中。

您还需要在文件存储服务器上运行某种服务。我将其称为文件复制服务。这将负责处理托管网络共享的服务器中的文件。

现在,您仍然遇到了如何确定用户文件实际上的路径的问题。如果您可以阻止用户映射他们自己的驱动器并强制他们使用一致的驱动器号,那么您可以将驱动器号转换为服务器上的UNC路径。如果你不能,那么我会让你弄清楚。如果您在Windows域中,则可以使用组策略强制执行驱动器映射。

无论如何,系统的过程可以像这样工作。

  1. 用户进入系统并选择文件
  2. 接口服务器获取文件路径并调用文件存储服务器上的文件复制服务
  3. 文件复制服务连接到承载文件的服务器并启动副本。如果它们都是nix盒子,你可以很容易地使用类似SCP的东西。现在,我实际上并没有想过如何做到这一点,但是如果你不能从SCP那里得到一个完整的百分比,那么我会非常惊讶。通过此运行总计,文件复制服务将更新接口服务器上的数据库以及副本的运行方式,以便用户可以从接口服务器中看到此信息。
  4. 文件复制服务还可用于将文件从文件存储移动到登台服务器。

    正如我所说,非常粗略地想到了。上述方法可行,但这在很大程度上取决于系统的设置方式等。

    尽管如此,必须有软件可以做到这一点。你看了吗?

答案 1 :(得分:1)

如果我正确就是这个结构:

enter image description here

Entlarge image

1)

首先让我们解决“服务器间转移”的问题 我将通过NFS将文件系统从服务器2和3挂载到服务器1来解决此问题。

https://help.ubuntu.com/8.04/serverguide/network-file-system.html

因此PHP可以将文件存储在文件系统上,而不需要知道文件真正在哪个服务器上。

/etc/exports
of Server 2 + 3
/directory/with/files 192.168.IPofServer.1 (rw,sync)

exportfs -ra


/etc/fstab 
of Server 1
192.168.IPofServer.2:/var/lib/data/server2/ /directory/with/files  nfs rsize=8192,wsize=8192,timeo=14,intr
192.168.IPofServer.3:/var/lib/data/server3/ /directory/with/files  nfs rsize=8192,wsize=8192,timeo=14,intr

mount -a

2。)

获取真正大文件的上传进度, 这里有一些可能有http上传的进度条。 但是对于恢复功能,你必须使用flash插件。

http://fineuploader.com/#demo

https://github.com/valums/file-uploader

或者您可以使用apc扩展

通过自己构建它

http://www.amwsites.com/blog/2011/01/use-a-combination-of-jquery-php-apc-uploadprogress-to-show-progress-bar-during-an-upload/

3。)

让服务器从网络驱动器加载文件。 我将尝试使用java applet来计算真实的网络路径并将其发送到服务器,以便服务器可以在后台获取文件。 但我以前从来没有这样想过,也没有进一步的信息。