/** * Uploads backup file from server to Amazon S3. * * @param array $args arguments passed to the function * [as3_bucket_region] -> Amazon S3 bucket region * [as3_bucket] -> Amazon S3 bucket * [as3_access_key] -> Amazon S3 access key * [as3_secure_key] -> Amazon S3 secure key * [as3_directory] -> folder on user's Amazon S3 account which backup file should be upload to * [as3_site_folder] -> subfolder with site name in as3_directory which backup file should be upload to * [backup_file] -> absolute path of backup file on local server * * @return bool|array true is successful, array with error message if not */ public function amazons3_backup($args) { if (!mwp_container()->getSystemEnvironment()->isCurlEnabled()) { throw new MWP_Worker_Exception(MWP_Worker_Exception::PHP_EXTENSION_REQUIRED_CURL, 'The cURL PHP extension is required for Amazon S3 backup functionality to work. Please, enquire your hosting provider on how to enable that extension.'); } if ($args['as3_site_folder'] == true) { $args['as3_directory'] .= '/' . $this->site_name; } $endpoint = isset($args['as3_bucket_region']) ? $args['as3_bucket_region'] : 's3.amazonaws.com'; $fileSize = filesize($args['backup_file']); $progressSupport = version_compare(PHP_VERSION, '5.3', '>='); $start = microtime(true); mwp_logger()->info('Uploading backup file to Amazon S3)', array('directory' => $args['as3_directory'], 'bucket' => $args['as3_bucket'], 'endpoint' => $endpoint, 'backup_file' => $args['backup_file'], 'backup_size' => $fileSize, 'progress_support' => $progressSupport ? 'enabled' : 'disabled')); try { $s3 = new S3_Client(trim($args['as3_access_key']), trim(str_replace(' ', '+', $args['as3_secure_key'])), false, $endpoint); $s3->setExceptions(true); if ($progressSupport) { $progress = new MWP_Progress_Upload(filesize($args['backup_file']), 3, mwp_logger()); $s3->setProgressCallback($progress->getCallback()); } $s3->putObjectFile($args['backup_file'], $args['as3_bucket'], $args['as3_directory'] . '/' . basename($args['backup_file']), S3_Client::ACL_PRIVATE); } catch (Exception $e) { mwp_logger()->error('Upload to Amazon S3 failed', array('exception' => $e)); return array('error' => 'Failed to upload to Amazon S3 (' . $e->getMessage() . ').'); } mwp_logger()->info('Upload to Amazon S3 completed; average speed is {speed}/s', array('speed' => mwp_format_bytes($fileSize / (microtime(true) - $start)))); return true; }