laravel

پلتفرم Laravel

(Laravel Platform)

🎯 توضیحات و نکات تکمیلی

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

انتخاب نسخه‌ی PHP

به‌صورت پیش‌فرض، برنامه‌ی شما در نسخه‌ی PHP 7.4 اجرا می‌شود. در صورتی که قصد دارید نسخه دیگری را برای اجرای برنامه‌ی‌تان استفاده کنید می‌توانید داخل فایل liara.json بخش زیر را اضافه کنید: (فایل زیر برای یک برنامه تستی در نظر گرفته شده است.)

{
  "platform": "laravel",
  "app": "laravel-starter",
  "laravel": {
    "phpVersion": "8.2"
  }
}

در حال حاضر، از نسخه‌های زیر پشتیبانی می‌کنیم:

  • 7.2
  • 7.3
  • 7.4 (پیش‌فرض)
  • 8.0
  • 8.1
  • 8.2

تنظیمات اختصاصی php.ini

از طریق ایجاد یک فایل با نامliara_php.iniداخل ریشه‌ی برنامه‌ی‌تان می‌توانید تنظیمات PHP را شخصی‌سازی کنید. برای مثال، ممکن است بخواهید که حداکثر حجم مجاز برای آپلود فایل در سایت لاراولی‌تان را شخصی‌سازی کنید. پس لازم است که فایلliara_php.iniرا به برنامه‌ی‌تان اضافه کرده و محتویات آن را برابر تکه‌کد قرار دهید:

file_uploads = On
memory_limit = 128M
upload_max_filesize = 64M
post_max_size = 128M
max_execution_time = 600

بعد از اضافه کردن این فایل، در استقرار بعدی برنامه شما با این تنظیمات شروع به کار خواهد کرد.

وب‌سرور Apache ابتدا فایل‌های آپلودی را در پوشه‌ی/tmpذخیره می‌کند و سپس لاراول آن فایل را به storage خودش منتقل می‌کند. پوشه‌ی /tmpدر فایل‌سیستم هر برنامه، قابل نوشتن است و درواقع ReadOnly نیست، اما محدودیت ۱۰۰ مگابایتی دارد. این محدودیت به‌این معناست که اگر کاربران شما فایل‌های بزرگ‌تر از ۱۰۰ مگابایت را بخواهند آپلود کنند، با خطا مواجه خواهند شد. برای رفع این محدودیت، می‌توانید از قابلیت دیسک‌ها استفاده کنید و دیسکی با اندازه‌ی دلخواه‌تان بسازید و به‌پوشه‌ی/tmpمتصل کنید.

فایل‌های CSS و JS به صورت خودکار build می‌شوند

همان‌طور که اطلاع دارید، در برنامه‌های لاراولی با اجرای دستورnpm run productionفایل‌های SASS به CSS تبدیل می‌شوند و همین‌طور کدهای جاوا اسکریپت ES6 به بالا به ES5 تبدیل شده و یک‌پارچه می‌شوند.
هر زمان که برنامه‌ی‌تان را روی لیارا مستقر می‌کنید، ما این دستور را برای‌تان اجرا می‌کنیم تا مطمئن شویم که فایل‌های CSS و JS شما به صورت صحیح در اختیار کاربران‌تان قرار گیرند.

اما اگر از Laravel فقط برای ساخت یک API استفاده کرده‌اید و یا به طور کلی نیازی به این ندارید که لیارا پکیج‌های npm را برای‌تان نصب و فایل‌های CSS و JavaScript تان را build کند، می‌توانید در فایل liara.json برنامه، یک فیلد با نام laravel و داخل آن یک فیلد با نامbuildAssetsبسازید و این قابلیت را غیر فعال کنید.

{
  "laravel": {
    "buildAssets": false
  }
}

با این تغییر، هر بار که دیپلوی کنید، لیارا از اجرای دستورات npm خودداری می‌کند.

استقرار برنامه‌های Lumen

به‌منظور استقرار پروژه‌های توسعه داده شده با فریم‌ورک Lumen در برنامه‌های Laravel لیارا تنها کافیست که ابزار Liara CLI را با اجرای دستور زیر به آخرین نسخه به‌روزرسانی کرده:

npm i -g @liara/cli

و درنهایت دستور liara deploy را در مسیر اصلی پروژه اجرا کنید.

کار با Queue ها

یکی از امکانات مهم Laravel، قابلیت تعریف صف (Queue) است. در پلتفرم لاراول، Supervisor نصب شده و شما با ایجاد یک فایل به نام supervisor.conf در ریشه‌ی برنامه‌، می‌توانید تنظیمات صف‌های مختلف‌تان را در آن وارد کنید. و در نهایت با یک‌بار دیپلوی‌کردن، صف‌های شما شروع به کار خواهند کرد.

