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

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

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

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

https://github.com/krakjoe/pthreads

http://docs.php.net/manual/en/book.pthreads.php

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

http://windows.php.net/downloads/pecl/releases/pthreads

إنسخ الملف 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