<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>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] # Swoole 的運行模式 ****** 注:以下內容主要指:`SwooleServer`。 <br /> ## Swoole 做了什么 `Swoole` 是 php 的一個擴展,但是他又不是普通的擴展,其最明顯的特點就是:**一旦運行后就會接管 PHP 的控制權,進入事件循環。當某種 IO 事件發生時,`Swoole` 會回調開發者設置的指定 PHP 函數。** 也就是說 `SwooleServer` 更像是一個用 `C` 語言封裝好的一個 `Tcp/Udp` 支持 `多線程`,`EventLoop`,`事件驅動`,`異步` 等功能的框架。開發者不需要關心底層的各種實現,直接在業務層面進行開發即可。 <br /> ## 什么是 IO 事件 很多 php 程序員沒有使用過其他語言開發 Server,也不太了解除了 php-fpm 以外運行模式的 php 程序,初次使用 Swoole 時總是會有各種摸不到頭腦的事情。其實 IO 我們經常提起如:`磁盤 IO`,`網絡 IO`,在這里 Swoole 所指的 IO 時間實際上指 `網絡 IO` 事件。 在日常生活中你留下了一個郵箱,當有人給你發送郵件的時候,你就會收到郵件提醒;而對于你而言,你并不關心郵件時如何送達的,你只關心你有沒有收到郵件,當你收到郵件之后會根據郵件的內容和發送人去做各種各樣的處理。在這個比喻中,**Swoole 就承擔了底層網絡事件的監聽及各種底層事件處理,當收到郵件(請求)時,會觸發收件(接收)提醒,然后將控制權轉交給你(預先注冊的事件回調函數),來進行后續的處理。** <br /> ## Swoole 的運行流程 ### 初始化 ```php <?php // new 一個SwooleServer 對象 并指定監聽端口和運行模式 以及 socket 類型 // 此時的一切一切都是開發者進行配置的時間,沒有任何其他事情發生 $server = new Swoole\Server('0.0.0.0', 9501, SWOOLE_PROCESS, SWOOLE_SOCK_TCP); // 設置運行參數,就像你平時做的那樣,給 $server 對象配置相關的參數 $server->set([ 'worker_num' => 4, // 工作進程數量 'daemonize' => true, // 是否以守護進程模式運行 'backlog' => 128, // listen 隊列長度 ]); // 注冊時間回調函數 // 這里指 當底層Tcp新連接進入事件時,交給 Tcp 類的 onConnect 靜態方法處理 $server->on('Connect', [Tcp::class, 'onConnect']); // 這里指 當收到數據時 交給 Tcp 類的 onReceive 靜態方法處理 $server->on('Receive', [Tcp::class, 'onReceive']); // 這里指 當 Tcp 客戶端連接關閉時,交給 Tcp 類的 onClose 靜態方法處理 $server->on('Close', [Tcp::class, 'onClose']); ``` 在上面的示例當中,實際上 Swoole 還尚未啟動,但是我們已經預先配置了許多必要的配置條件。鑒于有的新人還尚不了解什么叫做 `回調函數`,在這里我簡單的講解一下: > 所謂的 `回調函數(Callback)` 就好比是張開了夾子的捕鼠器,我們設定當有老鼠踩到捕鼠器的時候,他會關閉夾子然后捉住老鼠,我們放置捕鼠器的時候,捕鼠器并沒有真的抓老鼠。這個設定就是回調,他不立刻執行,會在遇到觸發條件(事件)時執行,在上面的示例當中我們放置了3個捕鼠器(回調函數),我們只需要知道他會在特定老鼠(事件)踩到的時候(發生的時候)去執行我們期待的功能就好。 <br /> ### Server start ```php <?php // 啟動 Swoole Server 將由 Swoole 接管php 運行 $server->start(); ``` 至此 Swoole 完全的接管了 php 的運行,并且監聽相應端口并當發生事件時去執行開發者自定義的事件回調。 <br /> ### 僅僅如此嗎? 事實上 Swoole 在啟動的時候做了非常多的事情: > Swoole 運行流程圖: > ![](https://box.kancloud.cn/2016-08-30_57c5268f86e00.jpg) > Swoole 進程關系圖: > ![](https://img.kancloud.cn/73/58/73588dc2dbec15058e07c252225e49f1_978x744.png) 上圖中我們可以了解,Swoole 會創建一個 `Manager` 進程專門管理 `Work` 和 `Task` 進程。而 `Work` 進程則直接通過 `Unix Socket` 和 `Master` 進程通訊。 <br /> ## 待續
                  <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>

                              哎呀哎呀视频在线观看