У меня проблемы с загрузкой файлов в S3 с одного из наших серверов.Мы используем S3 для хранения наших резервных копий, и все наши серверы работают под управлением Ubuntu 8.04 с PHP 5.2.4 и libcurl 7.18.0.Всякий раз, когда я пытаюсь загрузить файл, Amazon возвращает ошибку RequestTimeout.Я знаю, что в нашей текущей версии libcurl есть ошибка, препятствующая загрузке более 200 МБ.По этой причине мы разбиваем наши резервные копии на более мелкие файлы.
У нас есть серверы, размещенные на Amazon EC2, и серверы, размещенные в «частных облаках» клиента (блок VMWare ESX за брандмауэром их компании).Конкретный сервер, с которым у меня возникают проблемы, размещен в частном облаке клиента.
Мы используем PHP-класс Amazon S3 из http://undesigned.org.za/2007/10/22/amazon-s3-php-class. Я пробовал файлы размером 200, 100 и 50 МБ, все сте же результаты.Для загрузки файлов мы используем следующее:
$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);
для просмотра индикатора выполнения во время загрузки файла.В первый раз, когда я запустил его с этим параметром, он работал.Однако каждый последующий раз это не удавалось.Похоже, что файл загружается со скоростью около 3 Мбит / с в течение 5-10 секунд, а затем падает до 0. Через 20 секунд, сидя на 0, Amazon возвращает «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);
Этот код читает файл по одному МБ за раз, чтобы передать его вS3.Для файла размером 50 МБ я получаю «1: Написал 1048576 байт» 49 раз (первое число меняется каждый раз, конечно), но на последней итерации цикла я получаю сообщение об ошибке: «Примечание: fputs (): send 8192сбой в байтах с errno = 11 Ресурс временно недоступен в /path/to/http.php в строке 230 ".
Сначала я подумал, что это проблема с сетью.Мы позвонили клиенту, объяснили проблему и попросили его взглянуть на брандмауэр, чтобы узнать, не уронили ли они что-нибудь.По словам их сетевого администратора, трафик течет просто отлично.
Я не знаю, что мне делать дальше.Я выполняю резервные копии вручную и использую SCP для их передачи на другую машину и загрузки их.Это, очевидно, не идеально, и любая помощь будет принята с благодарностью.
Обновление - 23/23/2011
Я испробовал многие из вариантов ниже, но все они предоставилитот же результат.Я обнаружил, что даже попытка скопировать файл с рассматриваемого сервера на другой сервер останавливается немедленно и в конечном итоге истекает время ожидания.Однако я могу использовать scp для загрузки этого же файла с другого компьютера.Это делает меня еще более убежденным, что это проблема сети на стороне клиента, любые дальнейшие предложения будут с благодарностью.