宅男在线永久免费观看网直播,亚洲欧洲日产国码无码久久99,野花社区在线观看视频,亚洲人交乣女bbw,一本一本久久a久久精品综合不卡

全部
常見問(wèn)題
產(chǎn)品動(dòng)態(tài)
精選推薦

PHP Swoole 基本使用

管理 管理 編輯 刪除

95cbb20230925173414209.png

圖片來(lái)自互聯(lián)網(wǎng),侵權(quán)聯(lián)系刪除

背景

在項(xiàng)目中,我們使用了PHP語(yǔ)言,但由于存在長(zhǎng)耗時(shí)的任務(wù),所以需要服務(wù)器端異步響應(yīng)。為了實(shí)現(xiàn)異步響應(yīng),我們有多種方案可選,包括MQ(消息隊(duì)列)、fsocket(文件套接字)、Swoole等。

其中,Swoole是一個(gè)使用純C語(yǔ)言編寫的工具,它提供了PHP語(yǔ)言的異步多線程服務(wù)器、異步TCP/UDP網(wǎng)絡(luò)客戶端、異步MySQL、異步Redis、數(shù)據(jù)庫(kù)連接池、AsyncTask、消息隊(duì)列、毫秒定時(shí)器、異步文件讀寫、異步DNS查詢等功能。此外,Swoole還內(nèi)置了Http/WebSocket服務(wù)器端/客戶端以及Http2.0服務(wù)器端。

最重要的是,Swoole完美支持PHP語(yǔ)言。因此,我們選擇使用Swoole搭建了一個(gè)異步服務(wù)器,以實(shí)現(xiàn)異步響應(yīng)、推送、定時(shí)任務(wù)等一系列工作。

安裝

Swoole是用C語(yǔ)言編寫的,并且需要通過(guò)編譯安裝來(lái)進(jìn)行安裝。

安裝前請(qǐng)確保已經(jīng)安裝以下依賴項(xiàng):

- PHP 5.3.10或更高版本

- GCC 4.4或更高版本

- make

- autoconf

- pcre(對(duì)于CentOS系統(tǒng),可以執(zhí)行命令:yum install pcre-devel來(lái)安裝)

安裝步驟如下:

1. 執(zhí)行命令`phpize`(如果命令不存在,請(qǐng)使用實(shí)際的PHP路徑來(lái)執(zhí)行此命令)

2. 運(yùn)行命令`./configure`

3. 執(zhí)行命令`make`

4. 使用sudo權(quán)限運(yùn)行命令`make install`

安裝完成后,需要在php.ini文件中添加Swoole擴(kuò)展:

extension=swoole.so

使用

服務(wù)端

class Server{
    private $serv;
    public function __construct() {
        $this->serv = new swoole_server("0.0.0.0", 9501);
        $this->serv->set(array(
 
            //'worker_num' => 1,  //一般設(shè)置為服務(wù)器CPU數(shù)的1-4倍
 
            'daemonize' => 1,  //以守護(hù)進(jìn)程執(zhí)行
            'max_request' => 10000,
            'task_worker_num' => 1,  //task進(jìn)程的數(shù)量
 
            "task_ipc_mode " => 3 ,  //使用消息隊(duì)列通信,并設(shè)置為爭(zhēng)搶模式
            'open_length_check'    => true,
            'dispatch_mode'        => 1,
 
            'package_length_type'  => 'N',  //這個(gè)很關(guān)鍵,定位包頭的
            'package_length_offset' => 0,      //第N個(gè)字節(jié)是包長(zhǎng)度的值
            'package_body_offset'  => 4,      //第幾個(gè)字節(jié)開始計(jì)算長(zhǎng)度
 
            'package_max_length'    => 2000000,  //協(xié)議最大長(zhǎng)度
            "log_file" => "/tmp/swoole_test.log"  //日志
 
        ));
 
        $this->serv->on('Receive', array($this, 'onReceive'));
        $this->serv->on('Task', array($this, 'onTask'));
        $this->serv->on('Finish', array($this, 'onFinish'));
        $this->serv->start();
 
    }
 
    public function onReceive( swoole_server $serv, $fd, $from_id, $data ) {
 
        //放入任務(wù)隊(duì)列,開始執(zhí)行
        $task_id = $serv->task( $data );
 
    }
 
    public function onTask($serv,$task_id,$from_id, $data) {
      //做一些事情
 
    }

客戶端

class Client{
 
    private $client, $ip, $port, $params;
 
    public function __construct($ip, $port, $params)
    {
 
        $this->ip = $ip;
        $this->port = $port;
        $this->params = $params;
 
        $this->client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);
        $this->client->set(array(
            'open_length_check'    => true,
            'package_length_type'  => 'N',
            'package_length_offset' => 0,      //第N個(gè)字節(jié)是包長(zhǎng)度的值
            'package_body_offset'  => 4,      //第幾個(gè)字節(jié)開始計(jì)算長(zhǎng)度
            'package_max_length'    => 2000000,  //協(xié)議最大長(zhǎng)度
 
        ));
 
