⚙️ درس هفتم: پردازشهای پسزمینه (Queue & Jobs)؛ مدیریت کارهای سنگین بدون توقف سایت
🎯 هدف این درس: آشنایی با مفهوم صفها (Queues) و پردازشهای پسزمینه (Background Jobs)، یادگیری نحوه جداسازی کارهای زمانبر از درخواست اصلی کاربر برای جلوگیری از Time-out و افزایش سرعت پاسخدهی سایت.
مهمان عزیز! 👋
تا اینجا یاد گرفتی چطور کدهای سریع و بهینه بنویسی. اما فرض کن کاربری دکمه “ثبت سفارش” را میزند و سایت باید همزمان:
1. سفارش را در دیتابیس ذخیره کند.
2. یک ایمیل تاییدیه طولانی ارسال کند.
3. یک گزارش PDF تولید کند.
4. اطلاعات را به انبارداری بفرستد.
اگر همه این کارها را در لحظه انجام دهی، کاربر ممکن است ۱۰ تا ۲۰ ثانیه منتظر بماند تا صفحه لود شود! این تجربه کاربری فاجعهبار است. راه حل حرفهای استفاده از Queue (صف) است.
💡 مفهوم Queue چیست؟
به جای انجام کار در همان لحظه، آن را در یک “صف” قرار میدهیم. سرور بلافاصله به کاربر پاسخ میدهد (“سفارش ثبت شد”) و یک پردازشگر جداگانه (Worker) در پسزمینه کارهای سنگین را یکییکی انجام میدهد.
1️⃣ ساختار یک Job (وظیفه)
در PHP مدرن (مخصوصاً اگر از فریمورکهایی مثل Laravel استفاده کنی یا سیستم اختصاصی بسازی)، هر کار پسزمینه یک کلاس است که متد handle دارد. بیاییم یک نمونه ساده از منطق آن را ببینیم.
SendEmailJob.php
PHP
8.x
class SendEmailJob {
private $email;
private $message;
public function __construct($email, $message) {
$this->email = $email;
$this->message = $message;
}
// این متد در پسزمینه اجرا میشود
public function handle() {
// شبیهسازی ارسال ایمیل سنگین
sleep(5);
mail($this->email, 'تاییدیه', $this->message);
error_log("ایمیل به {$this->email} ارسال شد.");
}
}
2️⃣ افزودن کار به صف (Dispatching)
در کنترلر اصلی، به جای اجرای مستقیم ایمیل، آن را به صف اضافه میکنیم. در محیط واقعی از ابزارهایی مثل Redis یا Database برای ذخیره صف استفاده میشود.
OrderController.php
PHP
8.x
<?php
class OrderController {
public function store() {
// ۱. ذخیره سفارش در دیتابیس (سریع)
$order = $this->orderService->save($_POST);
// ۲. افزودن ایمیل به صف (بدون انتظار برای اتمام)
$job = new SendEmailJob($order->email, 'سفارش شما ثبت شد.');
// در فریمورکها: dispatch($job);
$this->queue->push($job);
// ۳. پاسخ فوری به کاربر
return "سفارش با موفقیت ثبت شد و ایمیل در حال ارسال است.";
}
}
3️⃣ اجرای Worker (پردازشگر)
یک اسکریپت باید دائماً در سرور اجرا شود تا صف را چک کند و کارها را انجام دهد. این اسکریپت معمولاً از طریق Command Line اجرا میشود.
worker.php
PHP
8.x
<?php
while (true) {
// دریافت اولین کار از صف
$job = $queue->pop();
if ($job) {
try {
$job->handle(); // اجرای کار
$queue->acknowledge($job); // تأیید اتمام کار
} catch (Exception $e) {
$queue->retry($job); // تلاش مجدد در صورت خطا
}
} else {
sleep(1); // اگر کاری نبود، ۱ ثانیه صبر کن
}
}
❌ خطاهای رایج در استفاده از Queue
🚫 اشتباه مرگبار:
قرار دادن کارهای حیاتی و فوری (مثل کاهش موجودی انبار) در صفهای با اولویت پایین. اگر سرور کرش کند، کارهای داخل صف ممکن است از بین بروند مگر اینکه از سیستمهای Persistent (پایدار) مثل Redis یا Database استفاده کنی.
- فراموش کردن Retry Logic: اگر ارسال ایمیل شکست خورد، باید سیستم بتواند دوباره تلاش کند.
- عدم مانیتورینگ صف: اگر صف پر شود و Worker خاموش باشد، کاربران هیچگاه ایمیل دریافت نمیکنند.
🏁 جمعبندی درس هفتم
مهمان عزیز، در این درس یاد گرفتی:
- ✅ چرا نباید کارهای سنگین را در Request اصلی انجام داد.
- ✅ مفهوم Job و Queue در پردازشهای ناهمزمان.
- ✅ نحوه ساختاردهی یک کلاس Job.
- ✅ نقش Worker در اجرای کارهای پسزمینه.
🎓 تمرین عملی درس هفتم
سعی کن یک اسکریپت ساده بنویسی که ۱۰۰ رکورد را در یک فایل متنی بنویسد. ابتدا آن را به صورت عادی اجرا کن و زمان بگیر، سپس منطق آن را طوری تغییر بده که شبیهسازی یک صف باشد (مثلاً دادهها را در یک آرایه ذخیره کند و در پایان یکجا بنویسد).
🗺️ نقشه راه دوره: شما اینجا هستید!
برای اینکه بدانی دقیقاً کجای مسیر هستی و چه درسهایی در انتظار توست، به جدول زیر نگاه کن. درس فعلی با رنگ متفاوت مشخص شده است.
| درس | عنوان درس | آنچه یاد میگیرید |
|---|---|---|
| ۱ | اصول SOLID در PHP | تکمسئولیتی، باز/بسته، جایگزینی لیسکوف، جداسازی رابط، وارونگی وابستگی |
| ۲ | الگوهای طراحی (Design Patterns) | Singleton, Factory, Strategy, Observer, MVC پیشرفته |
| ۳ | برنامهنویسی تابعی در PHP | توابع ناشناس (Closures)، Arrow Functions، Map/Filter/Reduce |
| ۴ | مدیریت وابستگی با Composer | نصب پکیجها، مدیریت نسخهها، Autoloading (PSR-4) |
| ۵ | تستنویسی حرفهای (TDD) | آشنایی با PHPUnit، نوشتن Unit Test، Mocking |
| ۶ | کار با Redis و Caching | کش کردن دادهها، Session Handler با Redis |
| ۷ | پردازشهای پسزمینه (Queue & Jobs) | استفاده از صفها برای ایمیلزنی یا پردازش سنگین |
| ۸ | API نویسی حرفهای (RESTful) | استانداردهای REST، احراز هویت با JWT، Rate Limiting |
| ۹ | امنیت سایبری پیشرفته | تحلیل حملات پیچیده، Secure Headers، CSP |
| ۱۰ | پروژه نهایی پیشرفته | ساخت یک CMS ماژولار با قابلیت نصب پلاگین و تم |



