1

我只能使用 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 上传大文件的方法。

安德烈

4

1 回答 1

1

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

参考

笔记:

set_time_limit()函数和配置指令max_execution_time只影响脚本本身的执行时间。在确定脚本运行的最长时间时,不包括在脚本执行之外发生的任何活动所花费的时间,例如系统调用 using 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 二进制文件。我可能会建议您使用像这样标记的文件(它在页面下方很长):

Win32   7.27.0  binary  SSL SSH Dirk Paehl

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

于 2012-09-07T09:10:20.700 回答