gpt4 book ai didi

php - RequestTimeout 使用 PHP 上传到 S3

转载 作者:可可西里 更新时间:2023-11-01 13:16:49 26 4
gpt4 key购买 nike

我在从我们的一台服务器上将文件上传到 S3 时遇到问题。我们使用 S3 来存储我们的备份,我们所有的服务器都运行 Ubuntu 8.04,PHP 5.2.4 和 libcurl 7.18.0。每当我尝试上传文件时,Amazon 都会返回 RequestTimeout 错误。我知道我们当前版本的 libcurl 中存在一个错误,阻止了超过 200MB 的上传。出于这个原因,我们将备份分成更小的文件。

我们的服务器托管在亚马逊的 EC2 上,服务器托管在客户的“私有(private)云”(他们公司防火墙后面的 VMWare ESX 盒)上。我遇到问题的特定服务器托管在客户的私有(private)云上​​。

我们使用来自 http://undesigned.org.za/2007/10/22/amazon-s3-php-class 的 Amazon S3 PHP 类.我试过 200MB、100MB 和 50MB 的文件,结果都一样。我们使用以下方式上传文件:

$s3 = new S3($access_key, $secret_key, false);
$success = $s3->putObjectFile($local_path, $bucket_name,
$remote_name, S3::ACL_PRIVATE);

我尝试设置 curl_setopt($curl, CURLOPT_NOPROGRESS, false); 以在上传文件时查看进度条。我第一次使用此选项集运行它时它起作用了。然而,随后的每一次它都失败了。它似乎以大约 3Mb/s 的速度上传文件 5-10 秒,然后下降到 0。20 秒后,亚马逊返回“RequestTimeout - 您与服务器的套接字连接未在超时内读取或写入期间。空闲连接将被关闭。”错误。

我已尝试将 S3 类从 GitHub 更新到最新版本但这没有什么区别。我还找到了 Amazon S3 Stream Wrapper类并尝试使用以下代码:

include 'gs3.php';
define('S3_KEY', 'ACCESSKEYGOESHERE');
define('S3_PRIVATE','SECRETKEYGOESHERE');
$local = fopen('/path/to/backup_id.tar.gz.0000', 'r');
$remote = fopen('s3://bucket-name/customer/backup_id.tar.gz.0000', 'w+r');

$count = 0;
while (!feof($local))
{
$result = fwrite($remote, fread($local, (1024 * 1024)));
if ($result === false)
{
fwrite(STDOUT, $count++.': Unable to write!'."\n");
}
else
{
fwrite(STDOUT, $count++.': Wrote '.$result.' bytes'."\n");
}
}

fclose($local);
fclose($remote);

此代码一次读取一个 MB 的文件,以便将其流式传输到 S3。对于一个 50MB 的文件,我得到 49 次“1:写了 1048576 字节”(第一个数字当然每次都会改变)但是在循环的最后一次迭代中我得到一个错误,上面写着“通知:fputs():发送 8192 bytes failed with errno=11 Resource temporary unavailable in/path/to/http.php on line 230".

我的第一个想法是这是一个网络问题。我们调用客户并解释了这个问题,并要求他们查看他们的防火墙,看看他们是否丢失了任何东西。根据他们的网络管理员的说法,流量流动得很好。

我不知道接下来该做什么。我一直在手动运行备份并使用 SCP 将它们传输到另一台机器并上传它们。这显然不理想,我们将不胜感激任何帮助。

更新 - 2011 年 6 月 23 日

我已经尝试了下面的许多选项,但它们都提供了相同的结果。我发现即使尝试将文件从有问题的服务器 scp 到另一台服务器也会立即停止并最终超时。但是,我可以使用 scp 从另一台机器下载相同的文件。这让我更加确信这是客户端的网络问题,任何进一步的建议将不胜感激。

最佳答案

存在此问题是因为您正在尝试再次上传同一文件。示例:

$s3 = new S3('XXX','YYYY', false);
$s3->putObjectFile('file.jpg','bucket-name','file.jpg');
$s3->putObjectFile('file.jpg','bucket-name','newname-file.jpg');

要修复它,只需复制文件并为其命名,然后正常上传即可。

例子:

$s3 = new S3('XXX','YYYY', false);
$s3->putObjectFile('file.jpg','bucket-name','file.jpg');
now rename file.jpg to newname-file.jpg
$s3->putObjectFile('newname-file.jpg','bucket-name','newname-file.jpg');

关于php - RequestTimeout 使用 PHP 上传到 S3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6072666/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com