تعداد بازدید: 2419

پردازش در پس زمینه در وردپرس

پردازش در پس زمینه (Background Proccesssing ) در وردپرس زمانی نیاز می شود که یکی از پردازش ها آنقدر طولانی باشد که زمان اجرای آن از max_execution_time در سرور بیشتر شود.

با استفاده از کد زیر می توانید در تنظیمات پی اچ پی برای فایل جاری حداکثر زمان اجرای اسکریپت را تعیین کنید:

ini_set('max_execution_time', 0);

عدد 0 به معنی زمان نامحدود تا پایان اسکریپت می باشد که به صورت پیش فرض در اکثر سرور ها و هاست ها عدد 30 در واحد ثانیه می باشد.

برای پیاده سازی پردازش پس زمینه در وردپرس دو راهکار در اختیار داریم :

  • استفاده از درخواست بازگشتی Ajax در وردپرس
  • استفاده از کتابخانه WP Background Proccessing

درخواست بازگشتی Ajax

توابع بازگشتی در برنامه نویسی توابعی هستند که خودشان را فراخوانی می کنند و برای این که حلقه فراخوانی بی پایان نشود باید یک حالت پایه برای آن تعریف کنیم که در آن تابع پایان می یابد.

در این روش ما در اسکریپت جاوا اسکریپت خودمان یک تابع بازگشتی با نقطه اتمام خاص طراحی می کنیم. نقطه اتمام از سرور به response می آید و در آن ما می توانیم چک کنیم که آیا درخواست تمام شده است یا خیر و با توجه به آن دوباره درخواست را اجرا کنیم یا تمام کنیم.

نکته مهم : در این روش باید کاربر روال انجام پروسه رو ببیند و این روش برای آن دسته از پردازش هایی مناسب است که می توان آن را به چند پردازش تقسیم بندی کرد. به طور مثال می خواهیم یک سری داده را در پایگاه داده درون ریزی کنیم.به صورت کلی هر موقع پردازشتون به تابع بازگشتی میومد از این روش استفاده کنید.

برای این منظور باید متغیر های زیر را به تابع داد :

  • data : داده های قابل پردازش که قراره هر قسمت درون ریزی بشه.
  • progress : چه مقدار از پردازش پیش رفته است.
  • status : وضعیت اتمام پردازش.

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

$data = array(
      'adminAjax' => admin_url('admin-ajax.php'),
      'posts' => $posts_array,
);
wp_localize_script("ftl-admin-script", "locationObj", $data);

گام دوم : اجرای تابع بازگشتی جاوا اسکریپت با استفاده از داده  هایی که در اجرای ابتدایی به آن داده شده است:

function importPosts(posts, offset) {
    $.ajax({
        type: 'POST',
        url: OBJ.adminAjax,
        data: {
            action: "import_posts",
            posts: posts,
            offset: offset,
        },
        beforeSend: function () {},
        error: function (request, status, error) {},
        success: function (respons) {
            if(respons.status === false){
                importPosts(respons.posts,respons.offset);
            }else{
                alert("progress complate");
            }
        }
    });
}
$("button").click(function(){
    var posts = OBJ.posts;
    var offset = 0;
    importPosts(posts, offset);
});

به هنگام کلیک روی یک دکمه این تابع به ازای مقادیر اولیه ای که به آن داده شده است اجرا می گردد. پس از آن تا پایان یافتن اسکریپت ( بازگشت مقدار true ) تابع جاوا اسکریپتی به ازای مقادیر بازگشتی از سرور اجرا می گردد.

گام سوم : پیاده سازی دریافت درخواست و ارسال پاسخ در سرور.

public function import_posts(){
    $posts_array = $_POST['posts'];
    $offset = $_POST['offset'];
    #insert posts and update post_array and offset
    if(PROCCESS END){
        return wp_send_json(array(
            'status' => true,
            'offset' => $offset,
        ));
    }
    return wp_send_json(array(
        'status' => false,
        'posts' => $posts_array,
        'offset' => $offset,
    ));
}

