كيف تبث (ترسل جماعيا) البيانات
مثال (بث دوري)
use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('websocket://0.0.0.0:2020');
// في هذا المثال يجب أن يكون عدد العمليات 1
$worker->count = 1;
// عند بدء العملية يتم تعيين مؤقت لإرسال البيانات إلى جميع اتصالات العملاء بشكل دوري
$worker->onWorkerStart = function($worker)
{
// كل 10 ثوانٍ
Timer::add(10, function()use($worker)
{
// تجول في جميع اتصالات العملاء في العملية الحالية، وإرسال الوقت الحالي للخادم
foreach($worker->connections as $connection)
{
$connection->send(time());
}
});
};
// تشغيل العامل
Worker::runAll();
مثال (دردشة جماعية)
use Workerman\Worker;
use Workerman\Timer;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('websocket://0.0.0.0:2020');
// في هذا المثال يجب أن يكون عدد العمليات 1
$worker->count = 1;
// عند استلام رسالة من العميل، يتم بثها إلى المستخدمين الآخرين
$worker->onMessage = function(TcpConnection $connection, $message)use($worker)
{
foreach($worker->connections as $connection)
{
$connection->send($message);
}
};
// تشغيل العامل
Worker::runAll();
توضيح:
عملية واحدة:
المثال أعلاه يمكن أن يعمل فقط عمليّة واحدة ($worker->count=1)، لأنه في حالة وجود عمليات متعددة يمكن أن تتصل عدة عملاء بعمليات مختلفة، وبالتالي تكون اتصالات العملاء بين العمليات معزولة، ولا يمكن التواصل مباشره، بمعنى أنه لا يمكن للعميلة A أن تتواصل مباشرة مع كائن اتصال العميل في العملية B لإرسال البيانات. (لإنجاز ذلك، تحتاج إلى التواصل بين العمليات، مثل استخدام مكون Channel، على سبيل المثال مثال - بث جماعي، مثال - إرسال جماعي).
يفضل استخدام GatewayWorker
إطار عمل GatewayWorker الذي تم تطويره على أساس Workerman يوفر آلية دفع أكثر ملاءمة، بما في ذلك البث، يمكنه ضبط عمليات متعددة ويمكن نشره عبر خوادم متعددة. إذا كنت بحاجة إلى دفع البيانات إلى العملاء، يفضل استخدام إطار عمل GatewayWorker.
رابط دليل GatewayWorker https://doc2.workerman.net