Supervisor برنامه‌ی بسیار مفیدی است که سعی می‌کند صف‌های شما را همیشه در حال اجرا نگه‌دارد. اگر به هر دلیلی صف‌های‌تان به خطا بخورند و خاموش شوند، Supervisor آن‌ها را دوباره ایجاد و فعال می‌کند.

از بخش خط فرمان (کنسول) برنامه‌ی‌تان هم می‌توانید با supervisorctl کار کنید و وضعیت صف‌های‌تان را مشاهده کنید.

$ supervisorctl status

یک نمونه کانفیگ ساده برای یک صف با نام sms که وظیفه‌ی ارسال پیامک به کاربران را به عهده دارد:

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/html/artisan queue:work
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
numprocs=1
user=www-data
redirect_stderr=true
stdout_logfile=/tmp/laravel-worker.log

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

لینک‌کردن پوشه‌ی storage به پوشه‌ی public

برای دسترسی به فایل‌های پوشه‌هایstorage، طبق مستندات لاراول باید این پوشه به پوشه‌ی public لینک شود. لیارا به‌صورت خودکار، در زمان استقرار، دستورphp artisan storage:linkرا اجرا می‌کند و نیازی نیست که اقدام خاصی انجام دهید.

راه‌اندازی Laravel octane

برای راه‌اندازی Laravel octane با سرور Swoole باید یک فایل با نام liara.json در مسیر اصلی پروژه‌ی خود ایجاد کرده و فیلد args را به‌شکل زیر در این فایل اضافه کنید:

{
  "args": [ "php artisan octane:start --server=swoole --host=0.0.0.0 --port=80" ]
}

درنهایت با اجرای دستور زیر در خط فرمان برنامه‌ی خود می‌توانید وضعیت Laravel octane را بررسی کنید:

php artisan octane:status

فعال‌سازی SSR با استفاده از Inertia در Laravel

اگر که در برنامه خود از کتابخانه Inertia.JS استفاده می‌کنید و قصد دارید که از قابلیت SSR در برنامه لاراول خود بهره ببرید، کافیست که فایل liara.json را در مسیر اصلی پروژه ایجاد کنید و یا اگر از قبل ایجاد کرده‌اید، فقط قطعه کد زیر را به آن اضافه کنید:

{
  "laravel": {
    "ssr": true
  }
}

همچنین، می‌توانید ویدیوی آموزشی زیر را مشاهده کنید:

رفع خطای CORS

برای رفع خطای CORS در برنامه‌های Laravel، دو راه حل مختلف پیش روی شما قرار دارد. در راه حل اول می‌توانید پکیج laravel-cors را با اجرای دستور زیر در پروژه‌ی خود نصب کرده و طبق مستندات، CORS را در پروژه‌ی خود فعال کنید.

composer require fruitcake/laravel-cors

در راه حل دوم می‌توانید تنظیمات مربوط به CORS را در فایل public/.htaccess پروژه‌ی خود اضافه کنید:

Header set Access-Control-Allow-Origin "*"

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # Send Requests To Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

تنظیم هدرهای امنیتی HTTP

برای جلوگیری از حملاتی مانند Clickjacking، XSS، SSL Striping می‌توانید هدرهای امنیتی را مانند مثال زیر در فایل public/.htaccessتنظیم کرده و نحوه‌ی برقراری ارتباط با سایت را برای مرورگرها تعیین کنید:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    Header always set X-Frame-Options "DENY"
    Header always set X-Content-Type-Options "nosniff"
    Header always set X-XSS-Protection "1; mode=block"
    Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"

    RewriteEngine On

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # Send Requests To Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>
توجه داشته باشید که قبل از فعال‌سازی HSTS با تنظیم هدر Strict-Transport-Security باید SSL را فعال کرده باشید. تهیه‌ی SSL رایگان

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

Laravel برای دیپلوی در محیط‌های production با اجرای چند دستور ساده می‌تواند عملکرد بهتری داشته باشد. دستور اولphp artisan config:cache است که وظیفه کش کردن کانفیگ‌فایل‌ها را به عهده دارد و دستور دوم php artisan route:cache است که وظیفه کش کردن فایل‌های route را به عهده دارد. برای این که این دستورات به صورت خودکار توسط لیارا در هر استقرار اجرا شود کافیست که در فایل liara.json این فیلد‌ها را اضافه کنیم:

{
  "platform": "laravel",
  "app": "laravel-starter",
  "laravel": {
    "configCache": true,
    "routeCache": true
  }
}
می‌توانید هر فیلد را که خواستید استفاده کنید، مثلا فقط از "configCache": true استفاده کنید و فیلد دیگر را قرار ندهید.
توجه داشته باشید که طبق مستندات لاراول، استفاده از دستور php artisan route:cache تنها زمانی امکان‌پذیر است که شما از Closure ها برای تعریف route ها استفاده نکرده باشید و فقط از Controller استفاده کرده باشید.

