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

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 2.0.1-Alpha Swoole-2.0 提供了**PHP原生協程調度器**,PHP代碼可以按照同步方式編寫,底層引擎使用異步IO,調度器會在IO完成后自動切換PHP函數調用棧。 內置協程不依賴PHP的[Yield/Generator](http://php.net/manual/zh/language.generators.syntax.php)語法,實現了真正的同步代碼,異步IO。Swoole-2.0兼容[Swoole-1.0](http://www.swoole.com/)所有現存特性,同時支持同步阻塞、異步非阻塞回調、協程 3 種 IO 模型。 協程可以理解為用戶態線程,通過**協作**而不是搶占來進行切換。相對于操作系統進程或者線程,協程所有的操作都可以在用戶態完成,創建和切換的消耗更低。Swoole可以為每一個請求創建對應的協程,根據IO的狀態來合理地調度協程。 Swoole-2.0內置協程的優勢: 1. 開發者可以使用最傳統的PHP同步編碼方式即可實現異步IO。過去使用Node.js和Swoole1.0編寫異步程序時必須使用嵌套回調,開發效率低,邏輯復雜之后開發維護都很困難。現在使用Swoole-2.0內置協程可以輕松編寫異步程序,徹底告別`Callback Hell`。 2. 由于Swoole-2.0是在底層封裝了協程,所以對比其他的PHP協程框架,如[TSF](https://github.com/tencent-php/tsf)、[Zan](http://zanphp.io/),開發者不需要額外使用`yield`關鍵詞來標識一個協程IO切換操作,所以不再需要對yield的語義進行深入理解以及對每一級的調用都修改為yield,這極大的提高了開發效率。 3. Swoole-2.0除了支持常見的如TCP、UDP、HTTP、Redis、MySQL協程客戶端之外,還支持并發Client,可以同時并發執行多個不同類型的協程客戶端調用,時間為Max(耗時最長Client的時間)。而Go語言需要使用非常復雜的`goroutine`+`chan`+`select`才能實現。Swoole-2.0的并發調用使用更加簡單。 ## 主要特性: - 底層內置協程,同步的代碼,異步的IO - TCP/UDP/UnixSocket協程客戶端`Swoole\Coroutine\Client` - Http/WebSocket協程客戶端`Swoole\Coroutine\HttpClient` - Redis協程客戶端`Swoole\Coroutine\Redis` - MySQL協程客戶端`Swoole\Coroutine\MySQL` - 并發Client - 支持異步超時 - 默認開啟命名空間 ## 要求: - 需要PHP5.5或更高版本 - 暫時不支持PHP7 - 服務器端基于`Swoole\Server`或者`Swoole\Http\Server`進行開發,目前僅支持在`onRequet`、`onReceive`、`onConnect`回調中使用協程 ## 安裝方式: Swoole-2.0需要通過添加`--enable-coroutine`編譯參數啟用協程能力,示例如下: ```shell phpize ./configure --with-php-config={path-to-php-config} --enable-coroutine make make install ``` 添加編譯參數,swoole server將切換到協程模式 ## 使用示例 ### TCP協程客戶端 ```php $client = new Swoole\Coroutine\Client(SWOOLE_SOCK_TCP); $client->connect('127.0.0.1', 9501, 0.5) //調用connect將觸發協程切換 $client->send("hello world\n"); echo $client->recv(); //調用recv將再次觸發協程切換 $client->close(); ``` ### Http協程客戶端 ```php $cli = new Swoole\Coroutine\Http\Client('127.0.0.1', 80); $cli->setHeaders([ 'Host' => "localhost", "User-Agent" => 'Chrome/49.0.2587.3', 'Accept' => 'text/html,application/xhtml+xml,application/xml', 'Accept-Encoding' => 'gzip', ]); $cli->set([ 'timeout' => 1]); $cli->get('/index.php'); echo $cli->body; $cli->close(); ``` ### Redis協程客戶端 ```php $redis = new Swoole\Coroutine\Redis(); $redis->connect('127.0.0.1', 6379); $val = $redis->get('key'); ``` ### MySQL協程客戶端 ```php $swoole_mysql = new Swoole\Coroutine\MySQL(); $swoole_mysql->connect(['host' => '127.0.0.1', 'user' => 'user', 'password' => 'pass', 'database' => 'test', ]); $res = $swoole_mysql->query('select sleep(1)'); ``` ### 并發調用 ```php $tcpclient = new Swoole\Coroutine\Client(SWOOLE_SOCK_TCP); $tcpclient->connect('127.0.0.1', 9501, 0.5) $tcpclient->send("hello world\n"); $redis = new Swoole\Coroutine\Redis(); $redis->connect('127.0.0.1', 6379); $redis->setDefer(); $redis->get('key'); $mysql = new Swoole\Coroutine\MySQL(); $mysql->connect(['host' => '127.0.0.1', 'user' => 'user', 'password' => 'pass', 'database' => 'test', ]); $mysql->setDefer(); $mysql->query('select sleep(1)'); $httpclient = new Swoole\Coroutine\Http\Client('0.0.0.0', 9599); $httpclient->setHeaders(['Host' => "api.mp.qq.com"]); $httpclient->set([ 'timeout' => 1]); $httpclient->setDefer(); $httpclient->get('/'); $tcp_res = $tcpclient->recv(); $redis_res = $redis->recv(); $mysql_res = $mysql->recv(); $http_res = $httpclient->recv(); ``` 通常,如果一個業務請求中需要做一次redis請求和一次mysql請求,那么網絡IO會是這樣: `redis發包->redis收包->mysql發包->mysql收包` 以上流程網絡IO的時間就等于 redis網絡IO時間 + mysql網絡IO時間。 而對于協程版本的Client,網絡IO可以是這樣: `redis發包->mysql發包->redis收包->mysql收包` 以上流程網絡IO的時間就接近于 `MAX(redis網絡IO時間, mysql網絡IO時間)`。 現在支持并發請求的Client有: * Swoole\Coroutine\Client * Swoole\Coroutine\Redis * Swoole\Coroutine\MySQL * Swoole\Coroutine\Http\Client 除了`Swoole\Coroutine\Client`,其他Client都實現了defer特性,用于聲明延遲收包。 ## 注意事項 1. 全局變量:協程使得原有的異步邏輯同步化,但是在協程的切換是隱式發生的,所以在協程切換的前后不能保證全局變量以及static變量的一致性。 2. 請勿在下列場景中調用協程客戶端: * 析構函數`__destruct()` * 魔術方法`__call()` 3. 當前版本為Alpha預覽版本,不建議在生產環境上使用 ## 使用新版本 - GitHub下載地址:[https://github.com/swoole/swoole-src/tree/2.0.1](https://github.com/swoole/swoole-src/tree/2.0.1) - 開源中國下載地址:[http://git.oschina.net/matyhtf/swoole/tree/2.0.1-alpha](http://git.oschina.net/matyhtf/swoole/tree/2.0.1-alpha) - Swoole2.0使用文檔:[http://wiki.swoole.com/wiki/page/p-coroutine.html](http://wiki.swoole.com/wiki/page/p-coroutine.html) ## 交流互助群 494412579 ![](http://www.swoole.com/static/uploads//wiki/201608/04/863670177591.jpg)
                  <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>

                              哎呀哎呀视频在线观看