【问题标题】:Using shell_exec to ftp in PHP在 PHP 中使用 shell_exec 进行 ftp
【发布时间】:2012-09-07 08:40:39
【问题描述】:

我只能使用 shell_exec 命令将文件 FTP 到另一台服务器。这是由于共享服务器 fastCGI 超时造成的。所以,不,我不能使用任何其他命令。

如何实现它?我在 DOS 窗口中测试我的 PC 上的脚本,它可以工作,但在服务器上使用代码:

$output = shell_exec('ftp -s:ftpscript.txt');
echo "<pre>$output</pre>";

我收到以下错误:

ftp: s: unknown option

批处理文件是:

open ftp.server.com
usernamex
passwordx
hash
cd incoming
binary
ls

有什么想法吗?

背景:我正在使用 PHP 将文件上传到 Amazon AWS Glacier,但由于 fastCGI (?) 超时,大文件 (750Mb) 超时并报告 500 Internal Server 错误。我需要找到一种使用 FTP 上传大文件的方法。

安德烈

【问题讨论】:

    标签: php ftp batch-file shell-exec


    【解决方案1】:

    在 *nix 上,ftp:// 包装器的使用不应导致超时,因为花在流操作上的时间不应计入脚本的时间限制。尝试在脚本顶部调用set_time_limit(0); 以防止脚本超时。

    Ref:

    注意:

    set_time_limit() 函数和配置指令max_execution_time 只影响脚本本身的执行时间。在确定脚本运行的最长时间时,不包括在脚本执行之外发生的活动所花费的任何时间,例如使用system() 的系统调用、流操作、数据库查询等。在实测时间为真实的 Windows 上,情况并非如此。

    还应该注意的是,通过 FTP 从通过 HTTP 调用的脚本传输 750MB 文件并不是一个好的解决方案,因为在传输完成时浏览器需要保持打开状态。您可能应该做的是使用 cron 作业来执行传输,或者使用 HTTP 请求来异步启动传输。

    如果这对您来说不是一个可行的解决方案,那么您在使用 shell_exec() 方法时遇到的问题是 Windows 和 *nix FTP 程序之间的差异。

    您的服务器是否有命令行 cURL 二进制文件?如果它可用,这将是一个更好的选择,因为无论平台如何,接口都是标准的。此外,您不需要使用脚本,您可以使用命令行参数完成几乎任何事情。

    例如上面的代码可以压缩成这个命令:

    $output = shell_exec('curl ftp://usernamex:passwordx@ftp.server.com/incoming/');
    echo "<pre>$output</pre>";
    

    这会忽略脚本中的 hash 命令,但如果您的目标是通过编程方式获取目录列表,则不需要此选项。

    您可以获取 Windows cURL 二进制文件以在本地服务器 here 上进行测试。我可能会建议您使用像这样标记的文件(它位于页面下方):

    Win32   7.27.0  binary  SSL SSH Dirk Paehl
    

    可以在here 找到使用 cURL 命令行二进制文件的完整文档。

    【讨论】:

    • 来自 Dreamhost 的注释:当脚本通过 Web 浏览器加载时,您将受到 fastcgi 限制,该限制似乎在较大文件上超时。这里的问题是,在共享主机服务器上,我们不能允许您修改 fastcgi 超时。如果您通过 shell 命令行执行脚本,则不会收到错误消息。
    • @andrebruton 他们不提供 curl 命令行二进制文件吗?另外,您真的需要从网络浏览器执行此操作吗(我的意思是,您不能exec() PHP 脚本从网络浏览器执行此操作并分离进程,而不是让浏览器等待文件下载了吗?)
    • 知道如何编码吗?一个工作的例子?只能从网页进行传输,没有其他我知道的访问...
    • @andrebruton 您能否再解释一下架构,以便我提供一个示例?你说你正在上传文件,它们来自哪里?听起来流程是用户通过 HTTP 将文件上传到 PHP 脚本 - > PHP 脚本通过 FTP 将文件上传到远程服务器 - 这是正确的吗?如果是这样,为什么需要列出远程 FTP 服务器上的文件?用户有没有办法直接上传到远程服务器?它将大量节省带宽......
    • 嗨@DaveRandom,这些文件是由 Dreamhost 创建的,它们是我所有托管文件等创建的备份文件。我有 5 天的时间通过 ftp 移动它们。我有一个通过 ftp 登录并将其下载到服务器的脚本。从那里我想将这些文件保存在 Amazon AWS 上。任何安全、可回收且便宜的地方。 Amazon Glacier 只是解决方案,但他们还没有 PHP 库来执行此操作。我使用 CouldGates.net 在线服务创建了对 Glacier 的 FTP 访问。它工作得很好,除了服务器上传文件的超时问题。希望有帮助
    猜你喜欢
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 2014-09-12
    相关资源
    最近更新 更多