Heim >Backend-Entwicklung >PHP-Tutorial >Wie sollte Swoole als Socket-Long-Connection-Server proaktiv eine Nachricht an den verbundenen Benutzer mit Benutzer-UID = 123 senden?

Wie sollte Swoole als Socket-Long-Connection-Server proaktiv eine Nachricht an den verbundenen Benutzer mit Benutzer-UID = 123 senden?

WBOY
WBOYOriginal
2016-08-04 09:22:091228Durchsuche

Nun, das sollte eine Frage für Anfänger sein, aber nachdem ich die Dokumentation gelesen habe, komme ich immer noch nicht dahinter.

Antwortinhalt:

Nun, das sollte eine Frage für Anfänger sein, aber nachdem ich die Dokumentation gelesen habe, komme ich immer noch nicht dahinter.

PHPs Socket ist ein Ressourcentyp:
resource(4) vom Typ (Socket), das heißt, jedes Socket-Handle sieht gleich aus. .

Der fd des Linux-C-Sockets ist eine Ganzzahl, die jeweils eine andere Zahl ist.

Natives PHP kann nicht „aktiv eine Nachricht an den verbundenen Benutzer mit Benutzer-UID=123 senden“,
aber mit Hilfe des mit Linux C implementierten Swoole-Sockets können wir „aktiv eine Nachricht an den verbundenen Benutzer senden“ erreichen. Kommen Sie vorbei, der Benutzer mit Benutzer-UID=123, senden Sie eine Nachricht.

Hier können wir den einfachsten gemeinsamen Speicher von System V verwenden, um Daten-IPC zwischen Prozessen zu teilen und eine Zuordnungstabelle zwischen Benutzer-IDs und ihren Socket-Verbindungen zu verwalten.

Der Code lautet wie folgt:

<code><?php

$serv = new swoole_server("127.0.0.1", 1024);
$serv->set(array(
    'worker_num' => 8,   //工作进程数量
    'daemonize' => false, //是否作为守护进程
));

$shmid = shm_attach(getmypid(), 1024*66); # allocate 66kB for shared memory
define("SHARED_UID_CONNECTION_MAP", 12);
shm_put_var($shmid,SHARED_UID_CONNECTION_MAP, []);

$serv->on('connect', function ($serv, $fd) use($shmid) {
    echo "Client:Connect.\n";
});

$serv->on('receive', function ($serv, $fd, $from_id, $data) use($shmid)  {

    $serv->send($fd, 'Swoole: '.$data);
    // $serv->close($fd);

    $trimdata = trim($data);
    if ($trimdata == 'i am lucky man') {
        $map = shm_get_var($shmid,SHARED_UID_CONNECTION_MAP);
        $map[] = $fd;   #$map[$uidFromData] = $fd;
        shm_put_var($shmid,SHARED_UID_CONNECTION_MAP, $map);
    }


    if ($trimdata == 'broadcast to lucky man') {
        $map = shm_get_var($shmid,SHARED_UID_CONNECTION_MAP);
        // var_dump($map); $ $map is array whose valuse is int $fd
        foreach($map as $fd) {
            $serv->send($fd, "some body broadcast to you luck man");
        }
    }

    # broadcast to all users
    // $start_fd = 0;
    // while(true)
    // {
    //     $conn_list = $serv->connection_list($start_fd, 10);
    //     if($conn_list===false or count($conn_list) === 0)
    //     {
    //         echo "finish\n";
    //         break;
    //     }
    //     $start_fd = end($conn_list);
    //     var_dump($conn_list);
    //     foreach($conn_list as $fd)
    //     {
    //         $serv->send($fd, "broadcast");
    //     }
    // }

    // var_dump($serv->connections);
    // foreach ($serv->connections as $k => $v) {
    //    $lk = [$k,$v];
    //    var_dump($lk);
    // }

});
$serv->on('close', function ($serv, $fd) {
    echo "Client: Close.\n";
});
$serv->start();

</code>

Dann können Sie n Clients öffnen, um den Code zu testen. Ich öffne beispielsweise 3 Telnets 127.0.0.1 1024. Der letzte sendet eine Nachricht an den Server „Ich habe Glück, Mann“, und der erste sendet „Broadcast“. an den Server. An den Glückspilz“, dann erhält der Dritte „eine Nachricht an den Glückspilz“, um eine Nachricht an einen bestimmten Benutzer zu senden

So einfach ist das,
Swoole ist eine großartige Methode, asynchroner IO-Mehrprozess ist auch die ausgereifteste Endlösung (Hommage an Nginx)
Hahaha

uid ist nur die von Ihnen identifizierte UID. Sie können nur über diese eindeutige ID Nachrichten an den Client senden. Das ist alles.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn