Ошибка резервного копирования Laravel при загрузке большой резервной копии на s3 - PullRequest
3 голосов
/ 01 апреля 2019

У меня есть проект 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=17&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=16&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=16&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

И они оба работают правильно. Я предполагаю, что ошибка вызвана полным размером почтового индекса (около 145 МБ), что объясняет, почему это никогда не происходило раньше (когда размер резервной копии был меньше). В пакете laravel-backup есть связанная проблема , но я не думаю, что это проблема библиотеки, которая просто использует базовый интерфейс flysystem s3 для загрузки zip.

Есть ли какой-то параметр, который я должен установить для php.ini (например, чтобы увеличить размер загружаемого файла завитка), или система для разделения файла на несколько частей?

1 Ответ

1 голос
/ 06 апреля 2019

Вы можете попробовать добавить параметр timeout в S3Client (https://docs.aws.amazon.com/pt_br/sdk-for-php/v3/developer-guide/guide_configuration.html)

Вот так:

$s3 = new Aws\S3\S3Client([
    '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
      ]  
   ]
]
...