add
int \Workerman\Timer::add(float $time_interval, callable $callback [,$args = array(), bool $persistent = true])
تنفيذ دالة معينة أو طريقة فئة بشكل دوري.
ملاحظة: يتم تشغيل المؤقتات داخل العملية الحالية، لن يقوم Workerman بإنشاء عمليات أو خيوط جديدة لتشغيل المؤقتات.
المعلمات
time_interval
كم مرة يتم تنفيذها، الوحدة بالثواني، تدعم الأرقام العشرية، يمكن أن تكون دقيقة حتى 0.001، أي بدقة المستوى المللي.
callback
دالة الاستدعاء ملاحظة: إذا كانت دالة الاستدعاء هي طريقة من فئة، يجب أن تكون الطريقة خاصية عامة
args
معلمات دالة الاستدعاء، يجب أن تكون مصفوفة، عناصر المصفوفة هي قيم المعلمات.
persistent
هل هي دائمة، إذا كنت تريد فقط تنفيذها مرة واحدة، فقم بإرسال false (المهام التي يتم تنفيذها مرة واحدة سوف تُDestroy تلقائيًا بعد التنفيذ، لا حاجة لاستدعاء Timer::del() ). القيمة الافتراضية هي true، أي أن التنفيذ سيستمر.
قيمة العودة
ترجع عددًا صحيحًا، يمثل معرف المؤقت، يمكنك تدمير هذا المؤقت عن طريق استدعاء Timer::del($timerid).
مثال
1، دالة مؤقتة وظيفة غير مسماة (إغلاق)
use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
$task = new Worker();
// عدد العمليات التي ستقوم بتشغيل المهام المؤقتة، انتبه إلى ما إذا كانت هناك مشاكل تزامن في العمليات المتعددة
$task->count = 1;
$task->onWorkerStart = function(Worker $task)
{
// التنفيذ كل 2.5 ثانية
$time_interval = 2.5;
Timer::add($time_interval, function()
{
echo "تتم عملية تنفيذ المهمة\n";
});
};
// تشغيل العامل
Worker::runAll();
2، إعداد المؤقت فقط في عملية محددة
ينتج عن مثيل worker 4 عمليات، وضبط المؤقت فقط على العملية رقم 0.
use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker();
$worker->count = 4;
$worker->onWorkerStart = function(Worker $worker)
{
// ضبط المؤقت فقط في العملية رقم 0، ولا يتم ضبط المؤقت في العمليات 1 و2 و3
if($worker->id === 0)
{
Timer::add(1, function(){
echo "في 4 عمليات worker، يتم ضبط المؤقت فقط في العملية 0\n";
});
}
};
// تشغيل العامل
Worker::runAll();
3، دالة مؤقتة غير مسماة، تستخدم الإغلاق لتمرير المعلمات
use Workerman\Worker;
use Workerman\Timer;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$ws_worker = new Worker('websocket://0.0.0.0:8080');
$ws_worker->count = 8;
// عند إنشاء الاتصال، قم بتعيين المؤقت للاتصال المقابل
$ws_worker->onConnect = function(TcpConnection $connection)
{
// التنفيذ كل 10 ثوانٍ
$time_interval = 10;
$connect_time = time();
// إضافة مؤقت مؤقت لمعرف المؤقت على كائن الاتصال
$connection->timer_id = Timer::add($time_interval, function()use($connection, $connect_time)
{
$connection->send($connect_time);
});
};
// عند إغلاق الاتصال، احذف المؤقت المقابل للاتصال
$ws_worker->onClose = function(TcpConnection $connection)
{
// حذف المؤقت
Timer::del($connection->timer_id);
};
// تشغيل العامل
Worker::runAll();
4، دالة مؤقتة غير مسماة، تستخدم واجهة المؤقت لتمرير المعلمات
use Workerman\Worker;
use Workerman\Timer;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$ws_worker = new Worker('websocket://0.0.0.0:8080');
$ws_worker->count = 8;
// عند إنشاء الاتصال، قم بتعيين المؤقت للاتصال المقابل
$ws_worker->onConnect = function(TcpConnection $connection)
{
// التنفيذ كل 10 ثوانٍ
$time_interval = 10;
$connect_time = time();
// إضافة مؤقت مؤقت لمعرف المؤقت على كائن الاتصال
$connection->timer_id = Timer::add($time_interval, function($connection, $connect_time)
{
$connection->send($connect_time);
}, array($connection, $connect_time));
};
// عند إغلاق الاتصال، احذف المؤقت المقابل للاتصال
$ws_worker->onClose = function(TcpConnection $connection)
{
// حذف المؤقت
Timer::del($connection->timer_id);
};
// تشغيل العامل
Worker::runAll();
5، دالة مؤقتة دالة عادية
use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
// دالة عادية
function send_mail($to, $content)
{
echo "إرسال البريد ...\n";
}
$task = new Worker();
$task->onWorkerStart = function(Worker $task)
{
$to = 'workerman@workerman.net';
$content = 'مرحبًا workerman';
// تنفيذ مهمة إرسال البريد بعد 10 ثوانٍ، الأخيرة تمرير false، تعني أنها ستعمل مرة واحدة فقط
Timer::add(10, 'send_mail', array($to, $content), false);
};
// تشغيل العامل
Worker::runAll();
6، دالة مؤقتة لطريقة من فئة
use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
class Mail
{
// ملاحظة، يجب أن تكون خاصية دالة الاستدعاء عامة
public function send($to, $content)
{
echo "إرسال البريد ...\n";
}
}
$task = new Worker();
$task->onWorkerStart = function($task)
{
// إرسال بريد مرة واحدة بعد 10 ثوانٍ
$mail = new Mail();
$to = 'workerman@workerman.net';
$content = 'مرحبًا workerman';
Timer::add(10, array($mail, 'send'), array($to, $content), false);
};
// تشغيل العامل
Worker::runAll();
7، دالة مؤقتة لطريقة من فئة (استخدام المؤقت داخل الفئة)
use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
class Mail
{
// ملاحظة، يجب أن تكون خاصية دالة الاستدعاء عامة
public function send($to, $content)
{
echo "إرسال البريد ...\n";
}
public function sendLater($to, $content)
{
// إذا كانت دالة الاستدعاء هي طريقة ضمن الفئة الحالية، فإن العنصر الأول للمصفوفة هو $this
Timer::add(10, array($this, 'send'), array($to, $content), false);
}
}
$task = new Worker();
$task->onWorkerStart = function(Worker $task)
{
// إرسال بريد واحدة بعد 10 ثوانٍ
$mail = new Mail();
$to = 'workerman@workerman.net';
$content = 'مرحبًا workerman';
$mail->sendLater($to, $content);
};
// تشغيل العامل
Worker::runAll();
8، دالة مؤقتة لطريقة ثابتة في الفئة
use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
class Mail
{
// ملاحظة، هذه هي دالة ثابتة، يجب أن تكون خاصية دالة الاستدعاء عامة أيضًا
public static function send($to, $content)
{
echo "إرسال البريد ...\n";
}
}
$task = new Worker();
$task->onWorkerStart = function(Worker $task)
{
// إرسال بريد واحدة بعد 10 ثوانٍ
$to = 'workerman@workerman.net';
$content = 'مرحبًا workerman';
// استدعاء دالة ثابتة في الفئة بجدول زمني
Timer::add(10, array('Mail', 'send'), array($to, $content), false);
};
// تشغيل العامل
Worker::runAll();
9، دالة مؤقتة لطريقة ثابتة في الفئة (مع مساحة اسم)
namespace Task;
use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
class Mail
{
// ملاحظة، هذه هي دالة ثابتة، يجب أن تكون خاصية دالة الاستدعاء عامة أيضًا
public static function send($to, $content)
{
echo "إرسال البريد ...\n";
}
}
$task = new Worker();
$task->onWorkerStart = function(Worker $task)
{
// إرسال بريد واحدة بعد 10 ثوانٍ
$to = 'workerman@workerman.net';
$content = 'مرحبًا workerman';
// استدعاء دالة ثابتة في الفئة مع مساحة اسم
Timer::add(10, array('\Task\Mail', 'send'), array($to, $content), false);
};
// تشغيل العامل
Worker::runAll();
10، تدمير المؤقت الحالي داخل المؤقت (تمرير $timer_id باستخدام الإغلاق)
use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
$task = new Worker();
$task->onWorkerStart = function(Worker $task)
{
// العداد
$count = 1;
// لكي يتم تمرير $timer_id بشكل صحيح إلى داخل دالة الاستدعاء، يجب إضافة رمز العنوان &
$timer_id = Timer::add(1, function()use(&$timer_id, &$count)
{
echo "تتم عملية المؤقت $count\n";
// بعد تشغيل 10 مرات، احذف المؤقت الحالي
if($count++ >= 10)
{
echo "Timer::del($timer_id)\n";
Timer::del($timer_id);
}
});
};
// تشغيل العامل
Worker::runAll();
11، تدمير المؤقت الحالي داخل المؤقت (تمرير $timer_id كمعامل)
use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
class Mail
{
public function send($to, $content, $timer_id)
{
// مؤقتًا إضافة خاصية count إلى الكائن الحالي لتتبع عدد مرات تشغيل المؤقت
$this->count = empty($this->count) ? 1 : $this->count;
// بعد تشغيل 10 مرات، احذف المؤقت الحالي
echo "إرسال البريد {$this->count}...\n";
if($this->count++ >= 10)
{
echo "Timer::del($timer_id)\n";
Timer::del($timer_id);
}
}
}
$task = new Worker();
$task->onWorkerStart = function(Worker $task)
{
$mail = new Mail();
// لكي يتم تمرير $timer_id بشكل صحيح إلى داخل دالة الاستدعاء، يجب إضافة رمز العنوان &
$timer_id = Timer::add(1, array($mail, 'send'), array('to', 'content', &$timer_id));
};
// تشغيل العامل
Worker::runAll();