بدون یادگیری داکر پروژه های خود را داکرایز کنید

اگر شما توسعه دهنده یکی از پلتفرم های Laravel, Symfony, Next, Nuxt, WordPress باشید برای مرحله Devops نیاز به یادگیری خیلی چیزها دارید که چطور بتونید پروژه خود را با کمک Docker راه اندازی کنید معمولا شاید در گوگل سرچ میزنید و یک نمونه آماده را پیدا میکنید و با کمی تغییر آن را اجرا میکنید و ممکن است انواع مشکلات امنیتی و خطاهای سطح دسترسی را هم داشته باشید و از طرفی هم گوشه ای از ذهنتان درگیر نگهداری آن باشد.

اما امروز من با یک ابزار جدید آشنا شدم که خیلی کار شما را در بخش داکر راحت میکند این ابزار میتواند برای شما در حالت های توسعه یا حالت عملیاتی به شکل کاملا بهینه و اصولی اجرا کنید. کافی است وارد سایت https://kool.dev شوید و دستور نصب آن را وارد کنید.

curl -fsSL https://kool.dev/install | bash

با اجرای این دستور ابزار kool برای شما نصب میشود و زین پس میتوانید زیرساخت و کدهای مربوط به داکر را برای انواع پروژه های خود به سرعت و دقت بالا اجرا کنید.

مثلا شما میخواهید پروژه لاراولی خود را داکرایز کنید البته یک نکته را هم بگم که خود لاراول یک پکیج برای داکر دارد که به laravel sail معرفی شده اما متاسفانه فقط برای وضعیت توسعه روی سیستم توسعه دهنده است و هیچ راهکاری را برای حالت production نمیدهد یعنی حتی ngnix را هم ندارد و کلیه تنظیمات بر اساس وضعیت تست و برنامه نویسی ساخته شده .

برای شروع البته باید قبلا این پست را خوانده باشید اگر در ایران و سرورهای ایران کار میکنید

$ kool create laravel my-project

سپس بعد از pull شدن میتوانید ساختار مورد نظر خود را مشابهه نمونه زیر کانفیگ کنید

در نهایت با وارد شدن به پروژه

cd my-project

مشاهده خواهید کرد که دو فایل docker-compose.yml و kool.yml به پروژه اضافه شده تا اینجا زیر ساخت ساخته شده و بعد باید تنظیمات .env پروژه را بر اساس داکر قرار دهید که به طور کامل در لینک زیر قابل دسترس است. البته داخل فایل kool.yml دستوراتی درج شده که در پایین توضیح دادم و شما میتوانید دستورات بیشتری را هم به آن اضافه کنید.

https://kool.dev/docs/presets/laravel#2-update-envexample

ضمنا kool به شما یکسری دستورات هم میده که دیگه نیاز به وارد شدن به shell container نداشته باشید چون وقتی شما اگر داکر استفاده میکنید مثل حالت عادی نمی تونید دستورات php artisan migrate را اجرا کنید حتما باید وارد container بشید و بعد اونجا واردش کنید اما با کمک kool دستورات به شکل زیر قابل استفاده هستند

kool run artisan migrate:fresh --seed

توضیحات بیشتر هم در ادامه لینک بالا قرار دارد اما دقیقا اینجاست

https://kool.dev/docs/presets/laravel#3-run-kool-run-setup

افزونه vs code برای کار با laravel

برای کار با لاراول در vs code باید یکسری از افزونه را به صورت تکی جستجو کنید و نصب کنید که امروز به افزونه ای آشنا شدم به عنوان Laravel Extension Pack که لیستی از افزونه های زیر را به صورت گروهی همراه خودش نصب میکند.

Laravel Blade Snippets
Laravel Snippets
Laravel Artisan
Laravel Extra Intellisense
Laravel goto view
laravel-jump-controller Laravel controller
laravel-goto-components
Laravel Blade formatter
Laravel Create View Create
Laravel Blade Wrapper
DotENV .env

ساخت پکیج لاراول به شکل حرفه ای

ساخت package ها در لاراول شیوه های متفاوتی دارند که به طور کلی میتوانند عملکرد توسعه و نگهداری را ساده کنند در واقع یکی از بهترین روش ها استفاده از متد spite است که پکیج spatie/package-skeleton-laravel را جهت استفاده رایگان عرضه کرده است .

