Exemple de développement simple

Installation

Installer workerman
Dans un répertoire vide, exécutez
composer require workerman/workerman

Exemple 1 : Fournir un service Web via le protocole HTTP

Créer le fichier start.php

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

// Créer un Worker écoutant sur le port 2345, utilisant le protocole http
$http_worker = new Worker("http://0.0.0.0:2345");

// Démarrer 4 processus pour fournir des services
$http_worker->count = 4;

// Lors de la réception de données envoyées par le navigateur, répondre hello world au navigateur
$http_worker->onMessage = function(TcpConnection $connection, Request $request)
{
    // Envoyer hello world au navigateur
    $connection->send('hello world');
};

// Exécuter le worker
Worker::runAll();

Exécution en ligne de commande (pour les utilisateurs Windows, utilisez cmd命令行, idem ci-dessous)

php start.php start

Test

Supposons que l'IP du serveur soit 127.0.0.1

Accédez à l'URL http://127.0.0.1:2345 dans votre navigateur.

Remarque :

  1. Si vous ne parvenez pas à accéder, veuillez consulter la section Causes de l'échec de la connexion du client.

  2. Le serveur utilise le protocole http et ne peut communiquer que via le protocole http, d'autres protocoles comme websocket ne peuvent pas communiquer directement.

Exemple 2 : Fournir un service via le protocole WebSocket

Créer le fichier ws_test.php

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

// Remarque : ici, c'est différent de l'exemple précédent, utilisant le protocole websocket
$ws_worker = new Worker("websocket://0.0.0.0:2000");

// Démarrer 4 processus pour fournir des services
$ws_worker->count = 4;

// Lors de la réception des données envoyées par le client, retourner hello $data au client
$ws_worker->onMessage = function(TcpConnection $connection, $data)
{
    // Envoyer hello $data au client
    $connection->send('hello ' . $data);
};

// Exécuter le worker
Worker::runAll();

Exécution en ligne de commande

php ws_test.php start

Test

Ouvrez le navigateur Chrome, appuyez sur F12 pour ouvrir la console de débogage, dans l'onglet Console, entrez (ou placez le code ci-dessous dans une page html pour être exécuté en js)

// Supposons que l'IP du serveur soit 127.0.0.1
ws = new WebSocket("ws://127.0.0.1:2000");
ws.onopen = function() {
    alert("Connexion réussie");
    ws.send('tom');
    alert("Envoyer une chaîne au serveur : tom");
};
ws.onmessage = function(e) {
    alert("Message reçu du serveur : " + e.data);
};

Remarque :

  1. Si vous ne parvenez pas à accéder, veuillez consulter la section FAQ du manuel - Échec de la connexion.

  2. Le serveur utilise le protocole websocket et ne peut communiquer que via le protocole websocket, d'autres protocoles comme http ne peuvent pas communiquer directement.

Exemple 3 : Transmettre des données directement via TCP

Créer le fichier tcp_test.php

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

// Créer un Worker écoutant sur le port 2347, sans utiliser de protocole de couche d'application
$tcp_worker = new Worker("tcp://0.0.0.0:2347");

// Démarrer 4 processus pour fournir des services
$tcp_worker->count = 4;

// Lorsqu'un client envoie des données
$tcp_worker->onMessage = function(TcpConnection $connection, $data)
{
    // Envoyer hello $data au client
    $connection->send('hello ' . $data);
};

// Exécuter le worker
Worker::runAll();

Exécution en ligne de commande

php tcp_test.php start

Test : Exécution en ligne de commande
(L'effet suivant est celui de la ligne de commande linux, et diffère de celui de Windows)

telnet 127.0.0.1 2347
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
tom
hello tom

Remarque :

  1. Si vous ne parvenez pas à accéder, veuillez consulter la section FAQ du manuel - Échec de la connexion.

  2. Le serveur utilise le protocole TCP brut, et ne peut pas communiquer directement avec des protocoles comme websocket, http, etc.