تنظیمات TrustedProxies (برای مشاهده IP واقعی کاربران)

تمامی درخواست‌ها به سمت برنامه‌ی شما توسط Reverse proxy های لیارا هدایت می‌شوند. برای این که در برنامه‌ی‌تان بتوانید به آی‌پی واقعی کاربر دسترسی داشته باشید و یا این که از قابلیت Signed URL های Laravel استفاده کنید، لازم است که تغییراتی را در فایلapp/Http/Middleware/TrustProxies.phpاعمال کنید.

در این فایل، یک متغیر با نام$proxiesوجود دارد. فقط کافیست که مقدار آن را به*تغییر دهید.

<?php
namespace App\Http\Middleware;
use Illuminate\Http\Request;
use Fideloper\Proxy\TrustProxies as Middleware;
class TrustProxies extends Middleware
{
    /**
     * The trusted proxies for this application.
     *
     * @var array|string
     */
    protected $proxies = '*';
    /**
     * The headers that should be used to detect proxies.
     *
     * @var int
     */
    protected $headers =
      Request::HEADER_X_FORWARDED_FOR |
      Request::HEADER_X_FORWARDED_HOST |
      Request::HEADER_X_FORWARDED_PORT |
      Request::HEADER_X_FORWARDED_PROTO |
      Request::HEADER_X_FORWARDED_AWS_ELB;
}
اگر از فریم‌ورک Livewire در برنامه‌ی لاراولی خود استفاده می‌کنید، باید حتما تنظیمات مرتبط با TrustedProxies را انجام بدهید.

مدیریت لاگ‌ها در Laravel

لاگ‌ها وظیفه دارند اتفاقات رخ داده در نرم‌افزار مثل error ها یا exception ها و حتی اطلاعاتی که خود برنامه‌نویس به دلخواه خود در بخش‌های مختلف نرم‌افزار درنظرگرفته را، ثبت کنند. Laravel روش‌های مختلفی برای لاگ‌ کردن دارد که اصطلاحا به آن‌ها Channel Drivers میگوید. برای آشنایی بیشتر به مستندات لاراول درباره‌ی Logs مراجعه کنید.

برای نمونه اگر قصد دارید Log ها را روی Console بریزید، تا در پنل لاگ‌های داشبورد لیارا قابل مشاهده باشد می‌توانید از درایورerrorlogاستفاده کنید. اگر قصد دارید Log ها را داخل یک فایل نگه‌دارید از درایور single استفاده کنید. اگر قصد دارید Log ها را بر اساس روز در فایل‌های مجزایی نگه‌داری کنید تا حجم هر فایل برای بررسی زیاد نشود می‌توانید از درایور daily استفاده کنید. تصمیم نحوه‌ نگه‌داری Log ها با شماست و در صورتی که قصد تغییر آن را دارید به راحتی از طریق بخش تنظیمات برنامه می‌توانید نام درایور موردنظر خودتون رو به env ها اضافه کنید:

LOG_CHANNEL=daily

یا

LOG_CHANNEL=errorlog
Laravel قابلیت خوبی برای استفاده همزمان از چند درایور دارد. اگر شما از درایور stack اسفتاده کنید می‌توانید همزمان Log ها را به چند درایور ارسال کنید. مثلا هم داخل فایل نگه‌داری شود و هم به Console ریخته شود تا در پنل لیارا قابل مشاهده باشد. درباره این درایور در مستندات Laravel بیشتر بخوانید.
برنامه‌های Laravel ای در لیارا به صورت پیشفرض با درایور errorlog مستقر می‌شوند.
در برنامه تستی آموزش راه‌اندازی Laravel در لیارا، از درایور stack برای لاگ همزمان داخل فایل و کنسول استفاده شده است. می‌توانید کد‌های آن ‌را برای بررسی بیشتر مطالعه کنید.

فعال‌سازی Gzip و Caching

برای فعال‌سازی Gzip و Caching در برنامه‌های Laravel باید تنظیمات مربوطه را در فایل public/.htaccess برنامه وارد کنید:

 # Enable Gzip
<IfModule mod_deflate.c>
 AddOutputFilterByType DEFLATE text/plain
 AddOutputFilterByType DEFLATE text/html
 AddOutputFilterByType DEFLATE text/xml
 AddOutputFilterByType DEFLATE text/css
 AddOutputFilterByType DEFLATE text/javascript
 AddOutputFilterByType DEFLATE application/xml
 AddOutputFilterByType DEFLATE application/xhtml+xml
 AddOutputFilterByType DEFLATE application/rss+xml
 AddOutputFilterByType DEFLATE application/atom_xml
 AddOutputFilterByType DEFLATE application/javascript
 AddOutputFilterByType DEFLATE application/x-javascript
 AddOutputFilterByType DEFLATE application/x-shockwave-flash
