php

پلتفرم PHP

(PHP Platform)

اتصال به ذخیره‌سازی ابری

بدون شک اتصال برنامه به یک ذخیره‌سازی ابری مطمئن برای نگهداری و ارائه فایل‌های استاتیک وب‌سایت یا داده‌های آپلود شده توسط کاربران، باعث اطمینان خاطر صاحبان کسب و کار و بهبود عملکرد برنامه‌ می‌شود.

فهرست عناوین:

در صورتی که تمایلی به خواندن آموزش متنی ندارید می‌توانید ویدیوی آموزشی زیر ‌را مشاهده کنید.

پروژه و کدهای مورد استفاده در ویدیوی فوق در اینجا قابل مشاهده و دسترسی هستند.

نصب AWS SDK

از آنجا که ذخیره‌سازی ابری لیارا یک سرویس Object storage سازگار با پروتکل S3 است، شما می‌توانید با استفاده از AWS SDK‌، در زبان‌ها و فریم‌ورک‌های مختلفی این فضای ذخیره‌سازی را مدیریت کنید. حال برای اتصال به ذخیره‌سازی ابری در PHP باید با اجرای دستور زیر، پکیج aws-sdk را نصب کنید.

composer require aws/aws-sdk-php

تنظیم کلیدها

در مرحله‌ی بعد، به‌منظور امنیت و کنترل راحت‌تر مقادیر باید مشخصات فضای ذخیره‌سازی ابری اعم از کلیدها و آدرس اتصال به این سرویس را در بخش متغیرهای برنامه تنظیم کنید.

LIARA_ENDPOINT=https://<Liara Bucket Endpoint>
LIARA_BUCKET_NAME=<Bucket Name>
LIARA_ACCESS_KEY=<Access Key>
LIARA_SECRET_KEY=<Secret Key>

همچنین اگر باکت شما خصوصی باشد، برای دسترسی به باکت، نیاز به کلید دسترسی دارید. برای ساخت کلید، به صفحه ذخیره‌سازی ابری بروید و طبق عکس‌ها کلید خود را بسازید.

به قسمت کلیدها رفته:

یک کلید جدید بسازید.

کلید های ساخته شده را کپی کنید. توجه داشته باشید که SECRET_KEY تنها یک بار نمایش داده می‌شود و پس از آن باید کلید را درجایی مطمئن ذخیره کنید.

دریافت لیست باکت‌ها توسط AWS SDK

نمونه کد برای دریافت لیست باکت‌های ایجاد شده:

<?php
// Require the Composer autoloader.
require 'vendor/autoload.php';

use Aws\S3\S3Client;

// Instantiate an S3 client.
$client = new S3Client([
    'region' => 'us-east-1',
    'version' => '2006-03-01',
    'endpoint' => LIARA_ENDPOINT,
    'credentials' => [
        'key' => LIARA_ACCESS_KEY,
        'secret' => LIARA_SECRET_KEY
    ],
]);

$result = $client->listBuckets([/* ... */]);
$promise = $client->listBucketsAsync([/* ... */]);

print_r($result);
print_r($promise);

آپلود فایل توسط AWS SDK

نمونه کد برای آپلود فایل در باکت‌های ایجاد شده:

<?php

namespace AppController;

class DotEnvEnvironment
{
   public function load($path): void
   {
       $lines = file($path . '/.env');
       foreach ($lines as $line) {
           [$key, $value] = explode('=', $line, 2);
           $key = trim($key);
           $value = trim($value);

           putenv(sprintf('%s=%s', $key, $value));
           $_ENV[$key] = $value;
           $_SERVER[$key] = $value;
       }
   }
}

require 'vendor/autoload.php';
use AwsS3S3Client;
use AwsExceptionAwsException;

(new DotEnvEnvironment)->load(__DIR__);

// Setting Env Variables 
$accessKey  = getenv("LIARA_ACCESS_KEY");
$secretKey  = getenv("LIARA_SECRET_KEY");
$endpoint   = getenv("LIARA_ENDPOINT");
$bucketName = getenv("LIARA_BUCKET_NAME");

// making connection using s3
$s3 = new S3Client([
    'version' => 'latest',
    'region'  => 'us-east-1',
    'endpoint' => $endpoint,
    'credentials' => [
        'key'    => $accessKey,
        'secret' => $secretKey,
    ],
]);

try {
    // name of the file:
    $fileName = 'liara-poster.png';

    // uploading file to the bucket:
    $result = $s3->putObject([
        'Bucket' => $bucketName,
        'Key'    => $fileName,
        'Body'   => file_get_contents($fileName),
        'ACL'    => 'public-read',
    ]);

    echo "File uploaded successfully.
";
} catch (AwsException $e) {
    echo $e->getMessage() . "
";
}

حذف فایل توسط AWS SDK

نمونه کد برای حذف فایل در باکت‌های ایجاد شده:

<?php

namespace AppController;

class DotEnvEnvironment
{
   public function load($path): void
   {
       $lines = file($path . '/.env');
       foreach ($lines as $line) {
           [$key, $value] = explode('=', $line, 2);
           $key = trim($key);
           $value = trim($value);

           putenv(sprintf('%s=%s', $key, $value));
           $_ENV[$key] = $value;
           $_SERVER[$key] = $value;
       }
   }
}

require 'vendor/autoload.php';
use AwsS3S3Client;
use AwsExceptionAwsException;

(new DotEnvEnvironment)->load(__DIR__);

// Setting Env Variables 
$accessKey  = getenv("LIARA_ACCESS_KEY");
$secretKey  = getenv("LIARA_SECRET_KEY");
$endpoint   = getenv("LIARA_ENDPOINT");
$bucketName = getenv("LIARA_BUCKET_NAME");

// making connection using s3
$s3 = new S3Client([
    'version' => 'latest',
    'region'  => 'us-east-1',
    'endpoint' => $endpoint,
    'credentials' => [
        'key'    => $accessKey,
        'secret' => $secretKey,
    ],
]);

try {
    // name of the file:
    $fileNameToDelete = 'example.txt';

    // deleting the file:
    $result = $s3->deleteObject([
        'Bucket' => $bucketName,
        'Key'    => $fileNameToDelete,
    ]);

    echo "File '$fileNameToDelete' deleted successfully.
";
} catch (AwsException $e) {
    echo $e->getMessage() . "
";
}

دانلود فایل توسط AWS SDK

نمونه کد برای دانلود فایل در باکت‌های ایجاد شده:

<?php

namespace AppController;

class DotEnvEnvironment
{
   public function load($path): void
   {
       $lines = file($path . '/.env');
       foreach ($lines as $line) {
           [$key, $value] = explode('=', $line, 2);
           $key = trim($key);
           $value = trim($value);

           putenv(sprintf('%s=%s', $key, $value));
           $_ENV[$key] = $value;
           $_SERVER[$key] = $value;
       }
   }
}

require 'vendor/autoload.php';
use AwsS3S3Client;
use AwsExceptionAwsException;

(new DotEnvEnvironment)->load(__DIR__);

// Setting Env Variables 
$accessKey  = getenv("LIARA_ACCESS_KEY");
$secretKey  = getenv("LIARA_SECRET_KEY");
$endpoint   = getenv("LIARA_ENDPOINT");
$bucketName = getenv("LIARA_BUCKET_NAME");

// making connection using s3
$s3 = new S3Client([
    'version' => 'latest',
    'region'  => 'us-east-1',
    'endpoint' => $endpoint,
    'credentials' => [
        'key'    => $accessKey,
        'secret' => $secretKey,
    ],
]);

try {
    // نام فایل مورد نظر برای دانلود
    $fileName = 'example.txt';

    // مسیر برای ذخیره فایل در دایرکتوری downloads
    $downloadPath = __DIR__ . '/downloads/' . $fileName;

    // دانلود فایل از سبد
    $result = $s3->getObject([
        'Bucket' => $bucketName,
        'Key'    => $fileName,
        'SaveAs' => $downloadPath,
    ]);

    echo "File '$fileName' downloaded successfully.
";
} catch (AwsException $e) {
    echo $e->getMessage() . "
";
}

نمونه کد برای دریافت لینک موقت یک‌ساعته فایل‌ها در باکت‌های ایجاد شده:

<?php

namespace AppController;

class DotEnvEnvironment
{
   public function load($path): void
   {
       $lines = file($path . '/.env');
       foreach ($lines as $line) {
           [$key, $value] = explode('=', $line, 2);
           $key = trim($key);
           $value = trim($value);

           putenv(sprintf('%s=%s', $key, $value));
           $_ENV[$key] = $value;
           $_SERVER[$key] = $value;
       }
   }
}

require 'vendor/autoload.php';
use AwsS3S3Client;
use AwsExceptionAwsException;

(new DotEnvEnvironment)->load(__DIR__);

// Setting Env Variables 
$accessKey  = getenv("LIARA_ACCESS_KEY");
$secretKey  = getenv("LIARA_SECRET_KEY");
$endpoint   = getenv("LIARA_ENDPOINT");
$bucketName = getenv("LIARA_BUCKET_NAME");

// making connection using s3
$s3 = new S3Client([
    'version' => 'latest',
    'region'  => 'us-east-1',
    'endpoint' => $endpoint,
    'credentials' => [
        'key'    => $accessKey,
        'secret' => $secretKey,
    ],
]);

try {
    // لیست کردن فایل‌های درون سبد
    $result = $s3->listObjectsV2([
        'Bucket' => $bucketName
    ]);

    // چک کردن آیا فایلی وجود دارد یا خیر
    if (!empty($result['Contents'])) {
        foreach ($result['Contents'] as $object) {
            $objectKey = $object['Key'];
            $command = $s3->getCommand('GetObject', [
                'Bucket' => $bucketName,
                'Key' => $objectKey
            ]);

            $request = $s3->createPresignedRequest($command, '+1 hour');

            // دریافت لینک موقت
            $presignedUrl = (string)$request->getUri();
            echo "Presigned URL for '$objectKey':
$presignedUrl

";
        }
    } else {
        echo "The bucket is empty.
";
    }
} catch (AwsException $e) {
    echo $e->getMessage() . "
";
}

شما می‌توانید برای کسب اطلاعات بیشتر، مثال‌ها و مستندات این پکیج را مطالعه کنید.


متوجه شدم، برو گام بعدی!
;