С тех пор я пытаюсь решить чрезвычайно тривиальный вопрос, но не повезло.
Я хочу удалить файл сразу после его загрузки в AWS S3 с PHP WebServer. Ниже приведены шаги:
//Upload file to S3 using PHP SDK's S3Client::putObject method: $result = $s3_client->putObject( array( 'Bucket' => AWS_BUCKET_NAME, 'Key' => $file_name, 'SourceFile' => $file_path, 'Metadata' => array( 'metadata_field' => 'metadata_value' ) )); //Poll the object until it is accessible $s3_client->waitUntil('ObjectExists', array( 'Bucket' => AWS_BUCKET_NAME, 'Key' => $file_name )); //Delete the file unlink( $file_path );
Эти шаги отлично работают, если я загружаю небольшой файл (~ 500 КБ). Однако, если я загружу более крупный файл (5 МБ-10 МБ) , я получаю следующую ошибку :
Warning: unlink(<Complete Path to File>): Permission denied in <Complete path to uploader.php> on line N
Я работаю над Windows и попробовал повысить права доступа для каталога и файла. (используя команды chmod, chown php и убедитесь, что каталог доступен для записи и доступен)
Похоже, что метод AWS S3 PutObject не освобождает дескриптор файла (в случае больших файлов). Я также попытался добавить sleep (), но не удачу.!
Более того, в случае, если я пропустил загрузку файла на S3 (просто чтобы проверить рабочий процесс delete), файл будет удален без каких-либо проблем.
Пожалуйста помоги.!
Проблема поднята на https://github.com/aws/aws-sdk-php/issues/841
Попробуйте использовать функцию gc_collect_cycles (), она решила проблему для меня. См. Страницу выше для дополнительной справки.
С уважением, Андор
Возможно, вам нужно установить значение upload_max_filesize и post_max_size в вашем php.ini:
; Максимально допустимый размер для загруженных файлов. upload_max_filesize = 40M
; Должно быть больше или равно upload_max_filesize post_max_size = 40M
После изменения файлов (ов) php.ini вам необходимо перезапустить HTTP-сервер, чтобы использовать новую конфигурацию.
В случае, если кто-то еще застрял на этом, я переместил развертывание сервера nginx в CentOS, и эта проблема не наблюдалась.
У waitUntil 'ObjectExists' есть попытки таймаута / max по умолчанию.
Вы можете изменить, используя:
$s3Client->waitUntil('ObjectExists', array( 'Bucket' => AWS_BUCKET_NAME, 'Key' => $file_name, 'waiter.interval' => 10, 'waiter.max_attempts' => 6 ));