
پلتفرم Laravel
(Laravel Platform)🎯 توضیحات و نکات تکمیلی
فهرست عناوین:
- انتخاب نسخهی PHP
- تنظیمات اختصاصی php.ini
- فایلهای CSS و JS به صورت خودکار build میشوند
- استقرار برنامههای Lumen
- کار با Queue ها
- لینککردن پوشهی storage به پوشهی public
- راهاندازی Laravel octane
- رفع خطای CORS
- تنظیم هدرهای امنیتی HTTP
- بهینه کردن لاراول برای استقرار
- تنظیمات TrustedProxies (برای مشاهده IP واقعی کاربران)
- مدیریت لاگها در Laravel
- فعالسازی Gzip و Caching
- نحوهی استفاده از ماژول FFmpeg
- استفاده از پکیجهای Ignition و Faker
- نحوهی استفاده از Ziggy
- تنظیم منطقهی زمانی (TimeZone)
- لیست اکستنشنهای نصب شده
انتخاب نسخهی 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
بعد از اضافه کردن این فایل، در استقرار بعدی برنامه شما با این تنظیمات شروع به کار خواهد کرد.
فایلهای 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
رفع خطای 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>
بهینه کردن لاراول برای استقرار
Laravel برای دیپلوی در محیطهای production با اجرای چند دستور ساده میتواند عملکرد بهتری داشته باشد. دستور اولphp artisan config:cache است که وظیفه کش کردن کانفیگفایلها را به عهده دارد و دستور دوم php artisan route:cache است که وظیفه کش کردن فایلهای route را به عهده دارد. برای این که این دستورات به صورت خودکار توسط لیارا در هر استقرار اجرا شود کافیست که در فایل liara.json این فیلدها را اضافه کنیم:
{
"platform": "laravel",
"app": "laravel-starter",
"laravel": {
"configCache": true,
"routeCache": true
}
}
تنظیمات 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_ALL;
}
مدیریت لاگها در Laravel
لاگها وظیفه دارند اتفاقات رخ داده در نرمافزار مثل error ها یا exception ها و حتی اطلاعاتی که خود برنامهنویس به دلخواه خود در بخشهای مختلف نرمافزار درنظرگرفته را، ثبت کنند. Laravel روشهای مختلفی برای لاگ کردن دارد که اصطلاحا به آنها Channel Drivers میگوید. برای آشنایی بیشتر به مستندات لاراول دربارهی Logs مراجعه کنید.
برای نمونه اگر قصد دارید Log ها را روی Console بریزید، تا در پنل لاگهای داشبورد لیارا قابل مشاهده باشد میتوانید از درایورerrorlogاستفاده کنید. اگر قصد دارید Log ها را داخل یک فایل نگهدارید از درایور single استفاده کنید. اگر قصد دارید Log ها را بر اساس روز در فایلهای مجزایی نگهداری کنید تا حجم هر فایل برای بررسی زیاد نشود میتوانید از درایور daily استفاده کنید. تصمیم نحوه نگهداری Log ها با شماست و در صورتی که قصد تغییر آن را دارید به راحتی از طریق بخش تنظیمات برنامه میتوانید نام درایور موردنظر خودتون رو به env ها اضافه کنید:
LOG_CHANNEL=daily
یا
LOG_CHANNEL=errorlog
فعالسازی 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'),
]);
شما میتوانید برای کسب اطلاعات بیشتر، مستندات این پکیج را مطالعه کنید.
استفاده از پکیجهای Ignition و Faker
شما برای استفاده از پکیجهای Ignition و Faker در لیارا باید ابتدا این پکیجها را از بخش require-dev فایل composer.json به بخش require انتقال دهید:
"require": {
...
"facade/ignition": "^2.5",
"fakerphp/faker": "^1.9.1",
},
سپس برای اعمال این تغییرات، دستور زیر را در لوکال خود اجرا کنید:
composer update
حال با اجرای دستور liara deploy، فرایند استقرار آغاز خواهد شد.
نحوهی استفاده از 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