<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之旅 廣告
                # [Worker類](https://www.workerman.net/doc/workerman/worker.html#Worker%E7%B1%BB) Workerman中有兩個重要的類Worker與Connection。 Worker類用于實現端口的監聽,并可以設置客戶端連接事件、連接上消息事件、連接斷開事件的回調函數,從而實現業務處理。 可以設置Worker實例的進程數(count屬性),Worker主進程會fork出count個子進程同時監聽相同的端口,并行的接收客戶端連接,處理連接上的事件。 ``` <?php require_once __DIR__ . '/vendor/autoload.php'; use Workerman\Connection\TcpConnection; use Workerman\Worker; $version=Worker::VERSION; $starting_status=Worker::STATUS_STARTING; $runing_status=Worker::STATUS_RUNNING; $shutdown_status=Worker::STATUS_SHUTDOWN; $reloading_status=Worker::STATUS_RELOADING; $default_backlog=Worker::DEFAULT_BACKLOG; $max_udp_package_size=Worker::MAX_UDP_PACKAGE_SIZE; $ui_safe_length=Worker::UI_SAFE_LENGTH; // 所有的打印輸出全部保存在/tmp/stdout.log文件中,默認所有終端輸出全部重定向到/dev/null (也就是默認丟棄所有輸出) #Worker::$stdoutFile = '/tmp/stdout.log'; #此屬性為全局靜態屬性,用來設置Workerman進程的pid文件路徑此項設置在監控中比較有用,例如將Workerman的pid文件放入固定的目錄中,可以方便一些監控軟件讀取pid文件,從而監控Workerman進程狀態。注意:此屬性必須在Worker::runAll();運行前設置才有效。windows系統不支持此特性。 #如果不設置,Workerman默認會在與Workerman目錄平行的位置(注意workerman3.2.3之前版本默認在sys_get_temp_dir()下)自動生成一個pid文件,并且為了避免啟動多個Workerman實例導致pid沖突,Workerman生成pid文件包含了當前Workerman的路徑 #Worker::$pidFile = '/var/run/workerman.pid'; #用來指定workerman日志文件位置,僅僅記錄workerman自身相關啟動停止等日志,不包含任何業務日志。業務日志類可以利用file_put_contents 或者 error_log 等函數自行實現 #Worker::$logFile = '/tmp/workerman.log'; #此屬性為全局靜態屬性,表示是否以daemon(守護進程)方式運行。如果啟動命令使用了 -d參數,則該屬性會自動設置為true。也可以代碼中手動設置.此屬性必須在Worker::runAll();運行前設置才有效。windows系統不支持此特性 Worker::$daemonize = true; #Worker::__construct([string $listen , array $context]) #$listen 的格式為 <協議>://<監聽地址> #<監聽地址> 可以為以下格式: #unix套接字,地址為本地一個磁盤路徑 #非unix套接字,地址格式為 <本機ip>:<端口號> #tcp: 例如 tcp://0.0.0.0:8686 #udp: 例如 udp://0.0.0.0:8686 #unix: 例如 unix:///tmp/my_file (需要Workerman>=3.2.7) #http: 例如 http://0.0.0.0:80 #websocket: 例如 websocket://0.0.0.0:8686 #text: 例如 text://0.0.0.0:8686 (text是Workerman內置的文本協議,兼容telnet,詳情參見附錄Text協議部分) #<本機ip>如果以為0.0.0.0表示監聽本機所有網卡,包括內網ip和外網ip及本地回環127.0.0.1 #<本機ip>如果以為127.0.0.1表示監聽本地回環,只能本機訪問,外部無法訪問 #<本機ip>如果為內網ip,類似192.168.xx.xx,表示只監聽內網ip,則外網用戶無法訪問 #注意:<端口號>不能大于65535。<端口號>如果小于1024則需要root權限才能監聽。監聽的端口必須是本機未被占用的端口,否則無法監聽,并且提示Address already in use錯誤 $worker = new Worker('websocket://0.0.0.0:8181'); #設置當前Worker實例的協議類。他會將上面實例化時設置的的websocket協議替換為http #$worker->protocol = 'Workerman\\Protocols\\Http'; #設置當前Worker實例所使用的傳輸層協議,目前只支持3種(tcp、udp、ssl)。不設置默認為tcp #$worker->transport = 'udp'; #設置當前Worker實例以哪個用戶運行。此屬性只有當前用戶為root時才能生效。不設置時默認以當前用戶運行 #建議$user設置權限較低的用戶,例如www-data、apache、nobody等.此屬性必須在Worker::runAll();運行前設置才有效。windows系統不支持此特性 #$worker->user = 'www-data'; $worker->count=4;#啟動4個進程 // 設置當前Worker實例的名稱,方便運行status命令時識別進程。不設置時默認為none。 $worker->name = 'MyWebsocketWorker'; #php a.php restart #---------------------------------------------- WORKERMAN ---------------------------------------------- #Workerman version:4.1.15 PHP version:8.2.16 Event-Loop:\Workerman\Events\Event #----------------------------------------------- WORKERS ----------------------------------------------- #proto user worker listen processes status #tcp root MyWebsocketWorker websocket://0.0.0.0:8181 4 [OK] #------------------------------------------------------------------------------------------------------- #一般更新業務代碼時使用.執行php start.php reload時會向所有子進程發送reload信號(SIGUSR1),子進程收到reload信號后會自動退出然后主進程會自動拉起一個新的進程 #收到reload信號后只想讓子進程執行onWorkerReload,不想退出時設置reloadable為false $worker->reloadable = false; #當客戶端與Workerman建立連接時(TCP三次握手完成后)觸發的回調函數。每個連接只會觸發一次onConnect回調. #在onConnect事件里無法確認對方是誰。要想知道對方是誰,需要客戶端發送鑒權數據,例如某個token或者用戶名密碼之類,在onMessage回調里做鑒權. #udp是無連接的,所以當使用udp協議時不會觸發onConnect回調,也不會觸發onClose回調 $worker->onConnect = function($connection){ echo "connection的id".$connection->id."\n"; $connection->onWebSocketConnect = function($connection , $httpBuffer) { echo "本次鏈接的客戶端IP:".$connection->getRemoteIp().PHP_EOL; var_dump($_GET, $_SERVER); /* $_SERVER array ( 'REQUEST_METHOD' => 'GET', 'REQUEST_URI' => '/', 'SERVER_PROTOCOL' => 'HTTP/1.1', 'HTTP_HOST' => '102.10.80.185:8181', 'SERVER_NAME' => '102.10.80.185', 'SERVER_PORT' => '8181', 'HTTP_CONNECTION' => 'Upgrade', 'HTTP_PRAGMA' => 'no-cache', 'HTTP_CACHE_CONTROL' => 'no-cache', 'HTTP_USER_AGENT' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0', 'HTTP_UPGRADE' => 'websocket', 'HTTP_ORIGIN' => 'http://102.10.80.185', 'HTTP_SEC_WEBSOCKET_VERSION' => '13', 'HTTP_ACCEPT_ENCODING' => 'gzip, deflate', 'HTTP_ACCEPT_LANGUAGE' => 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6', 'HTTP_COOKIE' => '字符太多省略', 'HTTP_SEC_WEBSOCKET_KEY' => 'oVzl7peN3SAMcTRqnL/USw==', 'HTTP_SEC_WEBSOCKET_EXTENSIONS' => 'permessage-deflate; client_max_window_bits', 'QUERY_STRING' => '', ) */ var_export($_SERVER); // 可以在這里判斷連接來源是否合法,不合法就關掉連接 // $_SERVER['HTTP_ORIGIN']標識來自哪個站點的頁面發起的websocket連接 if($_SERVER['HTTP_ORIGIN'] != 'https://www.workerman.net') { // $connection->close(); return $_SERVER['HTTP_ORIGIN']; } // onWebSocketConnect 里面$_GET $_SERVER是可用的 // var_dump($_GET, $_SERVER); }; }; #設置Worker子進程啟動時的回調函數,每個子進程啟動時都會執行 #注意:onWorkerStart是在子進程啟動時運行的,如果開啟了多個子進程($worker->count > 1),每個子進程運行一次,則總共會運行$worker->count次 $worker->onWorkerStart = function($worker){ #當前worker進程的id編號,范圍為0到$worker->count-1 echo "進程id:{$worker->id} Worker starting...\n"; }; #Worker收到reload信號后執行的回調 #子進程收到reload信號默認的動作是退出重啟,以便新進程重新加載業務代碼完成代碼更新。所以reload后子進程在執行完onWorkerReload回調后便立刻退出是正常現象.如果在收到reload信號后只想讓子進程執行onWorkerReload,不想退出,可以在初始化Worker實例時設置對應的Worker實例的reloadable屬性為false `$worker->reloadable = false;` $worker->onWorkerReload = function($worker){ #此屬性中存儲了當前進程的所有的客戶端連接對象,其中id為connection的id編號 foreach($worker->connections as $connectionId => $connection) { $connection->send('worker reloading'); } }; #當客戶端通過連接發來數據時(Workerman收到數據時)觸發的回調函數 $worker->onMessage = function($connection,$data){ $connection->send("我已收到你發來的數據:".$data); }; #當客戶端連接與Workerman斷開時觸發的回調函數 #注意:如果對端是由于斷網或者斷電等極端情況斷開的連接,這時由于無法及時發送tcp的fin包給workerman,workerman就無法得知連接已經斷開,也就無法及時觸發onClose。這種情況需要通過應用層心跳來解決。workerman中連接的心跳實現參見這里。如果使用的是GatewayWorker框架,則直接使用GatewayWorker框架的心跳機制即可,參見https://doc2.workerman.net/heartbeat.html。 $worker->onClose = function(TcpConnection $connection) { echo "connection closed\n"; }; #應用層發送緩沖區滿則會觸發onBufferFull回調 $worker->onBufferFull = function(TcpConnection $connection) { echo "bufferFull and do not send again\n"; }; #在應用層發送緩沖區數據全部發送完畢后觸發。一般與onBufferFull配合使用,例如在onBufferFull時停止向對端繼續send數據,在onBufferDrain恢復寫入數據 $worker->onBufferDrain = function(TcpConnection $connection) { echo "buffer drain and continue send\n"; }; #當客戶端的連接上發生錯誤時觸發 $worker->onError = function(TcpConnection $connection, $code, $msg) { echo "error $code $msg\n"; }; Worker::runAll(); ```
                  <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>

                              哎呀哎呀视频在线观看