#php #laravel #amazon-s3 #php-curl
#php #laravel #amazon-s3 #php-curl
Вопрос:
У меня есть проект Laravel, который ежедневно создает новую резервную копию с помощью spatie / laravel-backup и загружает ее на s3. Он правильно настроен и работает более года без проблем.
Внезапно резервная копия не может завершить процесс загрузки из-за следующей ошибки:
Copying zip failed because: An exception occurred while uploading parts to a multipart upload. The following parts had errors:
- Part 17: Error executing "UploadPart" on "https://s3.eu-west-1.amazonaws.com/my.bucket/Backups/2019-04-01-09-47-33.zip?partNumber=17amp;uploadId=uploadId"; AWS HTTP error: cURL error 55: SSL_write() returned SYSCALL, errno = 104 (see http://curl.haxx.se/libcurl/c/libcurl-errors.html) (server): 100 Continue -
- Part 16: Error executing "UploadPart" on "https://s3.eu-west-1.amazonaws.com/my.bucket/Backups/2019-04-01-09-47-33.zip?partNumber=16amp;uploadId=uploadId"; AWS HTTP error: Client error: `PUT https://s3.eu-west-1.amazonaws.com/my.bucket/Backups/2019-04-01-09-47-33.zip?partNumber=16amp;uploadId=uploadId` resulted in a `400 Bad Request` response:
<?xml version="1.0" encoding="UTF-8"?>
<Code>RequestTimeout</Code><Message>Your socket connection to the server w (truncated...)
RequestTimeout (client): Your socket connection to the server was not read from or written to within the timeout period. Idle connections will be closed. - <?xml version="1.0" encoding="UTF-8"?>
<Code>RequestTimeout</Code>
<Message>Your socket connection to the server was not read from or written to within the timeout period. Idle connections will be closed.</Message>
<RequestId>RequestId..</RequestId>
<HostId>Host id..</HostId>
Я попытался запустить:
php artisan backup:run --only-db // 110MB zip file
php artisan backup:run --only-files // 34MB zip file
И они оба работают должным образом. Я предполагаю, что ошибка вызвана полным размером zip (около 145 МБ), что объясняет, почему это никогда не происходило раньше (когда размер резервной копии был меньше). С пакетом laravel-backup связана проблема, но я не думаю, что это проблема библиотеки, которая просто использует базовый интерфейс s3 flysystem для загрузки zip.
Есть ли какой-либо параметр, который я должен установить php.ini
(например, для увеличения размера загружаемого файла curl), или система для разделения файла на несколько фрагментов?
Комментарии:
1. Увеличьте время выполнения PHP в PHP.ini (max_execution_time)
2. Я уже пробовал это, к сожалению, не помогло
Ответ №1:
Вы можете попробовать добавить timeout
параметр в S3Client (https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/guide_configuration.html )
Вот так:
$s3 = new AwsS3S3Client([
'version' => 'latest',
'region' => 'us-west-2',
'credentials' => $credentials,
'http' => [
'timeout' => 360
]
]);
Но в Laravel вы должны сделать это config/filesystems.php
следующим образом:
'disks' => [
's3' => [
'driver' => 's3',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => 'us-east-1',
'bucket' => env('FILESYSTEM_S3_BUCKET'),
'http' => [
'timeout' => 360
]
]
]
Комментарии:
1. В документах сказано: «Используйте 0 для ожидания неопределенно долго (поведение по умолчанию)». Не лучше ли сохранить значение по умолчанию вместо использования значения, скажем, 360s?