PHP Classes

File: src/S3Wrapper.php

Recommend this page to a friend!
  Classes of Joseluis Laso   PHP AWS S3 SDK Wrapper   src/S3Wrapper.php   Download  
File: src/S3Wrapper.php
Role: Class source
Content type: text/plain
Description: Class source
Class: PHP AWS S3 SDK Wrapper
Retrieve and cache AWS S3 files using the SDK
Author: By
Last change: sanitizing code and documentation
Date: 8 years ago
Size: 4,438 bytes
 

Contents

Class file image Download
<?php

namespace JLaso\S3Wrapper;

class
S3Wrapper
{
   
/** @var string */
   
protected $bucket;
   
/** @var \Aws\S3\S3Client */
   
protected $s3Client = null;
   
/** @var string */
   
protected $lastRemoteFile = "";
   
/** @var S3Wrapper */
   
protected static $instance = null;

   
/**
     * @param string $accessKeyId
     * @param string $secretAccessKey
     * @param string $bucket
     */
   
function __construct($accessKeyId, $secretAccessKey, $bucket)
    {
       
$this->bucket = $bucket;

       
$this->s3Client = \Aws\S3\S3Client::factory(array(
           
'key' => $accessKeyId,
           
'secret' => $secretAccessKey,
           
'signature' => 'v4',
           
'region' => 'eu-central-1',
        ));

       
self::$instance = $this;
    }

   
/**
     * @return S3Wrapper
     * @throws \Exception
     */
   
public static function getInstance()
    {
        if (!
self::$instance) {
            if (!
file_exists(__DIR__.'/config.ini')){
                throw new \
Exception("Unable to create S3Wrapper instance without config.ini file. Please copy config.ini.sample to config.ini and fill in your AWS S3 access data");
            }
           
$config = parse_ini_file(__DIR__.'/config.ini', true);
           
$config = $config["s3"];
            new
S3Wrapper($config["access_key_id"], $config["secret_access_key"], $config["bucket"]);
        }

        return
self::$instance;
    }

   
/**
     * @param string $localFile
     * @param string $remoteFile
     * @param int $perm
     * @return string
     */
   
function getFileIfNewest($localFile, $remoteFile, $perm = 0777)
    {
       
$this->lastRemoteFile = $remoteFile;
       
$download = false;
        if (!
file_exists($localFile)) {
           
$download = true;
        } else {
           
$iterator = $this->s3Client->getIterator('ListObjects', array(
               
'Bucket' => $this->bucket,
               
'Prefix' => $remoteFile,
               
'Delimiter' => '/',
            ));

            foreach (
$iterator as $object) {
               
$remoteDate = date("U", strtotime($object['LastModified']));
               
$localDate = filemtime($localFile);

                if (
$remoteDate > $localDate) {
                   
$download = true;
                }
                break;
            }
        }

        if (
$download) {
            try {
               
$result = $this->s3Client->getObject(array(
                   
'Bucket' => $this->bucket,
                   
'Key' => $remoteFile,
                ));
            } catch (\
Exception $e) {
               
error_log("Error recovering $remoteFile from S3: ".$e->getMessage());
                return
null;
            }

           
file_put_contents($localFile, $result['Body']);
           
chmod($localFile, $perm);
           
touch($localFile, strtotime($result['LastModified']));
        }

        return
$localFile;
    }

   
/**
     * @param string $remoteFile
     * @param string $content
     */
   
function saveFile($remoteFile, $content)
    {
       
$this->lastRemoteFile = $remoteFile;
       
$this->s3Client->upload($this->bucket, $remoteFile, $content);
    }

   
/**
     * @return string
     */
   
public function getLastRemoteFile()
    {
        return
$this->lastRemoteFile;
    }

   
/**
     * @param string $path
     * @return array
     */
   
public function getFilesList($path = "")
    {
       
$files = array();
       
$options = array(
           
'Bucket' => $this->bucket,
        );
        if (
$path){
           
$options['Prefix'] = $path;
           
$options['Delimiter'] = '/';
        }
       
$iterator = $this->s3Client->getIterator('ListObjects', $options);

        foreach (
$iterator as $object) {

           
$files[] = array(
               
'timestamp' => date("U", strtotime($object['LastModified'])),
               
'filename' => $object['Key'],
            );
        }

        return
$files;
    }

   
/**
     * @return mixed
     */
   
public function listBuckets()
    {
       
$buckets = $this->s3Client->listBuckets();

        return
$buckets["Buckets"];
    }

   
/**
     * @param string $localFile
     * @param string $remoteFile
     */
   
public function deleteFile($localFile, $remoteFile)
    {
        @
unlink($localFile);

       
$this->s3Client->deleteObject(array(
           
'Bucket' => $this->bucket,
           
'Key' => $remoteFile,
        ));
    }

}