亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

? PHP ????? Workerman Workerman? Laravel? ???? ??? ?? ??????? ?????.

Workerman? Laravel? ???? ??? ?? ??????? ?????.

Nov 22, 2019 pm 02:18 PM
workerman

下面由workerman php教程欄目給大家介紹workerman結(jié)合laravel開(kāi)發(fā)在線聊天應(yīng)用的方法,希望對(duì)需要的朋友有所幫助!

Workerman? Laravel? ???? ??? ?? ??????? ?????.

項(xiàng)目背景:

最近由于公司的業(yè)務(wù)需求,需要用到聊天功能。而且有比較多的個(gè)性化需求需要定制。之前使用別人的聊天組件是基于微擎的。如果要移植到普通的H5在邏輯修改還有定制上存在比較多的困難。為此只能克服困難,自己搭建一個(gè)吧

什么是Workerman?

Workerman是一款開(kāi)源高性能異步PHP socket即時(shí)通訊框架。支持高并發(fā),超高穩(wěn)定性,被廣泛的用于手機(jī)app、移動(dòng)通訊,微信小程序,手游服務(wù)端、網(wǎng)絡(luò)游戲、PHP聊天室、硬件通訊、智能家居、車(chē)聯(lián)網(wǎng)、物聯(lián)網(wǎng)等領(lǐng)域的開(kāi)發(fā)。?

支持TCP長(zhǎng)連接,支持Websocket、HTTP等協(xié)議,支持自定義協(xié)議。擁有異步Mysql、異步Redis、異步Http、MQTT物聯(lián)網(wǎng)客戶端、異步消息隊(duì)列等眾多高性能組件。

開(kāi)始實(shí)戰(zhàn)吧!

1.第一步我們先把workerman里需要用到的擴(kuò)展composer下來(lái)吧

"workerman/gateway-worker": "^3.0",
"workerman/gatewayclient": "^3.0",
"workerman/workerman": "^3.5",

2.第二步我們到官方網(wǎng)站把demo全部下載下來(lái),然后放到我們項(xiàng)目中的目錄圖片中我就把整個(gè)項(xiàng)目都放在了HTTP/Controller/Workerman中。

Workerman? Laravel? ???? ??? ?? ??????? ?????.

3.第三步我們需要把把以下3個(gè)文件的引用部分修改為以下。

不然會(huì)報(bào)路徑錯(cuò)誤

start_businessworker,start_gateway,start_register
require_once __DIR__ . '/../../../../../vendor/autoload.php';

4.修改完成后我們就可以在liunx直接運(yùn)行對(duì)應(yīng)的啟動(dòng)文件

php start.php start -d
如果你是在window下就雙擊start_for_win.bat運(yùn)行

5.運(yùn)行成功后,你就應(yīng)該可以看到以下的界面到此我們搭建基于workerman的通信環(huán)境就已經(jīng)完成。

接下來(lái)我們就可以根據(jù)自己的項(xiàng)目需求進(jìn)行開(kāi)發(fā)。

在此向大家重點(diǎn)說(shuō)明。

我們所有的聊天是邏輯都在目錄中的Events.php進(jìn)行修改。


下面我給大家貼一下我編寫(xiě)的部分代碼。

Event.php

<?php
/**
 * This file is part of workerman.
 *
 * Licensed under The MIT License
 * For full copyright and license information, please see the MIT-LICENSE.txt
 * Redistributions of files must retain the above copyright notice.
 *
 * @author walkor<walkor@workerman.net>
 * @copyright walkor<walkor@workerman.net>
 * @link http://www.workerman.net/
 * @license http://www.opensource.org/licenses/mit-license.php MIT License
 */
/**
 * 用于檢測(cè)業(yè)務(wù)代碼死循環(huán)或者長(zhǎng)時(shí)間阻塞等問(wèn)題
 * 如果發(fā)現(xiàn)業(yè)務(wù)卡死,可以將下面declare打開(kāi)(去掉//注釋?zhuān)?,并?zhí)行php start.php reload
 * 然后觀察一段時(shí)間workerman.log看是否有process_timeout異常
 */
