Menggunakan persekitaran: thinkphp5.0
Keperluan projek
Buat pesanan di bahagian hadapan, terima di bahagian belakang dan buat gesaan serta-merta. Contohnya: Meituan Takeaway, selepas pelanggan berjaya membuat pesanan, pedagang akan segera mendapat gesaan suara untuk menerima pesanan.
Persekitaran pembangunan
- thinkphp5.0
- phpsocketio
(Memandangkan perkhidmatan soket perlu bermula, Perlu digunakan dalam persekitaran yang boleh memuaskan hati shell)
Kelebihan Socketio
Lagipun, saya belum belajar socketio secara mendalam, jadi ia hanya ringkasan ringkas:
- Kurangkan beban IO pelayan
- Nisbah sambungan panjang
ajax
Tinjauan lebih dipercayai - Perkhidmatan ini stabil dan menyokong dinamik
Selepas melihat sekilas, saya mendapati bahawa penggunaan memori adalah sangat kecil dan hanya terdapat satu proses Menurut laporan rasmi, satu proses boleh menampung konkurensi tinggi 10,000 orang, jadi ia adalah. lebih daripada cukup untuk projek saya
Dokumen Rasmi
https://github.com/walkor/php...
Mulakan pembangunan
Pasang phpsocketio
CD pertama ke direktori akar projek thinkphp. Gunakan arahan berikut
composer require workerman/phpsocket.io
(komposer tidak akan menerangkannya di sini. Jika ada sebarang masalah, sila tanya saya dan ia harus diselesaikan)
Selepas pemasangan, pergi ke folder vendor
Perlu ada folder pekerja di bawah Jika ia wujud, tahniah, ia telah dipasang
Fail kemasukan perkhidmatan
Kembali ke direktori akar projek dan. buat socketio.php
baharu. Mula mengedit
#!/usr/bin/env php <?php define('APP_PATH', __DIR__ . '/application/'); define('BIND_MODULE','socketio/Server/index'); // 加载框架引导文件 require __DIR__ . '/thinkphp/start.php';
Selagi anda selesai menulis di sini, tidak mengapa. Untuk semua perkara seterusnya, anda boleh mengabaikan kewujudannya
Cipta pengawal perkhidmatan
Dalam fail socketio.php
dalam langkah sebelumnya, modul terikat kepada 'socketio/Server/index'
, di sini Kita perlu menciptanya secara manual. Untuk memahami, saya menggunakan direktori untuk memaparkan
├─application 应用目录 │ ├─socketio 新创建目录 │ │ ├─controller │ │ │ ├─Server.php 启动文件
Server.php
Fail kemasukan hanya terikat pada pengawal ini, jadi ini adalah teras keseluruhan socketio.
<?php /* * (c) U.E Dream Development Studio * * Author: 李益达 - Ekey.Lee <ekey.lee@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace app\socketio\controller; require_once VENDOR_PATH . "workerman/phpsocket.io/src/autoload.php"; use PHPSocketIO\SocketIO; use Workerman\Worker; class Server { public function index() { $io = new SocketIO(8080);//socket的端口 $io->on('workerStart', function () use ($io) { $inner_http_worker = new Worker('http://0.0.0.0:5880');//这里IP不用改变,用的内网通讯,端口不能与socket端口想通 $inner_http_worker->onMessage = function ($http_connection, $data) use ($io) { $io->emit('new_msg', '44444');//这里写了固定数据,请根据自己项目需求去做调整,不懂这里的可以看看官方文档,很清楚 $http_connection->send('ok'); }; $inner_http_worker->listen(); }); // 当有客户端连接时 $io->on('connection', function ($socket) use ($io) { // 定义chat message事件回调函数 $socket->on('chat message', function ($msg) use ($io) { // 触发所有客户端定义的chat message from server事件 $io->emit('chat message from server', $msg); }); }); Worker::runAll(); } }
Buat API untuk mencetus socketio
Begitu juga anda boleh mencipta pengawal API baharu di bawah socketio, ini untuk ujian sahaja
public function api() { // 推送的url地址,使用自己的服务器地址 $push_api_url = "http://0.0.0.0:5880";//这里同样不需要更改IP。只是端口一定需要和server.php onworker的一样 $post_data = array( "type" => "publish", "content" => "这个是推送的测试数据", ); $ch = curl_init (); curl_setopt ( $ch, CURLOPT_URL, $push_api_url ); curl_setopt ( $ch, CURLOPT_POST, 1 ); curl_setopt ( $ch, CURLOPT_HEADER, 0 ); curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 ); curl_setopt ( $ch, CURLOPT_POSTFIELDS, $post_data ); curl_setopt ($ch, CURLOPT_HTTPHEADER, array("Expect:")); $return = curl_exec ( $ch ); curl_close ( $ch ); var_export($return); }
Sekarang kita mempunyai server
pelayan dan API
hujung pencetus, kami perlu memaparkannya seterusnya, iaitu bahagian hadapan kami
hujung hadapan
perlu menulis sekarang Iaitu, gesaan yang diterima oleh peniaga. Pelayan server
yang ditulis sebelum ini menyediakan perkhidmatan pemantauan dan soket phpsocketio API
menyediakan pencetus peristiwa, iaitu pencetus selepas seseorang membuat pesanan digunakan sebagai peristiwa untuk mencetuskan soket pelayan, membolehkan dia bertindak balas hujung hadapan
Sila ambil perhatian sebelum memulakan kod: port dan nama domain di sini mengelirukan
<script src='//cdn.bootcss.com/socket.io/1.3.7/socket.io.js'></script> <script> // 连接服务端 var socket = io('http://xxxx.com:8080');//这里请填写你的域名,外网,端口为socket端口 // 后端推送来消息时 socket.on('new_msg', function (msg) {//这里的new_msg请一定要注意,官方文档都写的是content,但是后端发送的自定义是new_msg,后端定义成new_msg,前端却接受content的字段。所以是接受不了的 swal({ title: "包厢点餐提醒", text: "哆啦a梦包厢有新订单" }) //console.log("收到消息:" + msg); }); </script>
Terdapat dua tempat di mana saya mengalami masalah sebelum ini
- Nama port dan domain: nama domain adalah luaran Nama domain rangkaian sudah tentu mestilah di bawah IP yang sama dengan perkhidmatan soket anda, iaitu: soket anda digunakan di bawah IP
114.114.114.114
. Nama domain ini mestilah di bawah IP114.114.114.114
. Port ialah portnew SocketIO
dalam perkhidmatan hujung belakang. -
socket.on()
Dokumen adalah semuasocket.on('content',function(msg){....})
, tetapi anda boleh melihat$io->emit('new_msg', '');
acara tersuai dalam Server.php kami di sini dengan jelas dipanggilnew_msg
, tetapi ia ditulis sebagaicontent
, mungkin saya mempunyai penglihatan yang lemah dan tidak dapat melihatnya dengan jelas, tetapi saya ingin mengingatkan anda bahawa anda mesti memberi perhatian kepada nama acara panggil balik
Selepas penggunaan, mula berjalan
Kini semua fail adalah Selepas penggunaan, masukkan pengurusan pelayan dan buka shell
. cd
Pergi ke direktori akar projek. Kemudian laksanakan
php socketio.php start
php socketio.php start 启动 |
---|
php socketio.php stop 停止 |
---|
php socketio.php restart 重启 |
---|
php socketio.php status 当前服务状态 |
---|
Ringkasan
Kali ini hanya ringkasan kerja, kerana masa adalah ketat untuk saya Saya tidak mengkaji lebih lanjut mengenai socketio mungkin terdapat beberapa kelemahan di dalamnya, tetapi saya 100% menjamin bahawa ini adalah ujian peribadi saya, saya telah melangkah melalui perangkap yang disebutkan langkah demi langkah. Jika ada apa-apa yang salah, sila beritahu saya ^_^