المُنشئ __construct

الوصف:

Worker::__construct([string $listen , array $context])

يتم تهيئة مثيل حاوية Worker، حيث يمكن تعيين بعض الخصائص وواجهات الاستدعاء للحاوية لإكمال وظائف معينة.

المعلمات

$listen (معلمة اختيارية، إذا لم يتم ملؤها، فلن يتم الاستماع إلى أي منفذ)

إذا تم تعيين معلمة الاستماع $listen، فسيتم تنفيذ الاستماع عبر المآخذ.

تنسيق $listen هو <بروتوكول>://<عنوان الاستماع>

<بروتوكول> يمكن أن يكون بالتنسيقات التالية:

tcp: على سبيل المثال tcp://0.0.0.0:8686

udp: على سبيل المثال udp://0.0.0.0:8686

unix: على سبيل المثال unix:///tmp/my_file (يحتاج إلى Workerman>=3.2.7)

http: على سبيل المثال http://0.0.0.0:80

websocket: على سبيل المثال websocket://0.0.0.0:8686

text: على سبيل المثال text://0.0.0.0:8686 (text هو بروتوكول نصي مدمج في Workerman، متوافق مع telnet، راجع قسم بروتوكول Text في الملحق لمزيد من التفاصيل)

وأي بروتوكولات مخصصة أخرى، راجع قسم تخصيص بروتوكولات الاتصال في هذا الدليل.

<عنوان الاستماع> يمكن أن يكون بالتنسيقات التالية:

إذا كان سُلكًا unix، يكون العنوان مسار قرص محلي.

إذا كان غير سُلك unix، يكون تنسيق العنوان كالتالي <IP المحلي>:<رقم المنفذ>

يمكن أن يكون <IP المحلي> هو 0.0.0.0 للاستماع إلى جميع بطاقات الشبكة المحلية، بما في ذلك IP الداخلي و IP الخارجي و الحلقة المحلية 127.0.0.1.

إذا كان <IP المحلي> هو 127.0.0.1، فهذا يعني الاستماع إلى الحلقة المحلية، مما يسمح فقط بالوصول المحلي، ولا يمكن الوصول إليه من الخارج.

إذا كان <IP المحلي> هو IP داخلي، مثل 192.168.xx.xx، فهذا يعني أنه يستمع فقط إلى IP الداخلي، ولا يمكن للمستخدمين الخارجيين الوصول إليه.

إذا كانت القيمة المعينة لـ <IP المحلي> لا تتبع عناوين IP المحلية، فلن يتمكن من تنفيذ الاستماع، وسيتلقى رسالة الخطأ Cannot assign requested address.

تنبيه: <رقم المنفذ> لا يمكن أن يكون أكبر من 65535. إذا كان <رقم المنفذ> أقل من 1024، فإنه يتطلب صلاحيات الجذر للاستماع. يجب أن يكون المنفذ المستمع غير مستخدم محليًا، وإلا فلن يتمكن من الاستماع وسيتلقى رسالة الخطأ Address already in use.

$context

مصفوفة. تُستخدم لنقل خيارات سياق المأخذ، راجع خيارات سياق المأخذ.

أمثلة

مُعالج Worker لحاوية http للاستماع ومعالجة طلبات http

use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker('http://0.0.0.0:8686');

$worker->onMessage = function(TcpConnection $connection, Request $request)
{
    $connection->send("hello");
};

// تشغيل العامل
Worker::runAll();

مُعالج Worker لحاوية websocket للاستماع ومعالجة طلبات websocket

use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker('websocket://0.0.0.0:8686');

$worker->onMessage = function(TcpConnection $connection, $data)
{
    $connection->send("hello");
};

// تشغيل العامل
Worker::runAll();

مُعالج Worker لحاوية tcp للاستماع ومعالجة طلبات tcp

use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker('tcp://0.0.0.0:8686');

$worker->onMessage = function(TcpConnection $connection, $data)
{
    $connection->send("hello");
};

// تشغيل العامل
Worker::runAll();

مُعالج Worker لحاوية udp للاستماع ومعالجة طلبات udp

use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker('udp://0.0.0.0:8686');

$worker->onMessage = function(TcpConnection $connection, $data)
{
    $connection->send("hello");
};

// تشغيل العامل
Worker::runAll();

مُعالج Worker للاستماع إلى مآخذ unix domain (يتطلب إصدار Workerman>=3.2.7)

use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker('unix:///tmp/my.sock');

