{"id":21981837,"url":"https://github.com/liou2021/workerman","last_synced_at":"2026-04-20T19:05:36.585Z","repository":{"id":53698659,"uuid":"521249356","full_name":"LIOU2021/workerman","owner":"LIOU2021","description":null,"archived":false,"fork":false,"pushed_at":"2022-08-08T04:27:15.000Z","size":2965,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-07-05T22:44:25.582Z","etag":null,"topics":["chatroom","php","websocket"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/LIOU2021.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"MIT-LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null},"funding":{"open_collective":"workerman","patreon":"walkor"}},"created_at":"2022-08-04T12:01:17.000Z","updated_at":"2022-12-24T05:19:37.000Z","dependencies_parsed_at":"2022-08-13T02:50:20.368Z","dependency_job_id":null,"html_url":"https://github.com/LIOU2021/workerman","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/LIOU2021/workerman","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LIOU2021%2Fworkerman","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LIOU2021%2Fworkerman/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LIOU2021%2Fworkerman/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LIOU2021%2Fworkerman/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/LIOU2021","download_url":"https://codeload.github.com/LIOU2021/workerman/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LIOU2021%2Fworkerman/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32061266,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-20T11:35:06.609Z","status":"ssl_error","status_checked_at":"2026-04-20T11:34:48.899Z","response_time":94,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["chatroom","php","websocket"],"created_at":"2024-11-29T17:19:53.701Z","updated_at":"2026-04-20T19:05:36.571Z","avatar_url":"https://github.com/LIOU2021.png","language":"PHP","funding_links":["https://opencollective.com/workerman","https://patreon.com/walkor","https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick\u0026hosted_button_id=UQGGS9UB35WWG"],"categories":[],"sub_categories":[],"readme":"# sample\n## 大廳\n![大廳](./sampleImage/sample-group.JPG)\n## 私訊\n![私訊](./sampleImage/personalMessage.JPG)\n\n# start\n- 監聽127.0.0.1:2000\n- 不同worker(proccess/進程)不能溝通\n- connect id 編制規則為: workerId_connectId\n- 環境設置在:./src/Config/App.php\n- daemon背景執行下，log預設存放在 \"./log/workerman2.log\"。注意Worker::$stdoutFile指定的路径要有可写权限。\n\n\n# data from client\n- type : message/info/bind。message表示當通訊用。info表示獲取worker相關資訊。bind表示綁定uid。\n- to : user/all。user表示一對一，all表示一對全部。\n- msg : 信息內容。\n- to_user : 當to這個key為user時，就會判讀to_user來決定要傳給哪個收訊息的人，此處填寫connection_id。\n- uid : user獨立的ID。bindUid時要用的。\n\n\n# REF\n- [official github](https://github.com/walkor/workerman)\n- [程序(進程)、執行緒(線程)、協程，傻傻分得清楚！](https://oldmo860617.medium.com/%E9%80%B2%E7%A8%8B-%E7%B7%9A%E7%A8%8B-%E5%8D%94%E7%A8%8B-%E5%82%BB%E5%82%BB%E5%88%86%E5%BE%97%E6%B8%85%E6%A5%9A-a09b95bd68dd)\n- [实时通信的「聊天室」源码，Ctrl+c/v就可以用！！！](https://blog.51cto.com/u_15076218/2607210)\n- [使用 Workerman 做一个聊天室](https://learnku.com/articles/30160)\n- [chatroom template](https://bootsnipp.com/fullscreen/nNg98)\n# return message sample\n- data.type 狀態 : onConnect/onMessage/onClose/onAll/onBind/infor/onAutoReload\n- onConnect : 群體訊息/自己\n- onMessage : 一對一聊天\n- onClose : 群體訊息\n- onAll : 群體訊息\n- onBind : 群體訊息\n- info : 自己\n- onAutoReload : 群體訊息\n\n```json\n{\n    \"status\" : 200,\n    \"message\" : \"success !\",\n    \"data\" : {\n        \"type\" : \"onConnect\"\n        //.......\n    },\n    \"datetime\":\"2022-08-06 13:23\"\n}\n```\n# Demo\n```js\n//在chrome瀏覽器開發模式輸入底下\n\nws = new WebSocket(\"ws://localhost:2000\");\nws.onopen = function() {\n    console.log(\"连接成功\");\n    ws.send('tom');\n    console.log(\"给服务端发送一个字符串：tom\");\n};\nws.onmessage = function(e) {\n    console.log(\"收到服务端的消息：\");\n    try{\n        console.log(JSON.parse(e.data));\n    }catch(exception){\n        console.log(e.data);\n    }\n};\n\nmsg={\n    type : 'bind',\n    uid : 'abc123'\n};\nws.send(JSON.stringify(msg));\n\nmsg={\n    type:'message',\n    to:'user',\n    msg:'安安你好',\n    to_user:'0_2'\n};\nws.send(JSON.stringify(msg));\n\nmsg={\n    type:'message',\n    to:'all',\n    msg:'大家好',\n};\nws.send(JSON.stringify(msg));\n\nmsg={\n    type:'info'\n};\nws.send(JSON.stringify(msg));\n```\n\n## Available commands\n```php start.php start  ```  \n```php start.php start -d  ```  \n```php start.php status  ```  \n```php start.php status -d  ```  \n```php start.php connections```  \n```php start.php stop  ```  \n```php start.php stop -g  ```  \n```php start.php restart  ```  \n```php start.php reload  ```  \n```php start.php reload -g  ```\n\n# Workerman\n[![Gitter](https://badges.gitter.im/walkor/Workerman.svg)](https://gitter.im/walkor/Workerman?utm_source=badge\u0026utm_medium=badge\u0026utm_campaign=pr-badge\u0026utm_content=body_badge)\n[![Latest Stable Version](https://poser.pugx.org/workerman/workerman/v/stable)](https://packagist.org/packages/workerman/workerman)\n[![Total Downloads](https://poser.pugx.org/workerman/workerman/downloads)](https://packagist.org/packages/workerman/workerman)\n[![Monthly Downloads](https://poser.pugx.org/workerman/workerman/d/monthly)](https://packagist.org/packages/workerman/workerman)\n[![Daily Downloads](https://poser.pugx.org/workerman/workerman/d/daily)](https://packagist.org/packages/workerman/workerman)\n[![License](https://poser.pugx.org/workerman/workerman/license)](https://packagist.org/packages/workerman/workerman)\n\n## What is it\nWorkerman is an asynchronous event-driven PHP framework with high performance to build fast and scalable network applications. \nWorkerman supports HTTP, Websocket, SSL and other custom protocols. \nWorkerman supports event extension.\n\n## Requires\nPHP 7.0 or Higher  \nA POSIX compatible operating system (Linux, OSX, BSD)  \nPOSIX and PCNTL extensions required   \nEvent extension recommended for better performance  \n\n## Installation\n\n```\ncomposer require workerman/workerman\n```\n\n## Basic Usage\n\n### A websocket server \n```php\n\u003c?php\n\nuse Workerman\\Worker;\n\nrequire_once __DIR__ . '/vendor/autoload.php';\n\n// Create a Websocket server\n$ws_worker = new Worker('websocket://0.0.0.0:2346');\n\n// Emitted when new connection come\n$ws_worker-\u003eonConnect = function ($connection) {\n    echo \"New connection\\n\";\n};\n\n// Emitted when data received\n$ws_worker-\u003eonMessage = function ($connection, $data) {\n    // Send hello $data\n    $connection-\u003esend('Hello ' . $data);\n};\n\n// Emitted when connection closed\n$ws_worker-\u003eonClose = function ($connection) {\n    echo \"Connection closed\\n\";\n};\n\n// Run worker\nWorker::runAll();\n```\n\n### An http server\n```php\nuse Workerman\\Worker;\n\nrequire_once __DIR__ . '/vendor/autoload.php';\n\n// #### http worker ####\n$http_worker = new Worker('http://0.0.0.0:2345');\n\n// 4 processes\n$http_worker-\u003ecount = 4;\n\n// Emitted when data received\n$http_worker-\u003eonMessage = function ($connection, $request) {\n    //$request-\u003eget();\n    //$request-\u003epost();\n    //$request-\u003eheader();\n    //$request-\u003ecookie();\n    //$request-\u003esession();\n    //$request-\u003euri();\n    //$request-\u003epath();\n    //$request-\u003emethod();\n\n    // Send data to client\n    $connection-\u003esend(\"Hello World\");\n};\n\n// Run all workers\nWorker::runAll();\n```\n\n### A tcp server\n```php\nuse Workerman\\Worker;\n\nrequire_once __DIR__ . '/vendor/autoload.php';\n\n// #### create socket and listen 1234 port ####\n$tcp_worker = new Worker('tcp://0.0.0.0:1234');\n\n// 4 processes\n$tcp_worker-\u003ecount = 4;\n\n// Emitted when new connection come\n$tcp_worker-\u003eonConnect = function ($connection) {\n    echo \"New Connection\\n\";\n};\n\n// Emitted when data received\n$tcp_worker-\u003eonMessage = function ($connection, $data) {\n    // Send data to client\n    $connection-\u003esend(\"Hello $data \\n\");\n};\n\n// Emitted when connection is closed\n$tcp_worker-\u003eonClose = function ($connection) {\n    echo \"Connection closed\\n\";\n};\n\nWorker::runAll();\n```\n\n### Enable SSL\n```php\n\u003c?php\n\nuse Workerman\\Worker;\n\nrequire_once __DIR__ . '/vendor/autoload.php';\n\n// SSL context.\n$context = [\n    'ssl' =\u003e [\n        'local_cert'  =\u003e '/your/path/of/server.pem',\n        'local_pk'    =\u003e '/your/path/of/server.key',\n        'verify_peer' =\u003e false,\n    ]\n];\n\n// Create a Websocket server with ssl context.\n$ws_worker = new Worker('websocket://0.0.0.0:2346', $context);\n\n// Enable SSL. WebSocket+SSL means that Secure WebSocket (wss://). \n// The similar approaches for Https etc.\n$ws_worker-\u003etransport = 'ssl';\n\n$ws_worker-\u003eonMessage = function ($connection, $data) {\n    // Send hello $data\n    $connection-\u003esend('Hello ' . $data);\n};\n\nWorker::runAll();\n```\n\n### Custom protocol\nProtocols/MyTextProtocol.php\n```php\n\nnamespace Protocols;\n\n/**\n * User defined protocol\n * Format Text+\"\\n\"\n */\nclass MyTextProtocol\n{\n    public static function input($recv_buffer)\n    {\n        // Find the position of the first occurrence of \"\\n\"\n        $pos = strpos($recv_buffer, \"\\n\");\n\n        // Not a complete package. Return 0 because the length of package can not be calculated\n        if ($pos === false) {\n            return 0;\n        }\n\n        // Return length of the package\n        return $pos + 1;\n    }\n\n    public static function decode($recv_buffer)\n    {\n        return trim($recv_buffer);\n    }\n\n    public static function encode($data)\n    {\n        return $data . \"\\n\";\n    }\n}\n```\n\n```php\nuse Workerman\\Worker;\n\nrequire_once __DIR__ . '/vendor/autoload.php';\n\n// #### MyTextProtocol worker ####\n$text_worker = new Worker('MyTextProtocol://0.0.0.0:5678');\n\n$text_worker-\u003eonConnect = function ($connection) {\n    echo \"New connection\\n\";\n};\n\n$text_worker-\u003eonMessage = function ($connection, $data) {\n    // Send data to client\n    $connection-\u003esend(\"Hello world\\n\");\n};\n\n$text_worker-\u003eonClose = function ($connection) {\n    echo \"Connection closed\\n\";\n};\n\n// Run all workers\nWorker::runAll();\n```\n\n### Timer\n```php\n\nuse Workerman\\Worker;\nuse Workerman\\Timer;\n\nrequire_once __DIR__ . '/vendor/autoload.php';\n\n$task = new Worker();\n$task-\u003eonWorkerStart = function ($task) {\n    // 2.5 seconds\n    $time_interval = 2.5; \n    $timer_id = Timer::add($time_interval, function () {\n        echo \"Timer run\\n\";\n    });\n};\n\n// Run all workers\nWorker::runAll();\n```\n\n### AsyncTcpConnection (tcp/ws/text/frame etc...)\n```php\n\nuse Workerman\\Worker;\nuse Workerman\\Connection\\AsyncTcpConnection;\n\nrequire_once __DIR__ . '/vendor/autoload.php';\n\n$worker = new Worker();\n$worker-\u003eonWorkerStart = function () {\n    // Websocket protocol for client.\n    $ws_connection = new AsyncTcpConnection('ws://echo.websocket.org:80');\n    $ws_connection-\u003eonConnect = function ($connection) {\n        $connection-\u003esend('Hello');\n    };\n    $ws_connection-\u003eonMessage = function ($connection, $data) {\n        echo \"Recv: $data\\n\";\n    };\n    $ws_connection-\u003eonError = function ($connection, $code, $msg) {\n        echo \"Error: $msg\\n\";\n    };\n    $ws_connection-\u003eonClose = function ($connection) {\n        echo \"Connection closed\\n\";\n    };\n    $ws_connection-\u003econnect();\n};\n\nWorker::runAll();\n```\n\n\n\n## Available commands\n```php start.php start  ```  \n```php start.php start -d  ```  \n```php start.php status  ```  \n```php start.php status -d  ```  \n```php start.php connections```  \n```php start.php stop  ```  \n```php start.php stop -g  ```  \n```php start.php restart  ```  \n```php start.php reload  ```  \n```php start.php reload -g  ```\n\n## Documentation\n\n中文主页: [http://www.workerman.net](https://www.workerman.net)\n\n中文文档: [http://doc.workerman.net](https://www.workerman.net/doc/workerman/)\n\nDocumentation: [https://github.com/walkor/workerman-manual](https://github.com/walkor/workerman-manual/blob/master/english/SUMMARY.md)\n\n# Benchmarks\nhttps://www.techempower.com/benchmarks/#section=data-r19\u0026hw=ph\u0026test=plaintext\u0026l=zik073-1r\n\n\n## Other links with workerman\n\n[webman](https://github.com/walkor/webman)   \n[PHPSocket.IO](https://github.com/walkor/phpsocket.io)   \n[php-socks5](https://github.com/walkor/php-socks5)  \n[php-http-proxy](https://github.com/walkor/php-http-proxy)  \n\n## Donate\n\u003ca href=\"https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick\u0026hosted_button_id=UQGGS9UB35WWG\"\u003e\u003cimg src=\"http://donate.workerman.net/img/donate.png\"\u003e\u003c/a\u003e\n\n## LICENSE\n\nWorkerman is released under the [MIT license](https://github.com/walkor/workerman/blob/master/MIT-LICENSE.txt).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fliou2021%2Fworkerman","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fliou2021%2Fworkerman","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fliou2021%2Fworkerman/lists"}