</IfModule>

# Enable Caching
<IfModule mod_expires.c>
 ExpiresActive On
 ExpiresByType text/css "access plus 1 month"
 ExpiresByType text/javascript "access plus 1 month"
 ExpiresByType text/html "access plus 1 month"
 ExpiresByType application/javascript "access plus 1 month"
 ExpiresByType image/gif "access plus 1 month"
 ExpiresByType image/jpeg "access plus 1 month"
 ExpiresByType image/png "access plus 1 month"
 ExpiresByType image/x-icon "access plus 1 month"
</IfModule>
<ifmodule mod_headers.c>
 <filesmatch "\.(ico|jpe?g|png|gif|swf)$">
  Header set Cache-Control "max-age=2592000, public"
 </filesmatch>
 <filesmatch "\.(css)$">
  Header set Cache-Control "max-age=604800, public"
 </filesmatch>
 <filesmatch "\.(js)$">
  Header set Cache-Control "max-age=216000, private"
 </filesmatch>
</ifmodule>

در قدم بعد باید قطعه کد زیر را به فایل webpack.mix.js اضافه کنید:

if (mix.inProduction()) {
    mix.version();
}

درنهایت باید فایل‌های Asset را مانند مثال زیر در برنامه‌ی خود فراخوانی کنید:

<script src="{{ mix('js/app.js') }}"></script>

نحوه‌ی استفاده از ماژول FFmpeg

ماژول FFmpeg به‌صورت پیش‌فرض در برنامه‌های Laravel نصب است و همچنین متغیرهای محیطی FFMPEG_PATH و FFPROBE_PATH در این پلتفرم تنظیم شده‌اند. شما برای استفاده از این ماژول تنها کافیست پکیج php-ffmpeg را با اجرای دستور زیر نصب کنید:

composer require php-ffmpeg/php-ffmpeg

و به‌شکل زیر از این پکیج در پروژه‌ی خود استفاده کنید:

use FFMpeg;

$ffmpeg = FFMpeg::create([
            'ffmpeg.binaries' => env('FFMPEG_PATH', '/usr/bin/ffmpeg'),
            'ffprobe.binaries' => env('FFPROBE_PATH', '/usr/bin/ffprobe'),
        ]);

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

نصب پکیج‌های Dev

شما برای نصب پکیج‌هایی که در بخشrequire-dev فایل composer.json قرار دارد (مانند Faker و Ignition)، باید تنظیمات زیر را در فایل liara.json قرار بدهید:

{
  "laravel": {
    "installDevDependencies": true
  }
}

نحوه‌ی استفاده از Ziggy

برای استفاده از Ziggy در لیارا تنها کافیست فایل مورد نظرتان را از مسیر vendor/tightenco/ziggy/dist در پوشه‌ی resources/js کپی کنید. برای مثال درصورتی که فایل vue.m را کپی کرده باشید می‌توانید به‌شکل زیر آن را در برنامه‌ی خود ایمپورت کنید:

import { ZiggyVue } from './vue.m';

تنظیم منطقه‌ی زمانی (TimeZone)

به صورت پیش‌فرض، منطقه‌ی زمانی بر روی Asia/Tehran تنظیم شده است. برای تغییر مقدار پیش‌فرض، می‌توانید از پارامترtimezoneدر فایل liara.json استفاده کنید. برای نمونه:

{
  "platform": "laravel",
  "app": "laravel-starter",
  "laravel": {
    "timezone": "America/Los_Angeles"
  }
}

لیست اکستنشن‌های نصب شده

در پلتفرم لاراول، اکستنشن‌های PHP زیر نصب شده‌اند:

[PHP Modules]
amqp
apcu
bcmath
bz2
calendar
Core
ctype
curl
date
dom
exif
fileinfo
filter
ftp
gd
gettext
gmp
gnupg
hash
iconv
igbinary
imagick
imap
intl
json
libxml
mbstring
memcached
mongodb
msgpack
mysqli
mysqlnd
openssl
pcntl
pcre
PDO
pdo_dblib
pdo_mysql
pdo_pgsql
pdo_sqlite
pgsql
Phar
posix
readline
redis
Reflection
session
shmop
SimpleXML
soap
sockets
sodium
SPL
sqlite3
standard
sysvmsg
sysvsem
sysvshm
tokenizer
xml
xmlreader
xmlwriter
xsl
yaml
Zend OPcache
zip
zlib

[Zend Modules]
Zend OPcache
;