$worker->onMessage = function(TcpConnection $connection, $data)
{
    $connection->send("hello");
};

// تشغيل العامل
Worker::runAll();

مُعالج Worker لا ينفذ أي استماع، يُستخدم لمعالجة بعض المهام المجدولة

use \Workerman\Worker;
use \Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';

$task = new Worker();
$task->onWorkerStart = function($task)
{
    // يتم التنفيذ كل 2.5 ثانية
    $time_interval = 2.5;
    Timer::add($time_interval, function()
    {
        echo "task run\n";
    });
};

// تشغيل العامل
Worker::runAll();

استماع Worker إلى منفذ بروتوكول مخصص

هيكل الدليل النهائي

├── Protocols              // هذا هو الدليل الذي سيتم إنشاؤه
│   └── MyTextProtocol.php // هذا هو ملف البروتوكول المخصص الذي سيتم إنشاؤه
├── test.php  // هذا هو البرنامج النصي test الذي سيتم إنشاؤه
└── Workerman // دليل مصدر Workerman، لا تتغير فيه الأكواد

1، إنشاء دليل Protocols، وإنشاء ملف بروتوكول
Protocols/MyTextProtocol.php (استنادًا إلى هيكل الدليل أعلاه)

// يتم توحيد مساحة أسماء البروتوكولات المخصصة من قبل المستخدم
namespace Protocols;
// بروتوكول نصي بسيط، تنسيق البروتوكول هو نص + سطر جديد
class MyTextProtocol
{
    // وظيفة تقسيم الحزمة، ترجع طول الحزمة الحالية
    public static function input($recv_buffer)
    {
        // البحث عن حرف العودة السطر
        $pos = strpos($recv_buffer, "\n");
        // إذا لم يتم العثور على حرف العودة السطر، فهذا يعني أنه ليس حزمة كاملة، ترجع 0 للانتظار للحصول على بيانات
        if($pos === false)
        {
            return 0;
        }
        // إذا تم العثور على حرف العودة السطر، ترجع طول الحزمة الحالية، بما في ذلك حرف العودة السطر
        return $pos+1;
    }

    // بعد استلام حزمة كاملة، سيتم فك تشفيرها تلقائيًا عبر decode، فقط نقوم بإزالة حرف العودة السطر
    public static function decode($recv_buffer)
    {
        return trim($recv_buffer);
    }

    // قبل إرسال البيانات إلى العميل، سيتم تشفيرها تلقائيًا عبر encode، ثم إرسالها إلى العميل، مع إضافة حرف العودة السطر
    public static function encode($data)
    {
        return $data."\n";
    }
}

2 ، استخدام بروتوكول MyTextProtocol للاستماع ومعالجة الطلبات

قم بإنشاء ملف test.php كما هو موضح في الهيكل النهائي للدليل أعلاه

use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

// #### MyTextProtocol worker ####
$text_worker = new Worker("MyTextProtocol://0.0.0.0:5678");

/*
 * عند استلام بيانات كاملة (تنتهي بسطر جديد)، سيتم استدعاء MyTextProtocol::decode('البيانات المستلمة') تلقائيًا
 * سيتم تمرير النتيجة عبر $data إلى رد الاتصال onMessage
 */
$text_worker->onMessage =  function(TcpConnection $connection, $data)
{
    var_dump($data);
    /*
     * لإرسال البيانات إلى العميل، سيتم تلقائيًا استدعاء MyTextProtocol::encode('hello world') للقيام بتشفير البروتوكول،
     * ثم إرسالها إلى العميل
     */
    $connection->send("hello world");
};

// تشغيل جميع العمال
Worker::runAll();

3، الاختبار

افتح الطرفية، انتقل إلى الدليل حيث يوجد test.php، ثم نفذ php test.php start

php test.php start
Workerman[test.php] start in DEBUG mode
----------------------- WORKERMAN -----------------------------
Workerman version:3.2.7          PHP version:5.4.37
------------------------ WORKERS -------------------------------
user          worker        listen                         processes status
root          none          myTextProtocol://0.0.0.0:5678   1         [OK]
----------------------------------------------------------------
Press Ctrl-C to quit. Start success.

افتح الطرفية، واستخدم telnet للاختبار (من الأفضل استخدام telnet لنظام Linux)

افترض أن الاختبار يتم محليًا،
نفّذ الأمر telnet 127.0.0.1 5678 في الطرفية،
ثم أدخل hi واضغط على Enter،
ستتلقى البيانات hello world\n

telnet 127.0.0.1 5678
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
hi
hello world