<noframes id="bhrfl"><address id="bhrfl"></address>

    <address id="bhrfl"></address>

    <noframes id="bhrfl"><address id="bhrfl"><th id="bhrfl"></th></address>

    <form id="bhrfl"><th id="bhrfl"><progress id="bhrfl"></progress></th></form>

    <em id="bhrfl"><span id="bhrfl"></span></em>

    全部
    常見問題
    產品動態
    精選推薦

    Swoole 高性能高并發 PHP 協程框架

    管理 管理 編輯 刪除

    Swoole是一個強大的工具,它允許PHP開發人員編寫高性能高并發的TCP、UDP、Unix Socket、HTTP、WebSocket等服務,從而讓PHP可以超越Web領域的局限。

    特別值得一提的是Swoole4協程的成熟,將PHP帶入了前所未有的時代。通過協程,我們可以實現異步非阻塞的編程方式,大大提升了程序的性能。

    Swoole4協程為性能的提升提供了獨一無二的可能性。通過使用協程,我們可以在一個線程中同時執行多個任務,而不需要創建多個線程或進程。這樣可以減少上下文切換的開銷,提高服務器的吞吐量。

    除了協程,Swoole還提供了許多其他的功能,如事件驅動、異步網絡通信等。這些功能讓PHP開發人員可以更加靈活地處理各種網絡編程需求,并且提供了更好的性能和可擴展性。

    260a02023092317385194.png

    Swoole是一個功能強大的網絡通信框架,適用于互聯網、移動通信、云計算、網絡游戲、物聯網(IOT)、車聯網、智能家居等多個領域。通過使用PHP + Swoole,企業的IT研發團隊可以顯著提升效率,將更多精力專注于開發創新產品。

    HTTP Server

    //高性能HTTP服務器
    $http = new Swoole\Http\Server("127.0.0.1", 9501);
    $http->on("start", function ($server) {
      echo "Swoole http server is started at http://127.0.0.1:9501\n";
    });
      $http->on("request", function ($request, $response) {
      $response->header("Content-Type", "text/plain");
      $response->end("Hello World\n");});
      $http->start();

    WebSocket Server

    $server = new Swoole\Websocket\Server("127.0.0.1", 9502);$server->on('open', function($server, $req) {
    echo "connection open: {$req->fd}\n";
    });
    $server->on('message', function($server, $frame) {
    echo "received message: {$frame->data}\n";
    $server->push($frame->fd, json_encode(["hello", "world"]));
    });
    $server->on('close', function($server, $fd) {
    echo "connection close: {$fd}\n";});
    $server->start();

    TCP Server


    $server = new Swoole\Server("127.0.0.1", 9503);
    $server->on('connect', function ($server, $fd){
    echo "connection open: {$fd}\n";});
    $server->on('receive', function ($server, $fd, $reactor_id, $data) {
    $server->send($fd, "Swoole: {$data}");
    $server->close($fd);});$server->on('close', function ($server, $fd) {
    echo "connection close: {$fd}\n";});
    $server->start();

    UDP Server

    $serv = new Swoole\Server("127.0.0.1", 9502, SWOOLE_PROCESS, SWOOLE_SOCK_UDP);
    //監聽數據接收事件
    $serv->on('Packet', function ($serv, $data, $clientInfo) {
    $serv->sendto($clientInfo['address'], $clientInfo['port'], "Server ".$data);
    var_dump($clientInfo);});
    //啟動服務器$serv->start();

    Task

    $server = new Swoole\Server("127.0.0.1", 9502);
    $server->set(array('task_worker_num' => 4));
    $server->on('receive', function($server, $fd, $reactor_id, $data) {
    $task_id = $server->task("Async");
    echo "Dispatch AsyncTask: [id=$task_id]\n";});
    $server->on('task', function ($server, $task_id, $reactor_id, $data) {
    echo "New AsyncTask[id=$task_id]\n";  $server->finish("$data -> OK");});
    $server->on('finish', function ($server, $task_id, $data) {
    echo "AsyncTask[$task_id] finished: {$data}\n";});
    $server->start();

    Coroutine

    在一個進程內一秒內完成1萬次睡眠、讀取、寫入、檢查和刪除文件操作,以及使用PDO和MySQLi與數據庫進行通信1萬次,創建TCP服務器和多個客戶端進行相互通信1萬次,創建UDP服務器和多個客戶端進行相互通信1萬次。

    Swoole\Runtime::enableCoroutine();
    //此行代碼后,文件操作,sleep,Mysqli,PDO,streams等都變成異步IO,見文檔'一鍵協程化'章節$s = microtime(true);
    //Co/run()見文檔'協程容器'章節Co\run(function() {
    // i just want to sleep...for ($c = 100; $c--;) {
    go(function () {
    for ($n = 100; $n--;) {
    usleep(1000);
    }
    });}
    // 10k file read and writefor ($c = 100; $c--;) {
    go(function () use ($c) {
    $tmp_filename = "/tmp/test-{$c}.php";
    for ($n = 100; $n--;) {
    $self = file_get_contents(__FILE__);
    file_put_contents($tmp_filename, $self);
    assert(file_get_contents($tmp_filename) === $self);
    }    
    unlink($tmp_filename);
    });}
    // 10k pdo and mysqli readfor ($c = 50; $c--;) {
    go(function () {
    $pdo = new PDO('mysql:host=127.0.0.1;dbname=test;charset=utf8', 'root', 'root');
    $statement = $pdo->prepare('SELECT * FROM `user`');
    for ($n = 100; $n--;) {
    $statement->execute();
    assert(count($statement->fetchAll()) > 0);
    }
    });}for ($c = 50; $c--;) {
    go(function () {
    $mysqli = new Mysqli('127.0.0.1', 'root', 'root', 'test');
    $statement = $mysqli->prepare('SELECT `id` FROM `user`');
    for ($n = 100; $n--;) {
    $statement->bind_result($id);
    $statement->execute();
    $statement->fetch();
    assert($id > 0);
    }
    });}
    // php_stream tcp server & client with 12.8k requests in single processfunction tcp_pack(string $data): string{  
    return pack('n', strlen($data)) . $data;}function tcp_length(string $head): int{  
    return unpack('n', $head)[1];}go(function () {
    $ctx = stream_context_create(['socket' => ['so_reuseaddr' => true, 'backlog' => 128]]);  
    $socket = stream_socket_server(    
    'tcp://0.0.0.0:9502',    
    $errno, $errstr, STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, $ctx  );  
    if (!$socket) {
    echo "$errstr ($errno)\n";
    } else {
    $i = 0;
    while ($conn = stream_socket_accept($socket, 1)) {
    stream_set_timeout($conn, 5);
    for ($n = 100; $n--;) {
    $data = fread($conn, tcp_length(fread($conn, 2)));
    assert($data === "Hello Swoole Server #{$n}!");
    fwrite($conn, tcp_pack("Hello Swoole Client #{$n}!"));
    }
    if (++$i === 128) {
    fclose($socket);
    break;
    }
    }
    }});for ($c = 128; $c--;) {
    go(function () {
    $fp = stream_socket_client("tcp://127.0.0.1:9502", $errno, $errstr, 1);
    if (!$fp) {
    echo "$errstr ($errno)\n";
    } else {
    stream_set_timeout($fp, 5);
    for ($n = 100; $n--;) {
    fwrite($fp, tcp_pack("Hello Swoole Server #{$n}!"));
    $data = fread($fp, tcp_length(fread($fp, 2)));
    assert($data === "Hello Swoole Client #{$n}!");
    }      
    fclose($fp);
    }
    });}// udp server & client with 12.8k requests in single processgo(function () {
    $socket = new Swoole\Coroutine\Socket(AF_INET, SOCK_DGRAM, 0);
    $socket->bind('127.0.0.1', 9503);  $client_map = [];
    for ($c = 128; $c--;) {
    for ($n = 0; $n < 100; $n++) { $recv = $socket->recvfrom($peer);
    $client_uid = "{$peer['address']}:{$peer['port']}";
    $id = $client_map[$client_uid] = ($client_map[$client_uid] ?? -1) + 1;
     assert($recv === "Client: Hello #{$id}!");
    $socket->sendto($peer['address'], $peer['port'], "Server: Hello #{$id}!");
    }
    }
    $socket->close();});for ($c = 128; $c--;) {
    go(function () {
    $fp = stream_socket_client("udp://127.0.0.1:9503", $errno, $errstr, 1);
    if (!$fp) {
    echo "$errstr ($errno)\n";
    } else {
    for ($n = 0; $n < 100; $n++) {
    fwrite($fp, "Client: Hello #{$n}!");
    $recv = fread($fp, 1024);
    list($address, $port) = explode(':', (stream_socket_get_name($fp, true)));
    assert($address === '127.0.0.1' && (int)$port === 9503);
    assert($recv === "Server: Hello #{$n}!");
    }      fclose($fp);
    }
    });}});echo 'use ' . (microtime(true) - $s) . ' s';

    Channel

    Co\run(function(){  
    //使用Channel進行協程間通訊  
    $chan = new Swoole\Coroutine\Channel(1);  
    Swoole\Coroutine::create(function () use ($chan) {    
    for($i = 0; $i < 100000; $i++) { co::sleep(1.0); $chan->push(['rand' => rand(1000, 9999), 'index' => $i]);      
    echo "$i\n";    
    }  
    });  
    Swoole\Coroutine::create(function () use ($chan) {    
    while(1) {      
    $data = $chan->pop();      
    var_dump($data);    
    }  
    });});

    Swoole 特性

    Swoole是使用C/C++語言編寫的,提供了異步多線程服務器、異步TCP/UDP網絡客戶端、異步MySQL、異步Redis、數據庫連接池、AsyncTask、消息隊列、毫秒定時器、異步文件讀寫、異步DNS查詢等功能。此外,Swoole還內置了Http/WebSocket服務器端/客戶端以及Http2.0服務器端。

    除了支持異步IO,Swoole還為PHP多進程模式設計了并發數據結構和IPC通信機制,大大簡化了多進程并發編程的工作。其中包括并發原子計數器、并發HashTable、Channel、Lock、進程間通信IPC等功能特性。

    Swoole4.0引入了類似Go語言的協程,可以使用完全同步的代碼實現異步程序。在編寫PHP代碼時無需額外增加任何關鍵詞,底層會自動進行協程調度,實現異步IO。

    請登錄后查看

    CRMEB-慕白寒窗雪 最后編輯于2023-09-23 18:00:36

    快捷回復
    回復
    回復
    回復({{post_count}}) {{!is_user ? '我的回復' :'全部回復'}}
    排序 默認正序 回復倒序 點贊倒序

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

    作者 管理員 企業

    {{item.floor}}# 同步到gitee 已同步到gitee {{item.is_suggest == 1? '取消推薦': '推薦'}}
    {{item.is_suggest == 1? '取消推薦': '推薦'}}
    沙發 板凳 地板 {{item.floor}}#
    {{item.user_info.title || '暫無簡介'}}
    附件

    {{itemf.name}}

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

    {{itemc.user_info.nickname}}

    {{itemc.user_name}}

    回復 {{itemc.comment_user_info.nickname}}

    附件

    {{itemf.name}}

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

    相關推薦

    快速安全登錄

    使用微信掃碼登錄
    {{item.label}} 加精
    {{item.label}} {{item.label}} 板塊推薦 常見問題 產品動態 精選推薦 首頁頭條 首頁動態 首頁推薦
    取 消 確 定
    回復
    回復
    問題:
    問題自動獲取的帖子內容,不準確時需要手動修改. [獲取答案]
    答案:
    提交
    bug 需求 取 消 確 定
    打賞金額
    當前余額:¥{{rewardUserInfo.reward_price}}
    {{item.price}}元
    請輸入 0.1-{{reward_max_price}} 范圍內的數值
    打賞成功
    ¥{{price}}
    完成 確認打賞

    微信登錄/注冊

    切換手機號登錄

    {{ bind_phone ? '綁定手機' : '手機登錄'}}

    {{codeText}}
    切換微信登錄/注冊
    暫不綁定
    亚洲欧美字幕
    CRMEB客服

    CRMEB咨詢熱線 咨詢熱線

    400-8888-794

    微信掃碼咨詢

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