Rumah >rangka kerja php >ThinkPHP >Proses menyepadukan phpsocketio dengan thinkphp5 adalah satu perangkap yang saya sendiri pijak!

Proses menyepadukan phpsocketio dengan thinkphp5 adalah satu perangkap yang saya sendiri pijak!

藏色散人
藏色散人ke hadapan
2021-08-31 16:37:562578semak imbas

thinkphpLajur tutorial rangka kerja akan memperkenalkan anda kepada panduan lengkap untuk menyepadukan phpsocketio dengan thinkphp 5.0 Saya harap ia akan membantu rakan-rakan yang memerlukan!

Panduan lengkap untuk menyepadukan phpsocketio dengan thinkphp 5.0, mengelakkan perangkap

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 panjangajaxTinjauan 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(&#39;APP_PATH&#39;, __DIR__ . &#39;/application/&#39;);
define(&#39;BIND_MODULE&#39;,&#39;socketio/Server/index&#39;);
// 加载框架引导文件
require __DIR__ . &#39;/thinkphp/start.php&#39;;

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 &#39;socketio/Server/index&#39;, 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=&#39;//cdn.bootcss.com/socket.io/1.3.7/socket.io.js&#39;></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 IP 114.114.114.114. Port ialah port new SocketIO dalam perkhidmatan hujung belakang.
  • socket.on()Dokumen adalah semua socket.on('content',function(msg){....}), tetapi anda boleh melihat $io->emit('new_msg', ''); acara tersuai dalam Server.php kami di sini dengan jelas dipanggil new_msg, tetapi ia ditulis sebagai content, 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. cdPergi 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 ^_^

Atas ialah kandungan terperinci Proses menyepadukan phpsocketio dengan thinkphp5 adalah satu perangkap yang saya sendiri pijak!. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:segmentfault.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam