Exemple de développement simple
Installation
Installer Workerman
Exécutez dans un répertoire vide
composer require workerman/workerman
Exemple 1 : Fournir des services Web via le protocole HTTP
Créez le fichier start.php
<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
require_once __DIR__ . '/vendor/autoload.php';
// Crée un worker écoutant sur le port 2345, utilisant le protocole http
$http_worker = new Worker("http://0.0.0.0:2345");
// Lance 4 processus pour fournir des services
$http_worker->count = 4;
// Lorsqu'il reçoit des données envoyées par le navigateur, il répond "hello world" au navigateur
$http_worker->onMessage = function(TcpConnection $connection, Request $request)
{
// Envoie "hello world" au navigateur
$connection->send('hello world');
};
// Lance le worker
Worker::runAll();
Exécutez dans le terminal (pour les utilisateurs de Windows, utilisez l'invite de commande cmd)
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 un navigateur
Remarque :
- Si l'accès échoue, veuillez vous référer à la section Raisons de l'échec de la connexion du client pour déboguer.
- Le serveur utilise le protocole http, et peut uniquement communiquer avec le protocole http. Il n'est pas possible de communiquer directement avec d'autres protocoles tels que websocket.
Exemple 2 : Fournir des services via le protocole WebSocket
Créez le fichier ws_test.php
<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
// Remarque : ici, contrairement à l'exemple précédent, le protocole utilisé est websocket
$ws_worker = new Worker("websocket://0.0.0.0:2000");
// Lance 4 processus pour fournir des services
$ws_worker->count = 4;
// Lorsqu'il reçoit des données de la part du client, il renvoie "hello $data" au client
$ws_worker->onMessage = function(TcpConnection $connection, $data)
{
// Envoie "hello $data" au client
$connection->send('hello ' . $data);
};
// Lance le worker
Worker::runAll();
Exécutez dans le terminal
php ws_test.php start
Test
Ouvrez Google Chrome, appuyez sur F12 pour ouvrir la console de débogage, saisissez (ou insérez le code ci-dessous dans une page html et exécutez-le avec javascript)
// 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("Envoi d'une chaîne au serveur : tom");
};
ws.onmessage = function(e) {
alert("Message reçu du serveur : " + e.data);
};
Remarque :
- Si l'accès échoue, veuillez vous référer à la section Problèmes courants - Echec de la connexion pour déboguer.
- Le serveur utilise le protocole websocket, et peut uniquement communiquer avec le protocole websocket. Il n'est pas possible de communiquer directement avec d'autres protocoles tels que http.
Exemple 3 : Utiliser directement la transmission de données TCP
Créez le fichier tcp_test.php
<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
// Crée un Worker écoutant sur le port 2347, sans utiliser de protocole de couche application
$tcp_worker = new Worker("tcp://0.0.0.0:2347");
// Lance 4 processus pour fournir des services
$tcp_worker->count = 4;
// Lorsqu'il reçoit des données du client
$tcp_worker->onMessage = function(TcpConnection $connection, $data)
{
// Envoie "hello $data" au client
$connection->send('hello ' . $data);
};
// Lance le worker
Worker::runAll();
Exécutez dans le terminal
php tcp_test.php start
Test : exécutez dans le terminal
(L'effet en ligne de commande sur Linux ci-dessous est légèrement différent de celui sous 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 :
- Si l'accès échoue, veuillez vous référer à la section Problèmes courants - Echec de la connexion pour déboguer.
- Le serveur utilise le protocole TCP brut, et ne peut communiquer directement avec d'autres protocoles tels que websocket, http, etc.