ایجاد یک صف کار دستهای در لاراول با نشانگرهای فرآیند بیدرنگ با استفاده از Pusher

صف شکلی از ساختار داده پایه برای یک فرآیند برنامه است یا می توانیم آن را صف بنامیم. مفهومی که بیشتر در مورد Queue شنیده می شود FIFO (اول در اولین بیرون) است. ما میتوانیم این مفهوم FIFO را در زندگی روزمره ببینیم، به عنوان مثال، وقتی غذا را با استفاده از سیستم Drive thru Service میخریم، وسیله نقلیهای که اول میآید ابتدا سرویس میشود و سپس پس از خرید غذا ابتدا آن را ترک میکند.
اجرای صف ها در برنامه های کاربردی که ایجاد می کنیم چقدر اهمیت دارد؟ البته پاسخ بسیار مهم است. یک مثال ساده این است که وقتی یک فرآیند به روز رسانی داده را در یک پایگاه داده با حجم زیادی از داده اجرا می کنیم، البته مرورگر نمی تواند منتظر تکمیل فرآیند به روز رسانی باشد. معمولاً زمانی رخ می دهد که مرورگر هیچ پاسخی از سرور دریافت نمی کند، در حالی که از طرف دیگر سرور در واقع این فرآیند را انجام می دهد، اما به دلیل طولانی بودن فرآیند، مرورگر زمان انتظار را تمام شده فرض می کند. کم و بیش یک مثال ساده مانند آن.
بنابراین چگونه می توان مفهوم Queue را با استفاده از لاراول پیاده سازی کرد؟ در اینجا چندین مرحله وجود دارد که باید آماده شود تا بتوانیم مفهوم صف را در پروژه لاراول خود اعمال کنیم.
وضعیت
PHP 7.4 یا بالاتر
لاراول 8 یا بالاتر
صف لاراول
هل دهنده
جدول مهاجرت کار و دسته کار
در زیر مراحل تنظیم جدول jobs و job_batches آمده است
برای ایجاد جدول jobs دستور زیر را اجرا کنید:
php artisan queue:table
برای ایجاد جدول job_batches دستور زیر را اجرا کنید:
php artisan queue:batches-table
انتقال جدول را با استفاده از دستور زیر انجام دهید:
php artisan migrate
Package Realtime Job Batching را نصب کنید
برای نصب پکیج دستور زیر را اجرا کنید:
composer require yogameleniawan/realtime-job-batching
پیکربندی Pusher
مراحل زیر برای پیکربندی Pusher آمده است:
Pusher PHP SDK را نصب کنید
composer require pusher/pusher-php-server
ایجاد کانال های برنامه Pusher، اینجا را کلیک کنید
تنظیم فایل .env untuk Pusher Variable
PUSHER_APP_ID=your_pusher_app_id
PUSHER_APP_KEY=your_pusher_app_key
PUSHER_APP_SECRET=your_pusher_app_secret
PUSHER_HOST=
PUSHER_PORT=443
PUSHER_SCHEME=https
PUSHER_APP_CLUSTER=mt1
یک کلاس Repository ایجاد کنید
مراحل زیر برای ایجاد یک کلاس مخزن انجام می شود:
یک فایل نمونه ایجاد کنید: VerificationRepository.php
روی پوشه root_project/app/Repositories
برای محل پوشه می توان آزادانه ایجاد کرد. هنگام استفاده از معماری های دیگر مانند ماژولار، DDD و غیره می توان با ساختار پروژه تطبیق داد.
کلاس Repository که ایجاد شده است، رابط RealtimeJobBatchInterface را که در این بسته ایجاد شده است، پیاده سازی می کند. سپس توابع get_all(): Collection and save($data): void را اضافه کنید.
توضیح
تابع عمومی get_all(): مجموعه
این تابع برای بازیابی تمام داده های پایگاه داده و سپس برگرداندن آن ها به شکل مجموعه استفاده می شود. مقصد به شکل مجموعه برگردانده می شود زیرا باید حلقه بزنیم، سپس هر بار که حلقه می کنیم، فرآیند را در یک صف قرار می دهیم.تابع عمومی ذخیره ($data): باطل
این تابع برای انجام فرآیند ذخیره سازی یا تغییراتی که در 1 فرآیند صف رخ می دهد استفاده می شود. ما می توانیم فرآیندهای تجاری خود را با توجه به نیازها در این عملکرد ایجاد کنیم.
namespace App\Repositories;
use App\Models\User;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\DB;
use YogaMeleniawan\JobBatchingWithRealtimeProgress\Interfaces\RealtimeJobBatchInterface;
class VerificationRepository implements RealtimeJobBatchInterface {
public function get_all(): Collection {
$sql = "SELECT * FROM users";
return collect(DB::select($sql));
}
public function save($data): void {
DB::table('users')
->where('id', $data->id)
->update([
'is_verification' => true,
]);
}
}
یک Function Controller برای اجرای فرآیندهای موجود در مخزنی که قبلا ایجاد شده است ایجاد کنید.
مثال:
برای وارد کردن کلاسی که استفاده می کنیم، این 2 خط را اضافه کنید.
use App\Repositories\VerificationRepository;
use YogaMeleniawan\JobBatchingWithRealtimeProgress\RealtimeJobBatch;
سپس یک تابع برای اجرای فرآیند صف ایجاد کنید.
public function verification() {
$batch = RealtimeJobBatch::setRepository(new VerificationRepository())
->execute(name: 'User Verification');
return response()
->json([
'message' => 'User verification is running in background',
'batch' => $batch
], 200);
}
توضیح
setRepository(New VerificationRepository())
در پارامتر تابع setRepository می توانیم آن را بر اساس کلاس مخزن مورد استفاده خود ارسال کنیم. هدف این است که کلاس RealtimeJobBatch می تواند در انواع مختلفی از خدمات با پیاده سازی فرآیندهای مختلف استفاده شود.
->اجرا (نام: ‘تایید کاربر’)
در پارامتر تابع execute میتوانیم نام job_batches را بنویسیم که برای ذخیره اطلاعات مربوط به فرآیند صف شغلی در حال اجرا استفاده میشود.
جاوا اسکریپت را راه اندازی کنید
مراحل زیر برای راه اندازی جاوا اسکریپت آمده است:
در این پیکربندی جاوا اسکریپت با استفاده از blade. اگر می خواهید به غیر از تیغه استفاده کنید در مستندات زیر قابل مشاهده است.
اضافه کردن این را در فایل blade قرار دهید:
<script src="https://js.pusher.com/7.2/pusher.min.js"></script>
<script>
var pusher = new Pusher('YOUR_PUSHER_APP_KEY', {
cluster: 'mt1'
});
var channel = pusher.subscribe('channel-job-batching');
channel.bind('broadcast-job-batching', function(data) {
console.log(data)
});
</script>
YOUR_PUSHER_APP_KEY
می توانید مقدار مناسب را وارد کنید PUSHER_APP_KEY
روی فایل .env
در حال حاضر “channel-job-batching” و “broadcast-job-batching” نام های پیش فرض برای نوشتن هستند. اگر از چیزی غیر از این نام استفاده کنید، پاسخی از Pusher دریافت نخواهید کرد. برای بهروزرسانی بسته بعدی، یک ویژگی نامگذاری کانال رایگان ایجاد خواهد شد.
نتایج پاسخ از Pusher:
{
"finished": false,
"progress": 10,
"pending": 90,
"total": 100,
"data": {}
},
محتویات کلید “داده” یک شی مطابق با داده های در حال پردازش خواهد بود.
مثال:
به روز رسانی کاربر با شناسه 10 در حال انجام است. سپس مقدار شیء کلید “داده” با ویژگی های جدول مطابقت دارد، به عنوان مثال:
ویژگی های جدول کاربر:
- شناسه
- نام
- پست الکترونیک
- is_verified
بنابراین نتایج پاسخ از فشار دهنده به این صورت است:
{
"finished": false,
"progress": 10,
"pending": 90,
"total": 100,
"data": {
"id": 10,
"name": "Yoga Meleniawan Pamungkas",
"email": "yogameleniawan@gmail.com",
"is_verified": true,
}
},
یادداشت
بسته دستهبندی مشاغل بلادرنگ هنوز نیاز به توسعه زیادی دارد. با گذشت زمان، فرآیند توسعه بسته بر اساس اشکالات یا نیاز به ویژگی های اضافی انجام می شود.