<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                # Swoole編程指南-EOF協議 [原文鏈接](http://www.catplanet.me/?id=12) [TOC] ## 什么是EOF協議 EOF(End of File)是一個結束標記,意思為在逐個讀取數據流中的數據時,如果發現讀到EOF標記,就代表已經讀到了數據末尾。在TCP的數據流中,使用EOF協議的數據流特征如下: > | 數據 | EOF | 數據 |EOF| 在每一串正常數據的末尾,添加一個預先規定的、絕對不會出現在數據中的字符串作為結束標記。這樣接收到的數據就可以根據這個EOF標記來切分數據。 ## 開啟EOF支持 在Swoole中,可以使用如下配置選項來開啟EOF功能: ``` $server->set([ 'open_eof_split' => true, // 開啟EOF檢測 'package_eof' => '/r/n' , // 設置EOF標記 ]); ``` 其中,open_eof_split選項會開啟Swoole底層對接收到的數據從頭開始依次掃描檢查,當找到第一個EOF標記時,將已經掃描過的數據作為一個完整的數據包通過onReceive回調發送給PHP層處理。這里需要注意的是,package_eof只允許設置長度不超過8的字符串。 這里要注意到,open_eof_split選項是依次掃描數據中的EOF標記的,這樣雖然保證每次回調都只會收到一個完整的數據包,但是性能較差。因此Swoole還提供了另外一個不同的選項: ``` $server->set([ 'open_eof_check' => true, // 開啟EOF檢測 ]); ``` open_eof_check同樣會開啟EOF檢測。不同的是,open_eof_check只檢查接收數據的末尾是否為EOF標記。相比于open_eof_split,這種方式性能最好,幾乎沒有損耗。但是如果同時收到了N條帶有EOF標記的數據,這種方式會同時將N個數據包合并為一個回調給PHP層處理,因此需要在PHP層通過EOF標記對數據做二次拆分。 ## 實戰 為了演示效果,我將直接使用open_eof_check選項,并演示如何拆分數據包。 首先是服務器端代碼,如下: ``` class Server { private $serv; public function __construct() { $this->serv = new swoole_server("0.0.0.0", 9501); $this->serv->set(array( 'worker_num' => 1, 'open_eof_check' => true, 'package_eof' => "\r\n", )); $this->serv->on('Connect', array($this, 'onConnect')); $this->serv->on('Receive', array($this, 'onReceive')); $this->serv->on('Close', array($this, 'onClose')); $this->serv->start(); } public function onConnect( $serv, $fd, $from_id ) { echo "Client {$fd} connect\n"; } public function onReceive( swoole_server $serv, $fd, $from_id, $data ) { $data_list = explode("\r\n", $data); foreach ($data_list as $item) { if(empty($item)) continue; var_dump($item); $serv->send($fd, $item . "\r\n"); } } public function onClose( $serv, $fd, $from_id ) { echo "Client {$fd} close connection\n"; } } new Server(); ``` 可以看到,在接收到數據后,我先將接收到的數據用EOF標記作為分隔符做了一次拆分,這樣就能得到一個個獨立的完整數據包,然后依次處理即可。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看