【问题标题】:ftp_get() does not download, instead moves file to website root folderftp_get() 不下载,而是将文件移动到网站根文件夹
【发布时间】:2015-05-25 20:25:28
【问题描述】:

我有一个在 CakePHP 下开发的网站。我正在尝试将下载系统从 Apache 更改为 FTP。

我目前正在使用 PHP 手动进行 FTP(不使用任何插件或库)。

我的代码成功连接到 FTP 服务器等。我遇到的问题是,当我调用 ftp_get($conn_id, $localFile, $remoteFile, FTP_BINARY) 时,它成功执行,尽管文件没有下载,而是移动到 /webroot/ 文件夹,顾名思义,它用作网站的根文件夹(使用 .httaccess 规则)。

我提到 .httaccess 是因为我可能怀疑这是导致 FTP 将下载路由到“移动”到根目录的原因,但我不确定。

以下是我的FTP下载代码:

    $conn_id = ftp_connect($host);
    $login_result = ftp_login($conn_id,$ftp_user,$ftp_pass);

     if($login_result)
     {
         try 
         {
             if(ftp_get($conn_id, $localFile, $remoteFile, FTP_BINARY))
             {
                 $this->log("Downloaded...","debug");
             }
             else
             {
                 $this->log("Couldn't download...","debug");
             }
         }
         catch(Exception $e)
         {
             $this->log("Error: " . $e->getMessage(),"debug");
         }
     }
     else
     {
         $this->log("Coudln't connect to FTP server...","debug");
     }

     ftp_close($conn_id);

是的,我检查了(打印出来)$conn_id$login_result,它们正在工作。

路径里面是什么?

 $remoteFile = "/downloads/rdticoiroe1432584529/YourMusic.zip";
 $localFile = "Music.zip";

代码不会抛出任何错误。我还尝试使用 cakephp 和 FTP 的 fotografde/cakephp-ftp repo 插件,它的行为相同......

编辑 1:

它是一个音乐下载站点,现在我们使用 Apache 提供文件下载(非常慢),我们的想法是转向 FTP 下载。当客户端请求下载文件时,我正在尝试使用 FTP 协议下载文件。

编辑 2:

这个问题的整个想法是我试图转向一种更优化的方法来向客户提供文件。我拥有一个 100Mbit 的传输服务器,下载速度非常慢。我目前正在使用 Apache 将文件下载给请求它的客户。

我完全误解了使用 PHP-FTP 向客户端硬盘驱动器提供文件。

因此,我正在寻找一些指导,了解人们在向请求下载的客户提供文件时使用哪些方法/协议。 (这是一个音乐下载网站)。

【问题讨论】:

  • $localFile 被设置为相对于您的脚本的路径。使用完整的/path/to/target/location
  • ftp_get 从远程服务器获取文件并将其放在 your 服务器(运行脚本的服务器)上,而不是客户端的计算机上。由于您在$localFile 中指定了相对路径,因此它相对于您在服务器上运行的脚本。所以,如果你想把它放在其他地方(在你的服务器上),你需要指定一个绝对路径,或者使用例如`../' 向上移动一个目录,等等。
  • 是什么让您认为您可以比 Apache 更快地向客户端提供文件?
  • @ChristianFeo 比什么慢得多?你问他们什么问题?因为我认为他们可能误解了。
  • 是的,软件所要做的就是将大量字节(文件内容)推送到线路上;真的没有太多需要优化的地方。但是,一旦它连接到那条线上,它就必须通过整个迷宫般的连接,其中许多连接都因大量其他流量而拥塞,然后才能到达客户端的 PC。顺便说一句,不要根据域名假设服务器的位置 - 大型站点会将数据副本存储在世界各地的服务器上,并自动将用户连接到离他们最近的服务器,在 URL 中没有任何指示全部。

标签: php cakephp ftp


【解决方案1】:

您在这里有一个基本的误解:FTP 连接中的“远程文件”是远程的东西 - 例如,某处另一台服务器上的文件。在您的情况下,我认为您尝试提供的文件在这个意义上是“本地”的,但您想要一种更快地将其提供给客户的方法。

无法将文件推送到客户端的硬盘驱动器(考虑安全隐患),您只能使其可用。现在,客户端可以使用 HTTP 请求它,Apache 将给他们内容。如果您安装了 FTP 服务器,他们可以连接 FTP 客户端并以这种方式请求它。同样,您可以安装不同的 Web 服务器,例如 nginx 或 lighttpd,这可能会更快。

然而,您在 PHP 中所做的任何事情都不会比 Apache 更快,因为您仍然需要 Apache,但是现在您也有了 PHP 代码,在执行 Apache 之前,这充其量需要时间来执行您的代码无论如何都会去做。

【讨论】:

  • 感谢您的澄清。我正在尝试优化下载速度,现在,即使有一个 100MBit 的传输服务器也不能很好地工作,DL 速度很慢,网络服务器建议从 Apache 下载转移。我应该研究什么技术/方法来实施?
  • 老实说,瓶颈很可能是您的托管服务提供商,因此他们可能正试图用可疑的建议来掩饰自己。 Apache 可能不是提供文件最快的 HTTP 服务器(查找 lighttpd,正如我所提到的),但差异可能会因那里与客户端计算机之间的各种连接的低带宽而相形见绌。
  • 好吧,至少我现在知道去哪里找了,对整个交易还是有点怀疑......我有这个想法,FTP 将解决我的问题。很难找到有关这些主题的指导。我会看看lighttpd。我将在今天晚些时候将此标记为答案....谢谢伙计!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-10
  • 1970-01-01
相关资源
最近更新 更多