        //設(shè)置事件回調(diào)函數(shù)
 
        $this->client->on('Connect', array($this, 'onConnect'));
        $this->client->on('Receive', array($this, 'onReceive'));
        $this->client->on('Close', array($this, 'onClose'));
        $this->client->on('Error', array($this, 'onError'));
 
        //發(fā)起網(wǎng)絡(luò)連接
        $this->client->connect($ip, $port, 3);
    }
 
    public function onReceive( $cli, $data ) {
        echo "Received: " . $data . "\n";
 
    }
 
    public function onConnect($cli) {
 
        $data = pack('N', strlen($data)) . $data;
        $cli->send($data);
        $cli->close();
 
    }
 
    public function onClose( $cli)
    {
        echo "Connection close\n";
    }
 
    public function onError()
    {
        echo "Connect failed\n";
    }
 
}

注意問(wèn)題

'open_length_check'    => true,
'package_length_type'  => 'N',
'package_length_offset' => 0,      //第N個(gè)字節(jié)是包長(zhǎng)度的值
'package_body_offset'  => 4,      //第幾個(gè)字節(jié)開始計(jì)算長(zhǎng)度
'package_max_length'    => 2000000,  //協(xié)長(zhǎng)度

這幾個(gè)是定義幀定界的,因?yàn)镾woole的客戶端和服務(wù)器端通信是TCP連接的,因此得給幀定界符,有多種幀定界方式,具體參考Swoole官方文檔。這里其中是用頭額外加長(zhǎng)度的方式。

請(qǐng)登錄后查看

CRMEB-慕白寒窗雪 最后編輯于2023-09-25 17:34:54

快捷回復(fù)
回復(fù)
回復(fù)
回復(fù)({{post_count}}) {{!is_user ? '我的回復(fù)' :'全部回復(fù)'}}
排序 默認(rèn)正序 回復(fù)倒序 點(diǎn)贊倒序

{{item.user_info.nickname ? item.user_info.nickname : item.user_name}} LV.{{ item.user_info.bbs_level || item.bbs_level }}

作者 管理員 企業(yè)

{{item.floor}}# 同步到gitee 已同步到gitee {{item.is_suggest == 1? '取消推薦': '推薦'}}
{{item.is_suggest == 1? '取消推薦': '推薦'}}
沙發(fā) 板凳 地板 {{item.floor}}#
{{item.user_info.title || '暫無(wú)簡(jiǎn)介'}}
附件

{{itemf.name}}

{{item.created_at}}  {{item.ip_address}}
打賞
已打賞¥{{item.reward_price}}
{{item.like_count}}
{{item.showReply ? '取消回復(fù)' : '回復(fù)'}}
刪除
回復(fù)
回復(fù)

{{itemc.user_info.nickname}}

{{itemc.user_name}}

回復(fù) {{itemc.comment_user_info.nickname}}

附件

{{itemf.name}}

{{itemc.created_at}}
打賞
已打賞¥{{itemc.reward_price}}
{{itemc.like_count}}
{{itemc.showReply ? '取消回復(fù)' : '回復(fù)'}}
刪除
回復(fù)
回復(fù)
查看更多
打賞
已打賞¥{{reward_price}}
1146
{{like_count}}
{{collect_count}}
添加回復(fù) ({{post_count}})

相關(guān)推薦

快速安全登錄

使用微信掃碼登錄
{{item.label}} 加精
{{item.label}} {{item.label}} 板塊推薦 常見問(wèn)題 產(chǎn)品動(dòng)態(tài) 精選推薦 首頁(yè)頭條 首頁(yè)動(dòng)態(tài) 首頁(yè)推薦
取 消 確 定
回復(fù)
回復(fù)
問(wèn)題:
問(wèn)題自動(dòng)獲取的帖子內(nèi)容,不準(zhǔn)確時(shí)需要手動(dòng)修改. [獲取答案]
答案:
提交
bug 需求 取 消 確 定
打賞金額
當(dāng)前余額:¥{{rewardUserInfo.reward_price}}
{{item.price}}元
請(qǐng)輸入 0.1-{{reward_max_price}} 范圍內(nèi)的數(shù)值
打賞成功
¥{{price}}
完成 確認(rèn)打賞

微信登錄/注冊(cè)

切換手機(jī)號(hào)登錄

{{ bind_phone ? '綁定手機(jī)' : '手機(jī)登錄'}}

{{codeText}}
切換微信登錄/注冊(cè)
暫不綁定
CRMEB客服

CRMEB咨詢熱線 咨詢熱線

400-8888-794

微信掃碼咨詢

CRMEB開源商城下載 源碼下載 CRMEB幫助文檔 幫助文檔
返回頂部 返回頂部
CRMEB客服