الـ threads في لغة php

السلام عليكم ورحمة الله وبركاته

من المعلوم أن تنفيذ المهام يكون بشكل متتالي "تسلسلي"، أي يتم تنفيذ مهمة تلو الأخرى، أي لا يتم البدء في تنفيذ المهمة التالية إلا بعد الإنتهاء من التي تسبقها.

فقد تحتاج في بعض الأحيان التنفيذ المتزامن لبعض المهام، بمعنى تشغيل أكثر من مهمة في نفس الوقت وعدم إنتظار إنتهاء المهمة للإنتقال للمهمة التالية وهو ما يعرف بتنفيذ المهام المتوازي parallel tasks.

هناك أكثر من طريقة لتنفيذ هذه المهمة ولكن حديثنا سيدور حول مكتبة pthreads يمكنك الإطلاع عليها من الروابط التالية:

لمستخدمي وندوز عليك معرفة إصدار الـ php الذي تستخدمه وتنزيل الإصدار المتوافق مع إصدار php الخاص بك من الرابط التالي:

إنسخ الملف pthreadVC2.dll إلى مسار وجود ملفات php الخاصة بالخادم الذي تستخدمه والذي يتواجد به الملف php.exe

إنسخ الملف php_pthreads.dll إلى مسار وجود ملفات php داخل مجلد ext

إن لم تعمل معك المكتبة قم بنسخ الملف pthreadVC2.dll إلى مسار الخادم apache داخل مجلد bin

قم بتعديل الملف php.ini وأضف السطر extension=php_pthreads.dll

قم بإعادة تشغيل الخادم

مثال على إستخدام المكتبة:

<?php
class myThread extends Thread
{
    public function __construct($data)
    {
        $this->data = $data;
    }

    public function run()
    {
        echo 'startTime: '.date('h:i:s A').', Name:'.$this->data['name'];
        sleep($this->data['runTime']);
        echo ' | endTime: '.date('h:i:s A').', Name:'.$this->data['name'].'<br>';
    }
}

$data[] = ['name'=>'Name1', 'runTime'=>5];
$data[] = ['name'=>'Name2', 'runTime'=>10];
$data[] = ['name'=>'Name3', 'runTime'=>15];

$arr = [];
foreach($data as $value)
    $arr[] = new myThread($value);

foreach($arr as $thread)
    $thread->start();
?>

طبعاً تم إستعمال دالة seep كمحكاة وقت عمل المهمة فأعطيت مهمة 5 ثوان وأخرى 10 ثوان وأخرى 15 ثانية

  • ملاحظة: فضلاً لا تتعجل وإنتظر 15 ثانية حتى ينتهي التطبيق من عمله :)

الناتج سيكون على الشكل التالي:

startTime: 04:25:10 PM, Name:Name1 | endTime: 04:25:15 PM, Name:Name1
startTime: 04:25:10 PM, Name:Name2 | endTime: 04:25:20 PM, Name:Name2
startTime: 04:25:10 PM, Name:Name3 | endTime: 04:25:25 PM, Name:Name3
  • ملاحظة: إذا كنت تسخدم مكتبات خارجية عليك تضمين المكتبة داخل الدالة run
يرجى الدخول لحسابك أو تسجيل حساب لتستطيع إضافة تعليق
حساب جديد دخول

التعليقات

شكرا لك اخى ، هل يجب ان تتنتظر كافة العمليات لتنتهى ام يمكنك طلب عملية وانهاؤها فى حين ان الاخرى مازالت تعمل

بفرض ان لدى طلب اقوم به بالاجاكس لإضافة تعليق لقاعدة بيانات واريد كذلك ارسال تنبيهات بريدية لعدة اشخاص

هل يمككنى بعد الارسال لقاعدة البيانات وأخذ id التعليق ارسال thread آخر الى المعالجه فى حين لا يتعطل عملى الحالى ويخرج response ال ajax الخاص باإضافه

للأسف علينا إنتظار إنتهاء كافة العمليات وبعدها إستلام الرد جملة واحدة بعد إنتهاء الإتصال بالخادم.

إستخدمت ال ob_flush لمتابعة تنفيذ العمليات لحظة بلحظة وقد جربت هذه الطريقة من خلال AJAX ولم يفلح الأمر.

لا أعلم إن كان هناك حدث لمتابعة العملية من خلال javaScript كالحدث المستخدم في متابعة رفع الملفات على الخادم أم لا.

إن وصلت لطريقة ما لا تنسى أن تخبرنا بها : )

@ahmedsaoud31

 @khashabawy

مثال javscript

            ajax = new XMLHttpRequest();
            ajax.onprogress = function(){
                document.body.innerHTML = this.response;
            }
            ajax.open("post","testServer.php");
            ajax.send(null,true);

ثم ملف الخادم testServer.php

        function sendMS($n){
            echo "رسال $n";
            ob_flush();
            flush();
            sleep(2); // إيقاف العمل لمدة ثانيتان
        }
        for($i=0;;$i++)
            sendMS($i);

سيزيد نص كل ثانيتان.

ممتاز @supercoder هذا ما أردناه بالتحديد :)

في هذه الحالة علينا إعتماد صيغة معينة لمقارنة النص للحصول على النتيجة التي نريدها عند إنتهاء تنفيذ عملية معينه من الكود +1

أحاول البحث فى موضوع ال Backtrack .. أو ال url ping .... و أعتقد أنها قد تكون مناسبة

أو نستخدم ال ajax actions بشكل متتابع .. فمثلاً عندما يصلك الرد من السيرفر بوضع البوست .. تقوم بإرسال ajax request مره أخرى ليقوم بالعملية التالية :((((

على بركة الله :)

نعم كنت أستخدم طريقة إستدعاء كائن الـ ajax بشكل ممتابع في بعض الأحيان، سأرى إستخدام حدث Progress كالمستخدم في رفع الملفات كما ذكر الأخ @supercoder

يمكنك إستخدام حدث Progress لل اجاكس ومقارنة المحتوى الجديد بالقديم.