همان طور که در کد بالا می بینید در هر بار اجرای تابع جاوا اسکریپت یه تعداد پست درون ریزی می شه و باقی برگردونده میشه به عنوان پاسخ و دوباره با مقادیر جدیدی که در پاسخ اومده تابع اجرا میشه . این روال تا پایان یافتن آرایه پست ها ادامه پیدا می کنه.

مقدار offset باید با توجه به تعداد کل پست های posts_array و مقداری که در هر بار درخواست درون ریزی میشه مقدار دهی بشه و با استفاده از css خط پیشروی رو نمایش بده.

WP Background Proccessing

یک کتابخانه برای اجرای اسکریپت ها در پس زمینه وردپرس می باشد. به گونه ای که هر اسکریپت یک کلاس extends شده از کلاس WP_Background_Process می شود و هر زمان که نیاز بود این کلاس با استفاده از داده های ورودی خود در پس زمینه اجرا می گردد.

برای استفاده از این کتابخانه باید آن را ابتدا نصب کنید :

composer require a5hleyrich/wp-background-processing

در مرحله اول باید اسکریپت طولانی خود را در متد task تعریف کنیم. این متد می تواند مقادیری را دریافت کند. متد task اسکریپت طولانی ما رو پر می کنه و متد complate پس از پایان یافتن task اجرا میشه.

class BackgroundProcess extends WP_Background_Process {
    protected $action = 'rng-proccess2';

    protected function task($item) {
        error_log($item);
        sleep(10);
        error_log($item . "2");
        return false;
    }

    protected function complete() {
        parent::complete();
    }
}

در مرحله بعد باید این اسکریپت را در جایی که لازمه ( مثلا یک هوک خاص ) این کلاس رو شئ بسازیم و با استفاده از متد push_to_queue اسکریپت طولانی رو به صف اجرا ببریم. به عنوان ورودی هم می تونیم مقادیری رو براش ارسال کنیم. در پایان وقتی پروسه ها رو به شئ پوش کردیم باید با استفاده از متد save اون ها رو ذخیره کنیم.

در نهایت در هوک مورد نظر ( یا پس از اتمام پوش بعد از ذخیره ) باید اسکریپت های طولانی رو به اجرا در بیاریم.

class RNG_Proccess {

    public $background_proccess;

    public function __construct() {
        $this->background_proccess = new BackgroundProcess();
        add_action("template_redirect", array($this, "test"));
        add_action("shutdown", array($this, shutdown));
    }

    public function test() {
        // Add items to the queue.
        $counter1 = "it work";
        $counter2 = "hello world";
        $this->background_proccess->push_to_queue($counter1);
        $this->background_proccess->push_to_queue($counter2);
        $this->background_proccess->save();
    }

    public function shutdown() {
        $this->background_proccess->dispatch();
    }
}
new RNG_Proccess;

در مثال بالا ما در زمان template_redirect شئ رو ساختیم و اسکریپت ها رو پوش کردیم و در shutdown اون ها رو به اجرا در آوردیم.

مطالب مشابه

آموزش نکات و تکنیک های برنامه نویسی وردپرس

معرفی تابع get_posts در وردپرس

در این مقاله میخوایم که تابع get_post و get_posts رو معرفی کنیم . این تابع کار کوئری هایی که با شی WP_Query می گرفتیم ....

آموزش نکات و تکنیک های برنامه نویسی وردپرس

Hooks: Actions and Filters

هیچ وقت هسته وردپرس رو تغییر ندید (do'nt touch the core) . بدین معنی هست که برای هک وردپرس راه دیگری غیر از تغییر...

Settings API در ووکامرس

ما برای ساخت پنل تنظیمات برای افزونه ها از api خود وردپرس استفاده می کردیم. حال این که افزونه مکمل برای ووکامرس می...

اشتراک گذاری :

مدیر وب سایت گنوتک . برنامه نویسی رو با زبان C در هفده سالگی شروع کردم . در حال حاضر به برنامه نویسی php برپایه معماری MVC , HMVC و همچنین سیستم مدیریت محتوای WordPress و فریم ورک محبوب لاراول علاقه مند هستم و دوست دارم اطلاعاتم رو با شما به اشتراک بگذارم.

۰ دیدگاه برای پردازش در پس زمینه در وردپرس

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *