Ошибка резервного копирования Laravel при загрузке большой резервной копии на s3

#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?