🎉 سال نو، مهارت نو، مشاوره رایگان نقشه راه برنامه نویسی (آفر ویژه ثبت نام قبل از افزایش قیمت 🔥)
۰ ثانیه
۰ دقیقه
۰ ساعت
۵ دانشجوی سون‌لرن
مشکل time_out در پرزادش هایی که زمان زیادی لازم دارند
بهنام مرادی حل شده توسط بهنام مرادی

سلام و عرض ادب و احترام خدمت شما

در این جلسه استاد خبرنامه رو تکمیل کردن و ایمیل به مشترکین ارسال شد. به طوری که چندین آدرس ایمیل بصورت یکجا توی قسمت to وارد شد

فرض کنید من میخوام به صورت تک به تک برای کاربرانم ایمیل بفرستم، به دلیل اینکه میخوام نام و نام خانوادگی اعضا رو استفاده بکنم در html ایمیل... و تعداد کارانم هم زیاده مثلا 30 هزار تا

 

حالا مشکل اینجاست که حلقه foreach که استفاده کردم فرضا 100 تا ایمیل رو میفرسته بعدش خطای time_out رو دریافت میکنم، این مشکل رو چطوری حل بکنم؟

 

یکبار نیاز بود 3000 تا پست با یک سناریوی مشخصی توی سایت بصورت اتوماتیک ایجاد بشه که نمیشد یکجا این کار رو کرد چون تایم اوت سرور اجازه نمیداد. در این شرایط چیکار باید بکنیم؟

 

با تشکر

 

foreach ($users as $user){
 // code
}

فرض کنید توی کد بالا کاربران من 100 هزار تاست!! خوب مسلما این حلقه با محدودیت تایم اوت سرور مواجه میشه دیگه

سجاد آقایی ۲۲ فروردین ۱۴۰۴، ۱۲:۵۴

سرور پیش فرض روی 30 ثانیه تایم اوتشه(قابل تنظیم در صورت دسترسی) و برای ارسال 30 هزار ایمیل اینکه از روی سرور اینکارو انجام بدی، منطقی نیست ضمن اینکه اسپمر هم شناخته میشی و منابع سرورو هم کامل مصرف میکنی. بهترین راه استفاده از سرویس‌های ارسال ایمیل هست.

اما راه ارسالش از سمت اسکریپت، میتونی از کران جاب استفاده کنی و هر دقیقه تعدادی ارسال بشه. وردپرس هم wp-cron داره. یا از Background Processing استفاده بشه.

محسن موحد ۲۲ فروردین ۱۴۰۴، ۲۰:۵۰

سلام و عرض احترام خدمت شما

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

مثلا من در سایتم 200 هزار یوزر دارم، و یک کوئری زدم الان نتیجش رو foreach میکنم، مسلما این حلقه جواب نخواهد داد.

foreach ($users as $user){
 // code
}

 که شما خوب راهنمایی کردین و گفتین باید از Background Processing استفاده بکنیم، ولی متاسفانه باید خدممتون بگم که نیاز به راهنمایی بیشتری دارم، یا یک منبعی برای یاد گیری معرفی کنید ، ممنون میشم

با تشکر

 

سجاد آقایی ۲۳ فروردین ۱۴۰۴، ۰۸:۳۸

سلام و احترام
برای حل مشکل ارسال ایمیل‌های انبوه بدون مواجهه با تایم‌اوت، بهترین راه‌حل استفاده از صف‌های وردپرس (WP Queue/Job Queue) هستش. این روش پردازش را به صورت تدریجی  (Async) انجام می‌ده و از محدودیت‌های زمان اجرا (TimeOut) جلوگیری می‌کنه.

در واقع یک صف‌ها یک مفهوم مشترک بین اکثر فریم ورک‌ها هستش.


راه‌حل با صف‌های وردپرس (WP Background Processing)

وردپرس به‌صورت پیش‌فرض از WP Cron پشتیبانی می‌کنه، اما برای پردازش‌های سنگین، بهتره از پلاگین‌ها یا کتابخانه‌های صف‌بندی استفاده کنید:

  1. WP Queue (کتابخانه برای صف‌بندی کارها)
  2. Action Scheduler (مورد استفاده در WooCommerce و بسیاری از پلاگین‌ها)
  3. WP Background Processing (برای پردازش پس‌زمینه)

مراحل پیاده‌سازی:

1. نصب و راه‌اندازی Action Scheduler (ترجیحاً)

  • اگر از WooCommerce استفاده می‌کنید، این کتابخانه از قبل نصب هستش توی وردپرس شما.
  • در غیر این صورت، پلاگین Action Scheduler را نصب کنید.

2. تعریف یک وظیفه (Job) برای ارسال ایمیل‌ها

 

// در فایل functions.php یا یک پلاگین سفارشی
use ActionScheduler_Store as Store;
// تابع ارسال ایمیل به یک کاربر
function send_single_email($user_id) {
    $user = get_userdata($user_id);
    $name = $user->display_name;
    $email = $user->user_email;
    $subject = "ایمیل شخصی‌سازی شده";
    $message = "سلام {$name}! این ایمیل مخصوص شماست.";
    wp_mail($email, $subject, $message);
}
// ثبت وظیفه‌ها در صف
function schedule_bulk_emails() {
    $users = get_users(['fields' => 'ID']); // فقط ID کاربران
    foreach ($users as $user_id) {
        // اضافه کردن هر ایمیل به صف (با تأخیر 1 ثانیه بین هر ایمیل)
        as_schedule_single_action(
            time() + 1, // زمان اجرا (همین حالا + 1 ثانیه)
            'send_single_email_action', // نام اکشن
            [$user_id], // آرگومان‌ها
            'email_queue' // گروه صف (اختیاری)
        );
    }
}
// ثبت هوک برای اجرای تابع
add_action('send_single_email_action', 'send_single_email', 10, 1);
// راه‌اندازی اولیه (مثلاً با یک درخواست REST API یا کلیک دستی)
add_action('admin_init', 'schedule_bulk_emails');

3. اجرای خودکار صف‌ها

  • Action Scheduler به‌صورت خودکار وظایف را مدیریت می‌کنه (با هر بازدید از سایت یا با WP-Cron).
  • می‌توانید وضعیت صف‌ها را در wp-admin → Tools → Scheduled Actions مانیتور کنید.

مزایای این روش:

عدم تایم‌اوت (پردازش در پس‌زمینه).
امکان ارسال ده‌ها هزار ایمیل بدون مشکل.
قابلیت پیگیری خطاها (اگر ایمیلی fail شد، دوباره اجرا می‌شه البته در صورتی که این تنظیم براش انجام شده باشه).
بهینه برای سرور (بار پردازشی کاهش پیدا میکنه).


اگر نیازه بدون پلاگین این کار ا انجام بشه:

  • از WP Cron + تقسیم داده‌ها به Batch استفاده کنید:
// هر ۵ دقیقه ۱۰۰ ایمیل ارسال شود
if (!wp_next_scheduled('send_emails_batch')) {
    wp_schedule_event(time(), 'five_minutes', 'send_emails_batch');
}
add_action('send_emails_batch', function () {
    $users = get_users([
        'number' => 100, // هر بار ۱۰۰ کاربر
        'offset' => get_option('email_batch_offset', 0),
    ]);
    foreach ($users as $user) {
        send_single_email($user->ID);
    }
    update_option('email_batch_offset', count($users) + get_option('email_batch_offset', 0));
});

جمع‌بندی:

  • استفاده از Action Scheduler/WP Queue → بهترین روش برای پردازش‌های سنگین.
  • بدون پلاگین → از WP Cron + Batch Processing استفاده بشه.

 

امیدوارم براتون مفید بوده باشه

بهترین پاسخ
بهنام مرادی ۲۴ فروردین ۱۴۰۴، ۰۶:۲۹

سلام و عرض احترام خدمت شما

جناب مرادی دست گلتون درد نکنه، خیلی خیلی ممنونم از شما، لطف کردین

سجاد آقایی ۲۴ فروردین ۱۴۰۴، ۰۷:۰۵