Workerman ialah rangka kerja pembangunan PHP berprestasi tinggi dan versi PHP pelayan Socket Ia dicirikan oleh prestasi tinggi, konkurensi tinggi, penggunaan rendah dan penggunaan mudah. Dalam proses membangunkan pelayan Socket menggunakan Workerman, parsing paket adalah bahagian yang sangat penting. Artikel ini akan memperkenalkan kaedah pelaksanaan penghuraian paket dalam dokumen Workerman dan memberikan contoh kod khusus.
Dalam Workerman, penghuraian paket dilaksanakan melalui panggilan balik acara. Apabila pelayan menerima data yang dihantar oleh klien, ia akan mencetuskan fungsi panggil balik Pembangun perlu melaksanakan logik penghuraian paket data dalam fungsi panggil balik ini.
Pertama, kita perlu mendaftar fungsi panggil balik untuk menerima data yang dihantar oleh pelanggan. Kodnya adalah seperti berikut:
use WorkermanWorker; $worker = new Worker('tcp://0.0.0.0:1234'); // 当客户端连接上来时 $worker->onConnect = function($connection) { echo "New Connection "; }; // 当客户端发来数据时 $worker->onMessage = function($connection, $data) { // 在这里实现数据包的解析逻辑 // ... }; // 运行worker Worker::runAll();
Dalam fungsi panggil balik acara onMessage
, kami boleh menghuraikan data yang diterima. Berikut mengambil protokol mudah sebagai contoh untuk menghuraikan paket data panjang tetap. Dengan mengandaikan bahawa panjang setiap paket data ialah 20 bait tetap, kodnya adalah seperti berikut: onMessage
事件回调函数中,我们可以对接收到的数据进行解析。下面以一个简单的协议为例,解析固定长度的数据包。假设每个数据包的长度都是固定的20字节,代码如下所示:
$worker->onMessage = function($connection, $data) { // 先判断数据长度是否满足条件 if (strlen($data) < 20) { echo "Invalid Data Length "; return; } // 截取前20个字节作为一个完整的数据包 $packet = substr($data, 0, 20); // 处理数据包的逻辑 // ... };
上述代码中,首先判断接收到的数据的长度是否满足20字节,如果不满足,则说明接收到的数据不完整,需要等待后续数据再进行解析。然后,通过substr
函数截取前20个字节作为一个完整的数据包,可以在// 处理数据包的逻辑
处对数据包进行处理。
除了固定长度的数据包,还有一种常见的数据包格式是以特定的字符串作为分隔符。例如,多个JSON格式的数据包用换行符`
`分隔,代码示例如下:
$worker->onMessage = function($connection, $data) { // 按换行符分割数据 $packets = explode(" ", $data); // 遍历每个数据包 foreach ($packets as $packet) { // 处理数据包的逻辑 // ... } };
上述代码中,我们通过explode
rrreee
Dalam kod di atas, tentukan dahulu sama ada panjang data yang diterima memenuhi 20 bait Jika tidak, ia menunjukkan bahawa panjang data yang diterima ialah 20 bait Data tidak lengkap dan perlu menunggu data seterusnya sebelum menghuraikan. Kemudian, 20 bait pertama dipintas sebagai paket data lengkap melalui fungsi substr
, dan paket data boleh diproses pada //logik pemprosesan paket data
.
Selain paket data panjang tetap, terdapat juga format paket data biasa yang menggunakan rentetan tertentu sebagai pembatas. Contohnya, berbilang paket data dalam format JSON dipisahkan oleh aksara baris baharu `
` Contoh kod adalah seperti berikut:rrreee
Dalam kod di atas, kami menggunakan fungsiexplode
untuk memisahkan data. dengan aksara baris baharu `🎜` Pisahkannya kepada paket, kemudian lintasi setiap paket dan proseskannya. 🎜🎜Perlu diingatkan bahawa dalam pembangunan sebenar, logik penghuraian paket data mungkin lebih kompleks, jadi di atas hanyalah beberapa contoh mudah, dan penghuraian paket data khusus perlu dikembangkan mengikut situasi sebenar. 🎜🎜Ringkasnya, Workerman melaksanakan penghuraian paket melalui panggilan balik acara dengan sangat mudah. Pembangun hanya perlu menghuraikan data mengikut peraturan protokol dalam fungsi panggil balik yang sepadan untuk melengkapkan penghuraian paket data. 🎜Atas ialah kandungan terperinci Kaedah pelaksanaan penghuraian paket dalam dokumen Workerman. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!