Dengan perkembangan pesat Internet, pembangunan aplikasi web telah menjadi semakin biasa. Dalam aplikasi web ini, mekanisme tolak mesej telah menjadi bahagian penting. Mekanisme tolak mesej membolehkan kami menolak mesej secara aktif dari bahagian belakang ke bahagian hadapan, yang boleh menjadikan interaktiviti aplikasi web lebih kaya, masa nyata dan cekap.
Untuk melaksanakan mekanisme tolak mesej dalam PHP, anda perlu menggunakan teknologi WebSocket. WebSocket boleh mewujudkan sambungan berterusan supaya pelayan boleh menghantar mesej kepada klien pada bila-bila masa, dan klien juga boleh menghantar mesej kepada pelayan. Dalam PHP, terdapat beberapa perpustakaan WebSocket yang sangat baik tersedia. Dalam artikel ini, kami akan memperkenalkan cara menggunakan PHP untuk melaksanakan fungsi push mesej.
1. Gunakan pustaka Workerman untuk melaksanakan push mesej
Workerman ialah rangka kerja tak segerak berprestasi tinggi yang dijalankan dalam persekitaran PHP rangka kerja PHP YII yang terkenal. Rangka kerja melaksanakan sokongan untuk WebSocket melalui penggunaan sambungan soket PHP, dan atas dasar ini melaksanakan keupayaan untuk mengendalikan protokol TCP/UDP.
Di bawah, kami akan menunjukkan langkah khusus untuk melaksanakan push mesej dengan menggunakan pustaka Workerman:
Gunakan dalam baris arahan Perintah berikut memasang pustaka Workerman:
composer require workerman/workerman
Sebelum mencipta pelayan WebSocket, anda perlu memperkenalkan fungsi autoloading ke dalam Persekitaran berlari pekerja. Kaedah memperkenalkan fungsi pemuatan automatik adalah seperti berikut:
require_once __DIR__ . '/vendor/autoload.php';
Selepas memperkenalkan fungsi pemuatan automatik, anda boleh membuat instantiate pelayan WebSocket. Kodnya adalah seperti berikut:
use Workerman\Worker; use Workerman\Lib\Timer; $ws_worker = new Worker("websocket://0.0.0.0:2346"); //配置参数 $ws_worker->count = 4; $ws_worker->name = 'WebSocket'; //连接事件 $ws_worker->onConnect = function($connection) { echo "New connection\n"; }; //关闭事件 $ws_worker->onClose = function($connection) { echo "Connection closed\n"; }; //消息事件 $ws_worker->onMessage = function($connection, $data) { echo "Received: ".$data."\n"; }; Worker::runAll();
Dalam kod di atas, kami membuat instantiate pelayan WebSocket dan menetapkan alamat dan port pendengaran (port 2346 digunakan di sini). Selepas itu, kami menetapkan bilangan pelayan, nama mereka, acara sambungan, acara penutupan dan acara mesej.
Adalah perlu untuk menentukan bilangan proses pekerja untuk dimulakan, kerana sama ada ia boleh menyokong sejumlah besar sambungan dan kelajuan serta bilangan pemprosesan penghantaran dan penerimaan mesej masa nyata adalah berkaitan dengan bilangan proses .
Selepas mencipta pelayan WebSocket, anda perlu menggunakan arahan berikut dalam baris arahan untuk memulakan pelayan WebSocket:
php websocket.php start
Selepas , pelayan WebSocket dimulakan.
Selepas pelayan WebSocket dimulakan, kita perlu menolak mesej kepada pelanggan. Kaedah menolak mesej adalah seperti berikut:
foreach($ws_worker->connections as $connection) { $connection->send('Welcome!'); }
Dalam kod di atas, kami melintasi semua sambungan pada pelayan dan menghantar mesej kepada mereka (mesej yang dihantar di sini ialah 'Selamat Datang!').
2. Gunakan perpustakaan Ratchet untuk melaksanakan push mesej
Ratchet ialah perpustakaan WebSocket yang dibangunkan menggunakan PHP, yang membolehkan PHP melakukan komunikasi dua hala masa nyata. Ratchet menyediakan pelaksanaan pelayan WebSocket dan klien WebSocket, dan fungsinya sangat berkuasa.
Langkah khusus untuk menggunakan perpustakaan Ratchet untuk melaksanakan push mesej adalah seperti berikut:
Gunakan arahan berikut dalam baris arahan untuk memasang perpustakaan Ratchet:
composer require cboden/ratchet
Sama seperti menggunakan perpustakaan Workerman untuk melaksanakan push mesej, kita juga perlu mencipta Pelayan WebSocket dahulu apabila menggunakan perpustakaan Ratchet. Kod tersebut adalah seperti berikut:
use Ratchet\MessageComponentInterface; use Ratchet\ConnectionInterface; require dirname(__DIR__) . '/vendor/autoload.php'; class Pusher implements MessageComponentInterface { private $clients; public function __construct() { $this->clients = new \SplObjectStorage; } public function onOpen(ConnectionInterface $conn) { $this->clients->attach($conn); echo "New connection! ({$conn->resourceId})\n"; } public function onMessage(ConnectionInterface $from, $msg) { echo "New message received! ({$from->resourceId})\n"; $numRecv = count($this->clients) - 1; foreach ($this->clients as $client) { if ($from !== $client) { $client->send($msg); } } } public function onClose(ConnectionInterface $conn) { $this->clients->detach($conn); echo "Connection {$conn->resourceId} has disconnected\n"; } public function onError(ConnectionInterface $conn, \Exception $e) { echo "An error has occurred: {$e->getMessage()}\n"; $conn->close(); } } $server = IoServer::factory( new HttpServer( new WsServer( new Pusher() ) ), 19920//端口号 ); $server->run();
Dalam kod di atas, kami melaksanakan pelayan WebSocket dan mengeluarkan status sambungan kepada klien dalam acara onOpen(), memproses mesej push dalam acara onMessage(), dan acara onClose() untuk mengeluarkan status terputus, dan acara onError() untuk mengeluarkan maklumat ralat.
Selepas mencipta pelayan WebSocket, anda perlu menggunakan arahan berikut dalam baris arahan untuk memulakan pelayan WebSocket:
php websocket.php
Selepas , pelayan WebSocket dimulakan.
Selepas pelayan WebSocket dimulakan, kita perlu menolak mesej kepada pelanggan. Kaedah menolak mesej adalah seperti berikut:
$this->clients->remove($conn); foreach ($this->clients as $client) { if ($from !== $client) { $msg = $from->resourceId.":".$msg; $client->send($msg); } }
Dalam kod di atas, kami melintasi semua sambungan pada pelayan dan menghantar mesej kepada mereka (mesej yang dihantar di sini ialah 'Selamat Datang!').
Perhatikan bahawa mesej tolak dalam pustaka Ratchet adalah berbeza daripada mesej tolak dalam pustaka Workerman. Khususnya, pustaka Workerman menggunakan kaedah $connection->send()
, manakala pustaka Ratchet menggunakan kaedah $client->send()
. Kaedah menolak mesej juga berbeza antara perpustakaan yang berbeza.
3. Ringkasan
Di atas ialah kaedah khusus menggunakan PHP untuk melaksanakan mekanisme tolak mesej. Melalui kaedah ini, kami boleh menolak mesej secara proaktif dari bahagian belakang ke bahagian hadapan, dengan itu mencapai interaksi masa nyata, cekap dan kaya dengan aplikasi web. Apabila menggunakan kaedah ini, kita perlu memberi perhatian kepada perbezaan dan ciri antara setiap perpustakaan WebSocket, dan menggunakannya secara fleksibel untuk mesej push yang lebih baik.
Atas ialah kandungan terperinci Cara menggunakan PHP untuk melaksanakan fungsi push mesej. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!