__construct طريقة

void AsyncTcpConnection::__construct(string $remote_address, $context_option = null)

إنشاء كائن اتصال غير متزامن.

يمكن لـ AsyncTcpConnection أن تجعل Workerman كعميل يقوم ببدء اتصال غير متزامن بالخادم البعيد، ومن خلال واجهة send و onMessage يمكن إرسال ومعالجة البيانات على الاتصال بشكل غير متزامن.

المعلمات

المعلمة:remote_address

عنوان الاتصال، على سبيل المثال
tcp://www.baidu.com:80
ssl://www.baidu.com:443
ws://echo.websocket.org:80
frame://192.168.1.1:8080
text://192.168.1.1:8080

المعلمة:$context_option

هذه المعلمة تتطلب (workerman >= 3.3.5)

تستخدم لتعيين سياق المقبس، مثل استخدامbindto لتحديد أي (بطاقة شبكة) IP وميناء للوصول إلى الشبكة الخارجية، وضبط شهادة SSL، إلخ.

راجع stream_context_create، خيارات سياق المقبس، خيارات سياق SSL

ملاحظات

البروتوكولات التي يدعمها AsyncTcpConnection حالياً هي tcp، ssl، ws، frame، text.

يدعم أيضاً بروتوكولات مخصصة، انظر كيفية تخصيص البروتوكولات

يتطلب البروتوكول ssl Workerman >= 3.3.4، وتثبيت موصل openssl.

حالياً لا يدعم AsyncTcpConnection بروتوكول http.

يمكن استخدامnew AsyncTcpConnection('ws://...') لبدء اتصال WebSocket مع خادم WebSocket بعيد كما هو الحال في المتصفح، انظر مثال. لكن لا يمكن استخدامnew AsyncTcpConnection('websocket://...') لبدء اتصال WebSocket في Workerman.

مثال

مثال 1، الوصول غير المتزامن إلى خدمة http خارجية

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

$task = new Worker();
// عند بدء العملية، يتم إنشاء اتصال غير متزامن إلى www.baidu.com، وإرسال البيانات للحصول على البيانات
$task->onWorkerStart = function($task)
{
    // لا يدعم تحديد http مباشرة، ولكن يمكن استخدام tcp لمحاكاة بروتوكول http لإرسال البيانات
    $connection_to_baidu = new AsyncTcpConnection('tcp://www.baidu.com:80');
    // عند إنشاء الاتصال بنجاح، أرسل بيانات طلب http
    $connection_to_baidu->onConnect = function(AsyncTcpConnection $connection_to_baidu)
    {
        echo "تم الاتصال بنجاح\n";
        $connection_to_baidu->send("GET / HTTP/1.1\r\nHost: www.baidu.com\r\nConnection: keep-alive\r\n\r\n");
    };
    $connection_to_baidu->onMessage = function(AsyncTcpConnection $connection_to_baidu, $http_buffer)
    {
        echo $http_buffer;
    };
    $connection_to_baidu->onClose = function(AsyncTcpConnection $connection_to_baidu)
    {
        echo "تم إغلاق الاتصال\n";
    };
    $connection_to_baidu->onError = function(AsyncTcpConnection $connection_to_baidu, $code, $msg)
    {
        echo "رمز الخطأ:$code msg:$msg\n";
    };
    $connection_to_baidu->connect();
};

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

مثال 2، الوصول غير المتزامن إلى خدمة websocket الخارجية، وضبط IP وعنوان المنفذ المحلي

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

$worker = new Worker();

$worker->onWorkerStart = function($worker) {
    // إذا كنت تريد بدء الاتصال في عملية واحدة فقط، يمكنك التحقق من $worker->id للقيام بذلك، على سبيل المثال، أدناه هو بدء الاتصال فقط في العملية 0
    if ($worker->id != 0) {
        return;
    }
    // تعيين IP المحلي والعنوان للوصول إلى المضيف الآخر (كل اتصال بالإصطناعي سيستخدم منفذ محلي واحد)
    $context_option = array(
        'socket' => array(
            // يجب أن يكون IP هو IP بطاقة الشبكة المحلية، ويجب أن يكون قادرًا على الوصول إلى المضيف الآخر، وإلا فإنه غير صالح
            'bindto' => '114.215.84.87:2333',
        ),
    );

    $con = new AsyncTcpConnection('ws://echo.websocket.org:80', $context_option);

    $con->onConnect = function(AsyncTcpConnection $con) {
        $con->send('hello');
    };

    $con->onMessage = function(AsyncTcpConnection $con, $data) {
        echo $data;
    };

    $con->connect();
};

Worker::runAll();

مثال 3، الوصول غير المتزامن إلى منفذ wss خارجي، وضبط شهادة ssl المحلية

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

$worker = new Worker();

$worker->onWorkerStart = function($worker){
    // تعيين IP المحلي وعنوان المنفذ المضيف الآخر بالإضافة إلى شهادة ssl
    $context_option = array(
        'socket' => array(
            // يجب أن يكون IP هو IP بطاقة الشبكة المحلية، ويجب أن يكون قادرًا على الوصول إلى المضيف الآخر، وإلا فإنه غير صالح
            'bindto' => '114.215.84.87:2333',
        ),
        // خيارات ssl، راجع https://php.net/manual/zh/context.ssl.php
        'ssl' => array(
            // مسار الشهادة المحلية. يجب أن تكون بتنسيق PEM ويجب أن تحتوي على الشهادة والسرية المحلية.
            'local_cert'        => '/your/path/to/pemfile',
            // كلمة مرور ملف local_cert.
            'passphrase'        => 'your_pem_passphrase',
            // ما إذا كان يجب السماح بالشهادات الموقعة ذاتيًا.
            'allow_self_signed' => true,
            // ما إذا كان ينبغي التحقق من شهادة SSL.
            'verify_peer'       => false
        )
    );

    // بدء الاتصال غير المتزامن
    $con = new AsyncTcpConnection('ws://echo.websocket.org:443', $context_option);

    // ضبط الوصول بطريقة ssl مشفرة
    $con->transport = 'ssl';

    $con->onConnect = function(AsyncTcpConnection $con) {
        $con->send('hello');
    };

    $con->onMessage = function(AsyncTcpConnection $con, $data) {
        echo $data;
    };

    $con->connect();
};

Worker::runAll();