//declare(ticks=1);
/**
 * 聊天主邏輯
 * 主要是處理 onMessage onClose
 */
use \GatewayWorker\Lib\Gateway;
class Events
{
    /**
     * 作者:何志偉
     * 當(dāng)客戶端連接上來(lái)的時(shí)候
     * 創(chuàng)建時(shí)間:2018/10/25
     * @param $client_id 此ID為gatewayworker 自動(dòng)生成ID
     */
    public static function onConnect($client_id)
    {
        Gateway::sendToClient($client_id, json_encode(array(
            &#39;type&#39;      => &#39;init&#39;,
            &#39;client_id&#39; => $client_id
        )));
    }
    /**
     * 有消息時(shí)
     * @param int $client_id
     * @param mixed $message
     */
    public static function onMessage($client_id, $message)
    {
        // debug
        echo "client:{$_SERVER[&#39;REMOTE_ADDR&#39;]}:{$_SERVER[&#39;REMOTE_PORT&#39;]} gateway:{$_SERVER[&#39;GATEWAY_ADDR&#39;]}:{$_SERVER[&#39;GATEWAY_PORT&#39;]}  client_id:$client_id session:".json_encode($_SESSION)." onMessage:".$message."\n";
        // 客戶端傳遞的是json數(shù)據(jù)
        $message_data = json_decode($message, true);
        if(!$message_data)
        {
            return ;
        }
        // 根據(jù)類(lèi)型執(zhí)行不同的業(yè)務(wù)
        switch($message_data[&#39;type&#39;])
        {
            // 客戶端回應(yīng)服務(wù)端的心跳
            case &#39;pong&#39;:
                return;
            // 客戶端登錄 message格式: {type:login, name:xx, room_id:1} ,添加到客戶端,廣播給所有客戶端xx進(jìn)入聊天室
            case &#39;login&#39;:
                // 判斷是否有房間號(hào)
                if(!isset($message_data[&#39;room_id&#39;]))
                {
                    throw new \Exception("\$message_data[&#39;room_id&#39;] not set. client_ip:{$_SERVER[&#39;REMOTE_ADDR&#39;]} \$message:$message");
                }
                // 把房間號(hào)昵稱放到session中
                $room_id = $message_data[&#39;room_id&#39;];
                $client_name = htmlspecialchars($message_data[&#39;client_name&#39;]);
                $_SESSION[&#39;room_id&#39;] = $room_id;
                $_SESSION[&#39;client_name&#39;] = $client_name;
                // 獲取房間內(nèi)所有用戶列表
                $clients_list = Gateway::getClientSessionsByGroup($room_id);
                foreach($clients_list as $tmp_client_id=>$item)
                {
                    $clients_list[$tmp_client_id] = $item[&#39;client_name&#39;];
                }
//                $clients_list[$client_id] = $client_name;
                // 轉(zhuǎn)播給當(dāng)前房間的所有客戶端,xx進(jìn)入聊天室 message {type:login, client_id:xx, name:xx}
                $new_message = array(&#39;type&#39;=>$message_data[&#39;type&#39;], &#39;client_id&#39;=>$client_id, &#39;client_name&#39;=>htmlspecialchars($client_name), &#39;time&#39;=>date(&#39;Y-m-d H:i:s&#39;),&#39;to&#39;=>$message_data[&#39;to&#39;],&#39;room_id&#39;=>$message_data[&#39;room_id&#39;],
                    &#39;from&#39;=>$message_data[&#39;from&#39;],&#39;tag&#39;=>$message_data[&#39;tag&#39;]);
                Gateway::sendToGroup($room_id, json_encode($new_message));
                Gateway::joinGroup($client_id, $room_id);
                // 給當(dāng)前用戶發(fā)送用戶列表
                $new_message[&#39;client_list&#39;] = $clients_list;
                Gateway::sendToCurrentClient(json_encode($new_message));
                return;
            // 客戶端發(fā)言 message: {type:say, to_client_id:xx, content:xx}
            case &#39;say&#39;:
                // 非法請(qǐng)求
                if(!isset($_SESSION[&#39;room_id&#39;]))
                {
                    throw new \Exception("\$_SESSION[&#39;room_id&#39;] not set. client_ip:{$_SERVER[&#39;REMOTE_ADDR&#39;]}");
                }
                $room_id = $_SESSION[&#39;room_id&#39;];
                $client_name = $_SESSION[&#39;client_name&#39;];
                // 私聊
//                if($message_data[&#39;to_client_id&#39;] != &#39;all&#39;)
//                {
//                    $new_message = array(
//                        &#39;type&#39;=>&#39;say&#39;,
//                        &#39;from_client_id&#39;=>$client_id,
//                        &#39;from_client_name&#39; =>$client_name,
//                        &#39;to_client_id&#39;=>$message_data[&#39;to_client_id&#39;],
//                        &#39;content&#39;=>"<b>對(duì)你說(shuō): </b>".nl2br(htmlspecialchars($message_data[&#39;content&#39;])),
//                        &#39;time&#39;=>date(&#39;Y-m-d H:i:s&#39;),
//                    );
//                    Gateway::sendToClient($message_data[&#39;to_client_id&#39;], json_encode($new_message));
//                    $new_message[&#39;content&#39;] = "<b>你對(duì)".htmlspecialchars($message_data[&#39;to_client_name&#39;])."說(shuō): </b>".nl2br(htmlspecialchars($message_data[&#39;content&#39;]));
//                    return Gateway::sendToCurrentClient(json_encode($new_message));
//                }
                $new_message = array(
                    &#39;type&#39;=>&#39;say&#39;,
                    &#39;from_client_id&#39;=>$client_id,
                    &#39;from_client_name&#39; =>$client_name,
                    &#39;to_client_id&#39;=>&#39;all&#39;,
                    &#39;content&#39;=>nl2br(htmlspecialchars($message_data[&#39;content&#39;])),
                    &#39;time&#39;=>date(&#39;Y-m-d H:i:s&#39;),
                );
                return Gateway::sendToGroup($room_id ,json_encode($new_message));
        }
    }
    /**
     * 當(dāng)客戶端斷開(kāi)連接時(shí)
     * @param integer $client_id 客戶端id
     */
    public static function onClose($client_id)
    {
        // debug
        echo "client:{$_SERVER[&#39;REMOTE_ADDR&#39;]}:{$_SERVER[&#39;REMOTE_PORT&#39;]} gateway:{$_SERVER[&#39;GATEWAY_ADDR&#39;]}:{$_SERVER[&#39;GATEWAY_PORT&#39;]}  client_id:$client_id onClose:&#39;&#39;\n";
        // 從房間的客戶端列表中刪除
        if(isset($_SESSION[&#39;room_id&#39;]))
        {
            $room_id = $_SESSION[&#39;room_id&#39;];
            $new_message = array(&#39;type&#39;=>&#39;logout&#39;, &#39;from_client_id&#39;=>$client_id, &#39;from_client_name&#39;=>$_SESSION[&#39;client_name&#39;], &#39;time&#39;=>date(&#39;Y-m-d H:i:s&#39;));
            Gateway::sendToGroup($room_id, json_encode($new_message));
        }
    }
}

客戶端頁(yè)面

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>與{{$to->name}}的對(duì)話</title>
    <script type="text/javascript" src="{{asset(&#39;js&#39;)}}/swfobject.js"></script>
    <script type="text/javascript" src="{{asset(&#39;js&#39;)}}/web_socket.js"></script>
    <script type="text/javascript" src="{{asset(&#39;js&#39;)}}/jquery.min.js"></script>
    <link href="{{asset(&#39;css&#39;)}}/jquery-sinaEmotion-2.1.0.min.css" rel="stylesheet">
    <link href="{{asset(&#39;css&#39;)}}/bootstrap.min.css" rel="stylesheet">
    <link href="{{asset(&#39;css&#39;)}}/style.css" rel="stylesheet">
    <script type="text/javascript" src="{{asset(&#39;js&#39;)}}/jquery-sinaEmotion-2.1.0.min.js"></script>
    {{--<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>--}}
</head>
<style>
    #sinaEmotion {
        z-index: 999;
        width: 373px;
        padding: 10px;
        display: none;
        font-size: 12px;
        background: #fff;
        overflow: hidden;
        position: absolute;
        border: 1px solid #e8e8e8;
        top: 100px;
        left: 542.5px;
    }
</style>
<body onload="connect();" style="margin: auto; text-align: center;">
<div style="margin: auto;">
    <div style="border: 1px solid red; height: 40px; width: 500px; margin: auto;">
        {{--對(duì)話窗口頭部--}}
        <div>
            <div style="width: 80px; height: 40px; border: 1px solid blue; float: left">
                <img  src="/static/imghw/default1.png"  data-src="{{$to- alt="Workerman? Laravel? ???? ??? ?? ??????? ?????." >heading}}"  class="lazy"   width="80px" height="40px">
            </div>
            <div style="width: 150px; height: 40px; border: 1px solid blue; float: left">
                {{$to->name}}
            </div>
        </div>
        {{--//對(duì)話窗口內(nèi)容--}}
        <div style="width: 500px; height: 400px; border: 1px solid green; margin-top: 40px; overflow-y: auto">
            {{--對(duì)方的頭像與文字--}}
            {{--<div style="min-height: 50px;margin-top: 10px;">--}}
                {{--<div style="width: 50px;height: 50px; border: 1px solid red;  margin-left:10px; float: left">--}}
                    {{--<img  src="/static/imghw/default1.png"  data-src="{{$to- alt="Workerman? Laravel? ???? ??? ?? ??????? ?????." >heading}}"  class="lazy"   width="50px" height="50px">--}}
                {{--</div>--}}
                {{--<div style="border: 1px solid red; float: left;  min-height: 50px" >dsadsadsadsadsa</div>--}}
            {{--</div>--}}
            {{--我的頭像與文字--}}
            {{--<div style= "min-height:50px;margin-top: 10px;">--}}
                {{--<div style="width: 50px;height: 50px; border: 1px solid red;  margin-left:10px; float: right">--}}
                    {{--<img  src="/static/imghw/default1.png"  data-src="{{$from- alt="Workerman? Laravel? ???? ??? ?? ??????? ?????." >heading}}"  class="lazy"   width="50px" height="50px">--}}
                {{--</div>--}}
                {{--<div style="border: 1px solid red; float: right;  min-height: 50px" >dsadsadsadsadsa</div>--}}
            {{--</div>--}}
        </div>
        {{--對(duì)話發(fā)送窗口--}}
        <form onsubmit="return onSubmit(); return false;" id="ajaxfrom">
            <input type="hidden" name="to" value="{{$to->id}}">
            <input type="hidden" name="from" value="{{$from->id}}">
            <input type="hidden" name="room_id" value="{{$room}}">
            <input type="hidden" name="tag" value="{{$tag}}">
            <textarea id="textarea" name="content" style="margin: 0px; width: 501px; height: 213px;"></textarea>
            <div>
                <input type="button" class="btn btn-default face pull-left" value="表情" />
                <button type="submit" class="btn btn-default">發(fā)表</button>
            </div>
        </form>
        房間號(hào){{$room}}
    </div>
</div>
</body>
</html>
<script type="text/javascript">
    if (typeof console == "undefined") {    this.console = { log: function (msg) {  } };}
    // 如果瀏覽器不支持websocket,會(huì)使用這個(gè)flash自動(dòng)模擬websocket協(xié)議,此過(guò)程對(duì)開(kāi)發(fā)者透明
    WEB_SOCKET_SWF_LOCATION = "/swf/WebSocketMain.swf";
    // 開(kāi)啟flash的websocket debug
    WEB_SOCKET_DEBUG = true;
    var ws, name, client_list={};
    var to_client_id="";
    // 連接服務(wù)端初始化函數(shù)
    function connect() {
        // 創(chuàng)建websocket 屆時(shí)可以替換為對(duì)應(yīng)的服務(wù)器地址
        ws = new WebSocket("ws://"+document.domain+":7272");
        // 當(dāng)socket連接打開(kāi)時(shí),輸入用戶名
        ws.onopen = onopen;
        // 當(dāng)有消息時(shí)根據(jù)消息類(lèi)型顯示不同信息
        ws.onmessage = onmessage;
        //當(dāng)連接丟失時(shí),調(diào)用連接方法嘗試重新連接
        ws.onclose = function() {
            console.log("連接關(guān)閉,定時(shí)重連");
            connect();
        };
        //當(dāng)操作報(bào)錯(cuò)時(shí),返回異常錯(cuò)誤
        ws.onerror = function() {
            console.log("出現(xiàn)錯(cuò)誤");
        };
        //發(fā)送ajax獲取當(dāng)前房間的通話記錄
        $.post("/get_record", { "room":"{{$room}}" },
            function(msg){
                $.each(msg,function (v,k) {
                    console.log(k);
                    //判斷
                    if(k.tag!="{{$tag}}"){
                        $(".content").append(
                            &#39;<div style="min-height: 50px;margin-top: 10px;">&#39; +
                            &#39;<div style="width: 50px;height: 50px; border: 1px solid red;  margin-left:10px; float: left">&#39;+
                            &#39;<img  src="/static/imghw/default1.png"  data-src="{{$to- alt="Workerman? Laravel? ???? ??? ?? ??????? ?????." >heading}}"  class="lazy"   width="50px" height="50px">&#39;+
                            &#39;</div>&#39;+
                            &#39;<div style="border: 1px solid red; float: left;  min-height: 50px" >&#39;+k.content+&#39;</div>&#39;+
                            &#39;<div>&#39;
                        ).parseEmotion();
                    }else{
                        $(".content").append(
                            &#39;<div style="min-height: 50px;margin-top: 10px;">&#39; +
                            &#39;<div style="width: 50px;height: 50px; border: 1px solid red;  margin-left:10px; float: right">&#39;+
                            &#39;<img  src="/static/imghw/default1.png"  data-src="{{$from- alt="Workerman? Laravel? ???? ??? ?? ??????? ?????." >heading}}"  class="lazy"   width="50px" height="50px">&#39;+
                            &#39;</div>&#39;+
                            &#39;<div style="border: 1px solid red; float: right;  min-height: 50px" >&#39;+k.content+&#39;</div>&#39;+
                            &#39;<div>&#39;
                        ).parseEmotion();
                    }
                })
            });
    }
    // 連接建立時(shí)發(fā)送登錄信息
    function onopen()
    {
        var login_data=&#39;{"type":"login","client_name":"{{$from->name}}","room_id":"{{$room}}","to":"{{$to->id}}","from":"{{$from->id}}","tag":"{{$tag}}"}&#39;;
        ws.send(login_data);
        console.log(&#39;登錄成功&#39;)
    }
    // 服務(wù)端發(fā)來(lái)消息時(shí)
    function onmessage(e)
    {
        var data = JSON.parse(e.data);
        switch(data[&#39;type&#39;]){
            // 服務(wù)端ping客戶端心跳
            case &#39;ping&#39;:
                ws.send(&#39;{"type":"pong"}&#39;);
                break;
            // 登錄 更新用戶列表
            case &#39;login&#39;:
                //講需要的發(fā)送ID保存到本地to_client_id變量中
                for(var p in data[&#39;client_list&#39;]){
                    to_client_id=p;
                }
                console.log(to_client_id);
                break;
            // 發(fā)言
            case &#39;say&#39;:
                console.log(data);
                say(data[&#39;from_client_id&#39;], data[&#39;from_client_name&#39;], data[&#39;content&#39;], data[&#39;time&#39;]);
                break;
            // 用戶退出 更新用戶列表
            case &#39;logout&#39;:
                console.log(data);
                break;
            case &#39;init&#39;:
                //此處可以發(fā)送ajax用于綁定不同的用戶ID和client
                console.log(data);
                break;
        }
    }
    // 提交對(duì)話
    function onSubmit() {
        //先檢查當(dāng)前的對(duì)話是否超過(guò)20條記錄數(shù)
        var count=true;
        //發(fā)送ajax獲取當(dāng)前房間的通話記錄
        $.ajax({
            url: "/check_count",
            type: "post",
            async:false,
            // cache: false,
            // contentType: false,
            // processData: false,
            data:{
            &#39;room&#39;:"1",
            },
            success: function (msg) {
                if(msg>10){
                    alert(&#39;當(dāng)前的對(duì)話已經(jīng)超過(guò)次數(shù),請(qǐng)購(gòu)買(mǎi)對(duì)應(yīng)服務(wù)&#39;)
                    count=false;
                }
            }
        });
        if(count){
            var neirong=$("#textarea").val().replace(/"/g, &#39;\\"&#39;).replace(/\n/g,&#39;\\n&#39;).replace(/\r/g, &#39;\\r&#39;);
            //ajax先把對(duì)應(yīng)的內(nèi)容發(fā)送到后臺(tái)錄入,回調(diào)成功后才把信息發(fā)送
            var fm=$("#ajaxfrom")[0];
            var formData = new FormData(fm);
            $.ajax({
                url: "/record",
                type: "post",
                cache: false,
                contentType: false,
                processData: false,
                data: formData,
                beforeSend:function(){
                },
                success: function (msg) {
                    if(msg.code=="0"){
                        ws.send(&#39;{"type":"say","to_client_id":"all","to_client_name":"{{$to->name}}","content":"&#39;+neirong+&#39;"}&#39;);
                        //清空文本框內(nèi)容
                        $("#textarea").val("");
                        //強(qiáng)制定位光標(biāo)
                        $("#textarea").focus();
                    }else{
                    }
                }
            });
        }
        return false;
    }
    // 發(fā)言
    function say(from_client_id, from_client_name, content, time){
        //判斷當(dāng)前的用戶名稱與發(fā)送消息的名稱是否一致
        if( "{{$from->name}}" == from_client_name){
            $(".content").append(
                &#39;<div style="min-height: 50px;margin-top: 10px;">&#39; +
                &#39;<div style="width: 50px;height: 50px; border: 1px solid red;  margin-left:10px; float: right">&#39;+
                &#39;<img  src="/static/imghw/default1.png"  data-src="{{$from- alt="Workerman? Laravel? ???? ??? ?? ??????? ?????." >heading}}"  class="lazy"   width="50px" height="50px">&#39;+
                &#39;</div>&#39;+
                &#39;<div style="border: 1px solid red; float: right;  min-height: 50px" >&#39;+content+&#39;</div>&#39;+
                &#39;<div>&#39;
            ).parseEmotion();
        }else{
            $(".content").append(
                &#39;<div style="min-height: 50px;margin-top: 10px;">&#39; +
                &#39;<div style="width: 50px;height: 50px; border: 1px solid red;  margin-left:10px; float: left">&#39;+
                &#39;<img  src="/static/imghw/default1.png"  data-src="{{$to- alt="Workerman? Laravel? ???? ??? ?? ??????? ?????." >heading}}"  class="lazy"   width="50px" height="50px">&#39;+
                &#39;</div>&#39;+
                &#39;<div style="border: 1px solid red; float: left;  min-height: 50px" >&#39;+content+&#39;</div>&#39;+
                &#39;<div>&#39;
            ).parseEmotion();
        }
        // $("#dialog").append(&#39;<div><img  src="/static/imghw/default1.png"  data-src="http://lorempixel.com/38/38/?&#39;+from_client_id+&#39;"  class="lazy"   / alt="Workerman? Laravel? ???? ??? ?? ??????? ?????." > &#39;+from_client_name+&#39; <br> &#39;+time+&#39;<div   style="max-width:90%"></div><p class="triangle-isosceles top">&#39;+content+&#39;</p> </div>&#39;).parseEmotion();
    }
    $(function(){
        //全局用戶ID
        select_client_id = &#39;all&#39;;
        //如果發(fā)送的用戶有變化則對(duì)應(yīng)的用戶ID進(jìn)行替換
        $("#client_list").change(function(){
            select_client_id = $("#client_list option:selected").attr("value");
        });
        //表情選擇
        $(&#39;.face&#39;).click(function(event){
            $(this).sinaEmotion();
            event.stopPropagation();
        });
    });
    // document.write(&#39;<meta name="viewport" content="width=device-width,initial-scale=1">&#39;);
    $("textarea").on("keydown", function(e) {
        //按enter鍵自動(dòng)提交
        if(e.keyCode === 13 && !e.ctrlKey) {
            e.preventDefault();
            $(&#39;form&#39;).submit();
            return false;
        }
        // 按ctrl+enter組合鍵換行
        if(e.keyCode === 13 && e.ctrlKey) {
            $(this).val(function(i,val){
                return val + "\n";
            });
        }
    });
</script>

復(fù)制代碼這兩個(gè)代碼片段其實(shí)就是主要運(yùn)行的核心片段。其他框架的自帶參數(shù)需要各位自己去根據(jù)文檔去調(diào)試優(yōu)化。到此基于workerman的聊天用于功能demo已經(jīng)搭建完畢。

? ??? Workerman? Laravel? ???? ??? ?? ??????? ?????.? ?? ?????. ??? ??? PHP ??? ????? ?? ?? ??? ?????!

? ????? ??
? ?? ??? ????? ???? ??? ??????, ???? ?????? ????. ? ???? ?? ???? ?? ??? ?? ????. ???? ??? ???? ???? ??? ?? admin@php.cn?? ?????.

? AI ??

Undresser.AI Undress

Undresser.AI Undress

???? ?? ??? ??? ?? AI ?? ?

AI Clothes Remover

AI Clothes Remover

???? ?? ???? ??? AI ?????.

Video Face Swap

Video Face Swap

??? ??? AI ?? ?? ??? ???? ?? ???? ??? ?? ????!

???

??? ??

???++7.3.1

???++7.3.1

???? ?? ?? ?? ???

SublimeText3 ??? ??

SublimeText3 ??? ??

??? ??, ???? ?? ????.

???? 13.0.1 ???

???? 13.0.1 ???

??? PHP ?? ?? ??

???? CS6

???? CS6

??? ? ?? ??

SublimeText3 Mac ??

SublimeText3 Mac ??

? ??? ?? ?? ?????(SublimeText3)

???

??? ??

??? ????
1597
29
PHP ????
1488
72
???
Workerman ???? ?? ??? ? ???? ?? Workerman ???? ?? ??? ? ???? ?? Nov 08, 2023 pm 06:02 PM

Workerman ???? ?? ??? ? ????? ????? ?? ?? ??? ?????. ??: Workerman? ???? ????? ???? ?? ??? PHP ??? ???? ?? ????????. ?? ???? ?? ??? ? ????? ???? ?? ?? ?????. ? ????? Workerman ?????? ???? ?? ??? ? ????? ???? ??? ???? ???? ?? ??? ?????. 1. ?? ???: ?? ???? ?? ???? ?? ??? ??? ???? ??? ????. ??? ?????

??? ??? ? ?? ?? ? ???? ??? ??? ? ?? ?? ? ???? Apr 09, 2024 pm 07:00 PM

Swoole? Workerman? ?? ??? PHP ?? ????????. ??? ??, ??? ?? ? ????? ? ??? Swoole? ?? ?? ?? ??? ?? ???? ???? ?? ????? ?????. Workerman? ?? ???? ?? ??? ??? ???? ????? ? ??? ???? API? ?? ???? ? ??? ??? ???? ?????.

Workerman ??? ?? ???? ???? ?? Workerman ??? ?? ???? ???? ?? Nov 08, 2023 am 11:46 AM

Workerman ??? ?? ???? ???? ?? ??: Workerman? ???? ???? ?? ???? ??????? ?? ???? ? ??? ?? ??? PHP ?? ????????. ? ????? ?? ? ??, ??? ? ?? ?? ??, ????? ?? ?? ? Workerman? ?? ???? ?????. ??? ?? ?? ??? ??????. 1. Workerman? ???? ????? ???? ?? ??? ?????.

Workerman ???? ??? ??? ???? ?? Workerman ???? ??? ??? ???? ?? Nov 08, 2023 pm 05:06 PM

Workerman ???? ??? ??? ???? ?? Workerman? ??? ??? ??? ??? ??? ???? ??? PHP ??? ???? ?? ????????. ???? ???? ??? ?? ?? ??? ??? ?????. ?? ??? ?? ? ??? ?? ?????? ????? ?? ?????. ????? Workerman?? ??? ??? ???? ??? ??? ???? ???? ?? ??? ???????. 1??: Workerman ?? ?? Worker? ???? ???.

??? ??: UDP ???? ?? ??? ???? ?? ?? ??? ??: UDP ???? ?? ??? ???? ?? ?? Nov 08, 2023 am 08:03 AM

Workerman ??: UDP ???? ?? ??? ???? ??: ? ???? Workerman ?????? ???? UDP ???? ?? ??? ???? ??? ???? ??? ?????. UDP ????? ??? ????? ???? ?? ??? ?? ????? ??? ??? ?? ?? ??????? ???? ??? ?????. ??: ???? ???? ??? ????? ?? ??? ?????. ?? TCP ????? ??? ?? ?? ?? ? ?? ?? ?? ??? ??? ? ????. ??? UDP

Workerman ???? ??? ??? ??? ???? ?? Workerman ???? ??? ??? ??? ???? ?? Nov 08, 2023 pm 03:46 PM

Workerman ???? ??? ??? ??? ????? ???? ?? ??? ?????. ??: Workerman? ??? ??? ??? ??? ???? ??? PHP ?? ???? ???? ?? ?????? ? ??? ?? ? ?? ??? ?? ?????. ??. ? ? Workerman? ??? ?? ???? ??? ? ?? ???? ?? ??? ??? ??? ? ?? ??? ??? ??? ?????. ? ???? Workerman? ???? ??? ??? ??? ???? ??? ?????.

Workerman? ???? ???? ?? ??? ???? ???? ?? Workerman? ???? ???? ?? ??? ???? ???? ?? Nov 07, 2023 pm 01:16 PM

Workerman? ???? ???? ?? ??? ???? ????? ?? ?? ??? ?????. ?? ?? ????? ???? ??? ???? ?? ?? ? ?? ????? ??????? ?? ?? ?? ??? ???? ???. ????? ???? ???? ?? ?? ??? ???? ?? ?? ?? ? ??? ?????. ? ????? PHP ?? ?? ?????? Workerman? ???? ???? ?? ??? ???? ???? ??? ???? ???? ?? ??? ?????. 1. WorkermanWorke ??

Workerman ??? ?? ?? ?? ?? Workerman ??? ?? ?? ?? ?? Nov 08, 2023 pm 03:39 PM

Workerman? PHP? ???? ??? ??? ??? ??? ?? ?????? TCP/UDP ?????? ? ?? ??? ?? ??? ? ????. ?? Workerman? ??? ?? ??, ??? ?? ?? ?????? ??? ? ?? ?? ?? ?? ??? ?????. ? ???? Workerman?? ?? ?? ??? ???? ??? ???? ???? ?? ??? ?????. 1. ?? ??? ?? ?? ??? ??? ???? ???? ?????? ???? ??? ??? ??? ??, ??? ?? ????.

See all articles