برای شروع کافی است وارد لینک فوق شوید و مطابق تصویر زیر روی use this temple کلیک کنید

سپس بعد از اتمام پکیج خود را در سیستم خود clone کنید و دستور php ./configure.php رادر root پروژه اجرا کنید . در این مرحله با پرسیدن یکسری سوالات میتوانید کانفیگ پکیج و name space های پروژه را بر اساس نیاز خود تغییر دهید.

مطابق مراحلی که در تصویر فوق کار شده است پکیج ها در vendor webine و عنوان پکیج shopCourse ساخته شده است.

اجرا عملیات فقط یک بار در لاراول

همانطور که در لاراول میتوان migration ها را فقط یکبار اجرا کرد، ممکن است نیازی پیش آید که یک کلاس هم مانند ماگریشن یکبار اجرا شود .

مثلا چیزی مانند اجرای یک کلاس برای این منظور از پکیج laravel-one-time-operations استفاده میکنیم . این پکیج ساختاری را به ما میدهد که میتوانیم عملیات های مورد نظر را فقط یکبار در طول اجرای و نصب و راه اندازی پروژه فراخوانی و اجرا کنیم .


روش استفاده از دیزاین پترن singleton در لاراول

ابتدا در serivceProvider درون متد register به صورت زیر کلاس مورد نظر را تعریف میکنیم مزیت استفاده از singleton این است که فقط برای یکبار new میشود و هر جا میتوان از آن خیلی ساده استفاده کرد. این امر موجب بهینه سازی مصرف Ram و ارتقا سرعت نیز میگردد

    $this->app->singleton(Hasher::class, function () {
        return new Hasher();
    });

و سپس بدین شکل از آن استفاده میکنم

\Hasher::generate()

به طور مثال در کلاس Hasher

<?php

namespace Gallib\ShortUrl;

class Hasher
{
    /**
     * @var int
     */
    protected $length = 6;

    public function setLength(int $length): self
    {
        $this->length = $length;

        return $this;
    }

    /**
     * Generate a random hash.
     *
     * @return string
     */
    public function generate(): string
    {
        $characters = str_repeat('abcdefghijklmnoKLMNOPQRSTUVWXYZ0123456789', $this->length);

        return substr(str_shuffle($characters), 0, $this->length);
    }
}

سرور تست ایمیل با MailHog

برنامه نویسان برای اینکه از صحت کارکرد ارسال ایمیل مطمن شوند و طراحی قالب ایمیل ها را در محیط تست چک کنند نیاز به یک سرویس ایمیل می باشد که یکی از بهترین آنها MailHog است.

در این روش با کمک داکر میتوانید به صورت نامحدود ایمیل های تستی ارسال کنید و هیچ وابستگی به سایت و سرویس دهنده ای نخواهید داشت.

در ابتدا docker را نصب کنید . و سپس یک فایل با عنوان docker-compose.yml را ایجاد نمایید و دستور زیر را در وارد میکنیم

touch docker-compose.yml
version: "3.7"
services:

  # SMTP Server
  smtp:
    platform: linux/x86_64
    image: mailhog/mailhog
    container_name: docker-workspace-smtp
    logging:
      driver: 'none'
    ports:
      - "8003:1025"
      - "8100:8025"
    networks:
      - docker_workspace_network

networks:
  docker_workspace_network:
    driver: bridge

در نهایت با وارد کردن دستور

docker compose up -d

نصب انجام میشود جهت مشاهده mailHog وارد آدرس http://IP:8100 شوید

به جای IP باید IP ماشین مجازی را وارد کنید که با دستور ip a در ابونتو قابل دریافت است

در لاراول فایل .env را به مقادیر زیر تغییر دهید و در سایر سرویس ها مقادیر را معادل نمونه زیر در نظر بگیرید

MAIL_MAILER=smtp
MAIL_HOST=IPaddress
MAIL_PORT=8003
MAIL_USERNAME=''
MAIL_PASSWORD=''
MAIL_ENCRYPTION=null

Eager Loading چطور در لاراول استفاده کنیم

به صورت معمولی اگر شما یک رابطه در مدل Flat داشته باشید که به جدول دیگر رابطه یک به یک داشته باشید hasOne به شکل زیر میتوان از ان استفاده کرد

