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

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # swoole_client swoole_client提供了tcp/udp socket的客戶端的封裝代碼,使用時僅需 new swoole_client 即可。 swoole的socket client對比PHP提供的stream族函數有哪些好處: * stream函數存在超時設置的陷阱和Bug,一旦沒處理好會導致Server端長時間阻塞 * fread有8192長度限制,無法支持UDP的大包 * swoole_client支持waitall,在知道包長度的情況下可以一次取完,不必循環取。 * swoole_client支持UDP connect,解決了UDP串包問題 * swoole_client是純C的代碼,專門處理socket,stream函數非常復雜。swoole_client性能更好 除了普通的同步阻塞+select的使用方法外,swoole_client還支持異步非阻塞回調。 [TOC=2,3] ## 同步阻塞客戶端 ```php $client = new swoole_client(SWOOLE_SOCK_TCP); if (!$client->connect('127.0.0.1', 9501, -1)) { exit("connect failed. Error: {$client->errCode}\n"); } $client->send("hello world\n"); echo $client->recv(); $client->close(); ``` swoole_client支持長連接形式的同步客戶端,方便在php-fpm環境中使用 ```php $cli = new swoole_client(SWOOLE_TCP | SWOOLE_KEEP); ``` **SWOOLE_KEEP只允許用于同步客戶端** 加入SWOOLE_KEEP標志后,創建的TCP連接在PHP請求結束或者調用$cli->close時并不會關閉。下一次執行connect調用時會復用上一次創建的連接。長連接保存的方式默認是以ServerHost:ServerPort為key的(連接相同的host:port將復用已經存在的連接)。可以在第3個參數內指定key。 ```php swoole_client->__construct(int $sock_type, int $is_sync = SWOOLE_SOCK_SYNC, string $key); ``` **php-fpm/apache環境下只能使用同步客戶端** ## 異步非阻塞客戶端 ```php $client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC); $client->on("connect", function(swoole_client $cli) { $cli->send("GET / HTTP/1.1\r\n\r\n"); }); $client->on("receive", function(swoole_client $cli, $data){ echo "Receive: $data"; $cli->send(str_repeat('A', 100)."\n"); sleep(1); }); $client->on("error", function(swoole_client $cli){ echo "error\n"; }); $client->on("close", function(swoole_client $cli){ echo "Connection close\n"; }); $client->connect('127.0.0.1', 9501); ``` 異步客戶端只能使用在cli命令行環境 異步的swoole client的使用場景對于新手同學來說可能比較陌生,因為異步客戶端是不可以應用在apache或fpm中的,而且僅能用于cli環境 ## 并行調用 ~~~ int swoole_client_select(array &$read, array &$write, array &$error, float $timeout); ~~~ 別名swoole_select,swoole_client_select接受4個參數。 * $read, $write, $error 分別是可讀/可寫/錯誤的文件描述符。這3個參數必須是數組變量的引用。數組的元素必須為swoole_client對象。 1.8.6或更高版本可以支持swoole_process對象 * $timeout參數是select的超時時間,單位為秒,接受浮點數。 返回值 * 調用成功后,會返回事件的數量,并修改$read/$write/$error數組。使用foreach遍歷數組,然后執行$item->recv/$item->send來收發數據。或者調用$item->close()或unset($item)來關閉socket。 * swoole_client_select返回0表示在規定的時間內,沒有任何IO可用,select調用已超時。 **此函數可以用于Apache/PHP-fpm環境** ### swoole_client用法 ~~~ $clients = array(); for($i=0; $i< 20; $i++) { $client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_SYNC); //同步阻塞 $ret = $client->connect('127.0.0.1', 9501, 0.5, 0); if(!$ret) { echo "Connect Server fail.errCode=".$client->errCode; } else { $client->send("HELLO WORLD\n"); $clients[$client->sock] = $client; } } while (!empty($clients)) { $write = $error = array(); $read = array_values($clients); $n = swoole_client_select($read, $write, $error, 0.6); if ($n > 0) { foreach ($read as $index => $c) { echo "Recv #{$c->sock}: " . $c->recv() . "\n"; unset($clients[$c->sock]); } } } ~~~ ### swoole_process用法 ~~~ <?php $process = new swoole_process(function (swoole_process $worker) { echo "Worker: start. PID=" . $worker->pid . "\n"; sleep(2); $worker->write("hello master\n"); $worker->exit(0); }, false); $pid = $process->start(); $r = array($process); $write = $error = array(); $ret = swoole_select($r, $write, $error, 1.0);//swoole_select是swoole_client_select的別名 var_dump($ret); var_dump($process->read()); ~~~ ## 配置選項 Swoole\Client和Swoole\Http\Client可以使用set方法設置一些選項,啟用某些特性。 ### 結束符檢測 ~~~ $client->set(array( 'open_eof_check' => true, 'package_eof' => "\r\n\r\n", 'package_max_length' => 1024 * 1024 * 2, )) ~~~ ### 長度檢測 ~~~ $client->set(array( 'open_length_check' => 1, 'package_length_type' => 'N', 'package_length_offset' => 0, //第N個字節是包長度的值 'package_body_offset' => 4, //第幾個字節開始計算長度 'package_max_length' => 2000000, //協議最大長度 )); ~~~ ### Socket緩存區尺寸 ~~~ $client->set(array( 'socket_buffer_size' => 1024*1024*2, //2M緩存區 )); ~~~ 包括socket底層操作系統緩存區、應用層接收數據內存緩存區、應用層發送數據內存緩沖區 關閉Nagle合并算法 ~~~ $client->set(array( 'open_tcp_nodelay' => true, )); ~~~ ### SSL/TLS證書 ~~~ $client->set(array( 'ssl_cert_file' => $your_ssl_cert_file_path, 'ssl_key_file' => $your_ssl_key_file_path, )); ~~~ swoole-1.7.21或更高版本可用 ### 綁定IP和端口 機器有多個網卡的情況下,設置bind_address參數可以強制客戶端Socket綁定某個網絡地址。 設置bind_port可以使客戶端Socket使用固定的端口連接到外網服務器 ~~~ $client->set(array( 'bind_address' => '192.168.1.100', 'bind_port' => 36002, )); ~~~ swoole-1.8.5或更高版本可用 ### Socks5代理設置 ~~~ $client->set(array( 'socks5_host' => '192.168.1.100', 'socks5_port' => 1080, 'socks5_username' => 'username', 'socks5_password' => 'password', )); ~~~ socks5_username、socks5_password為可選參數 ### Http代理設置 ~~~ $client->set(array( 'http_proxy_host' => '192.168.1.100', 'http_proxy_port' => 1080, )); ~~~ 使用說明 目前支持open_length_check和open_eof_check2種自動協議處理功能,參考swoole_server中的配置選項 啟用了自動協議后,同步阻塞客戶端recv方法將不接受長度參數,每次必然返回一個完整的數據包 啟用了自動協議后,異步非阻塞客戶端onReceive每次必然返回一個完整的數據包
                  <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>

                              哎呀哎呀视频在线观看