$cars = App\Flat::all();
 
    foreach ($flats as $flat) {
      echo $flat->owner->name;
    }

در روش فوق به ازای هر لوپ یکبار به جدول owner ارجاع میکند یعنی اگر ۱۰۰ تا رکورد باشد ۱۰۰ بار لوپ اجرا میشود و ۱۰۱ بار به دیتابیس کانکت میشوید تا مقادیر رابطه hasOne در sql اجرا میشود .

روش بهتر استفاده از eager loading است

$flats = App\Flat::with('owner')->get();
 
    foreach ($flats as $flat) {
      echo $flat->owner->name;
    }

در روش فوق به نوعی به جدول owner join زده شده و در هر لوپ از مقادیری که در select اول داشته ایم استفاده میشود در واقع ۱۰۰ بار لوپ اجرا میشود و یکبار هم به دیتابیس متصل میشود.

نحوه نوشتن From اول از یک Subquery در لاراول

سلام گاهی اوقات لازم است که query sql مشابه زیر داشته باشیم

select * from (select * from `shop_stores` where `shop_stores`.`deleted_at` is null) as `shop_stores` where `shop_stores`.`deleted_at` is null;

برای این منظور میتوانیم از متد subFrom در query builder لاراول استفاده کنیم.

        $firstQuery = stores::query();
        $secondQuery = stores::query();

        $secondQuery->fromSub($firstQuery,'shop_stores',function ($join){
            $join->on('shop_stores.id','=','latest_posts.id');
        });

        $secondQuery->dd();

نحوه ایجاد استرس تست و benchmark از پروژه

یکی از بهترین ابزارها https://github.com/wg/wrk است که با دستور هایی میتواند به صورت همزمان میزان پاسخگویی به کاربران همزمان اپلکیشن شما را انجام دهد

لازم است که حتما در local این تست را بر اساس سخت افزاری که دارید انجام دهید

sudo apt-get install build-essential libssl-dev git -y 
git clone --depth 1 https://github.com/wg/wrk.git wrk
cd wrk 
sudo make 
# move the executable to somewhere in your PATH, ex: 
sudo cp wrk /usr/local/bin 

به طور مثال ۳۰ ثانیه در ۱۲ نخ و ۴۰۰ اتصال همزان با دستور زیر از ادرس زیر به اینصورت است

wrk -t12 -c400 -d30s http://127.0.0.1:8080/index.html

در واقع در تست زیر هرچه میزان درخواست بر ثانیه بیشتر باشد بهتر است

خطای هنگام نصب پکیج local در composer

در صورتی که در نصب پکیج محلی خطای  in the lock file but not in remote repositories, make sure you avoid updating this package to keep the one from the lock file  را داشتید به دلیل عدم وجود فایل composer.json در root هر پکیج است مثلا باید در پروژه پکیچ های محلی در مسیر زیر باشد

packages/namevednor/base

درون base حتما باید composer.json باشد

همچنین دقت کنید که در composer.json اصلی که در root قرار دارد باید مسیر دهی به شکل زیر باشد

repositories": { "namevednor/base": { "type": "path", "url": "packages/namevednor/base" } }

require": {
"namevednor/site": "dev-master"
}

 

 

 

بهینه سازی vendor در پروژه لاراول

جهت اجرای بهینه سازی vendor در لاراول لازم است که دستوراتی را اجرا کنید که تنها وابستگی های که در فایل composer s با اجرای دستور زیر تنها پکیج های الزامی نصب میشوند و پکیج هایی که در بخش توسعه لازم بود حذف میگردند با این روش میتوانید حجم پوشه vendor را تا ۵۰ درصد کاهش دهید

composer update --no-interaction --prefer-dist --optimize-autoloader --no-dev

نحوه تغییر طراحی صفحه خطاهای لاراول

لاراول به صورت پیش فرض یک طراحی پیش فرض دارد مانند تصویر زیر و شامل 404 و 401 و 500

با اجرای دستور php artisan vendor:publish –tag=laravel-errors فایل ها و طراحی ها در پوشه resources/views/errors اضافه میشوند و با تغییر minimal.blade.php میتوان گرافیک مورد نظر هر پروژه را اجرا کنید