[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-8159":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":16,"stars7d":17,"stars30d":18,"stars90d":16,"forks30d":16,"starsTrendScore":19,"compositeScore":20,"rankGlobal":10,"rankLanguage":10,"license":21,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":24,"hasPages":22,"topics":25,"createdAt":10,"pushedAt":10,"updatedAt":37,"readmeContent":38,"aiSummary":39,"trendingCount":16,"starSnapshotCount":16,"syncStatus":40,"lastSyncTime":41,"discoverSource":42},8159,"workerman","walkor\u002Fworkerman","walkor","An asynchronous event driven PHP socket framework. Supports HTTP, Websocket, SSL and other custom protocols. ","http:\u002F\u002Fwww.workerman.net",null,"PHP",11548,2259,458,94,0,3,16,1,45,"MIT License",false,"master",true,[26,27,28,29,30,31,32,33,34,35,36],"asynchronous","event-driven","high-performance","php","socket","socket-server","tcp","timer","websocket","ws","wss","2026-06-12 02:01:49","# Workerman\n[![Gitter](https:\u002F\u002Fbadges.gitter.im\u002Fwalkor\u002FWorkerman.svg)](https:\u002F\u002Fgitter.im\u002Fwalkor\u002FWorkerman?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=body_badge)\n[![Latest Stable Version](https:\u002F\u002Fposer.pugx.org\u002Fworkerman\u002Fworkerman\u002Fv\u002Fstable)](https:\u002F\u002Fpackagist.org\u002Fpackages\u002Fworkerman\u002Fworkerman)\n[![Total Downloads](https:\u002F\u002Fposer.pugx.org\u002Fworkerman\u002Fworkerman\u002Fdownloads)](https:\u002F\u002Fpackagist.org\u002Fpackages\u002Fworkerman\u002Fworkerman)\n[![Monthly Downloads](https:\u002F\u002Fposer.pugx.org\u002Fworkerman\u002Fworkerman\u002Fd\u002Fmonthly)](https:\u002F\u002Fpackagist.org\u002Fpackages\u002Fworkerman\u002Fworkerman)\n[![Daily Downloads](https:\u002F\u002Fposer.pugx.org\u002Fworkerman\u002Fworkerman\u002Fd\u002Fdaily)](https:\u002F\u002Fpackagist.org\u002Fpackages\u002Fworkerman\u002Fworkerman)\n[![License](https:\u002F\u002Fposer.pugx.org\u002Fworkerman\u002Fworkerman\u002Flicense)](https:\u002F\u002Fpackagist.org\u002Fpackages\u002Fworkerman\u002Fworkerman)\n\n## What is it\nWorkerman is an asynchronous event-driven PHP framework with high performance to build fast and scalable network applications. It supports HTTP, WebSocket, custom protocols, coroutines, and connection pools, making it ideal for handling high-concurrency scenarios efficiently.\n\n## Requires \nA POSIX compatible operating system (Linux, OSX, BSD)  \nPOSIX and PCNTL extensions required   \nEvent\u002FSwoole\u002FSwow extension recommended for better performance  \n\n## Installation\n\n```\ncomposer require workerman\u002Fworkerman\n```\n\n## Documentation\n\n[https:\u002F\u002Fmanual.workerman.net](https:\u002F\u002Fmanual.workerman.net)\n\n## Basic Usage\n\n### A websocket server \n```php\n\u003C?php\n\nuse Workerman\\Worker;\n\nrequire_once __DIR__ . '\u002Fvendor\u002Fautoload.php';\n\n\u002F\u002F Create a Websocket server\n$ws_worker = new Worker('websocket:\u002F\u002F0.0.0.0:2346');\n\n\u002F\u002F Emitted when new connection come\n$ws_worker->onConnect = function ($connection) {\n    echo \"New connection\\n\";\n};\n\n\u002F\u002F Emitted when data received\n$ws_worker->onMessage = function ($connection, $data) {\n    \u002F\u002F Send hello $data\n    $connection->send('Hello ' . $data);\n};\n\n\u002F\u002F Emitted when connection closed\n$ws_worker->onClose = function ($connection) {\n    echo \"Connection closed\\n\";\n};\n\n\u002F\u002F Run worker\nWorker::runAll();\n```\n\n### An http server\n```php\nuse Workerman\\Worker;\n\nrequire_once __DIR__ . '\u002Fvendor\u002Fautoload.php';\n\n\u002F\u002F #### http worker ####\n$http_worker = new Worker('http:\u002F\u002F0.0.0.0:2345');\n\n\u002F\u002F 4 processes\n$http_worker->count = 4;\n\n\u002F\u002F Emitted when data received\n$http_worker->onMessage = function ($connection, $request) {\n    \u002F\u002F$request->get();\n    \u002F\u002F$request->post();\n    \u002F\u002F$request->header();\n    \u002F\u002F$request->cookie();\n    \u002F\u002F$request->session();\n    \u002F\u002F$request->uri();\n    \u002F\u002F$request->path();\n    \u002F\u002F$request->method();\n\n    \u002F\u002F Send data to client\n    $connection->send(\"Hello World\");\n};\n\n\u002F\u002F Run all workers\nWorker::runAll();\n```\n\n### A tcp server\n```php\nuse Workerman\\Worker;\n\nrequire_once __DIR__ . '\u002Fvendor\u002Fautoload.php';\n\n\u002F\u002F #### create socket and listen 1234 port ####\n$tcp_worker = new Worker('tcp:\u002F\u002F0.0.0.0:1234');\n\n\u002F\u002F 4 processes\n$tcp_worker->count = 4;\n\n\u002F\u002F Emitted when new connection come\n$tcp_worker->onConnect = function ($connection) {\n    echo \"New Connection\\n\";\n};\n\n\u002F\u002F Emitted when data received\n$tcp_worker->onMessage = function ($connection, $data) {\n    \u002F\u002F Send data to client\n    $connection->send(\"Hello $data \\n\");\n};\n\n\u002F\u002F Emitted when connection is closed\n$tcp_worker->onClose = 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__ . '\u002Fvendor\u002Fautoload.php';\n\n\u002F\u002F SSL context.\n$context = [\n    'ssl' => [\n        'local_cert'  => '\u002Fyour\u002Fpath\u002Fof\u002Fserver.pem',\n        'local_pk'    => '\u002Fyour\u002Fpath\u002Fof\u002Fserver.key',\n        'verify_peer' => false,\n    ]\n];\n\n\u002F\u002F Create a Websocket server with ssl context.\n$ws_worker = new Worker('websocket:\u002F\u002F0.0.0.0:2346', $context);\n\n\u002F\u002F Enable SSL. WebSocket+SSL means that Secure WebSocket (wss:\u002F\u002F). \n\u002F\u002F The similar approaches for Https etc.\n$ws_worker->transport = 'ssl';\n\n$ws_worker->onMessage = function ($connection, $data) {\n    \u002F\u002F Send hello $data\n    $connection->send('Hello ' . $data);\n};\n\nWorker::runAll();\n```\n\n### AsyncTcpConnection (tcp\u002Fws\u002Ftext\u002Fframe etc...)\n```php\n\nuse Workerman\\Worker;\nuse Workerman\\Connection\\AsyncTcpConnection;\n\nrequire_once __DIR__ . '\u002Fvendor\u002Fautoload.php';\n\n$worker = new Worker();\n$worker->onWorkerStart = function () {\n    \u002F\u002F Websocket protocol for client.\n    $ws_connection = new AsyncTcpConnection('ws:\u002F\u002Fecho.websocket.org:80');\n    $ws_connection->onConnect = function ($connection) {\n        $connection->send('Hello');\n    };\n    $ws_connection->onMessage = function ($connection, $data) {\n        echo \"Recv: $data\\n\";\n    };\n    $ws_connection->onError = function ($connection, $code, $msg) {\n        echo \"Error: $msg\\n\";\n    };\n    $ws_connection->onClose = function ($connection) {\n        echo \"Connection closed\\n\";\n    };\n    $ws_connection->connect();\n};\n\nWorker::runAll();\n```\n\n### Coroutine\n\nCoroutine is used to create coroutines, enabling the execution of asynchronous tasks to improve concurrency performance.\n\n```php\n\u003C?php\nuse Workerman\\Connection\\TcpConnection;\nuse Workerman\\Coroutine;\nuse Workerman\\Events\\Swoole;\nuse Workerman\\Protocols\\Http\\Request;\nuse Workerman\\Worker;\nrequire_once __DIR__ . '\u002Fvendor\u002Fautoload.php';\n\n$worker = new Worker('http:\u002F\u002F0.0.0.0:8001');\n\n$worker->eventLoop = Swoole::class; \u002F\u002F Or Swow::class or Fiber::class\n\n$worker->onMessage = function (TcpConnection $connection, Request $request) {\n    Coroutine::create(function () {\n        echo file_get_contents(\"http:\u002F\u002Fwww.example.com\u002Fevent\u002Fnotify\");\n    });\n    $connection->send('ok');\n};\n\nWorker::runAll();\n```\n\n> Note: Coroutine require Swoole extension or Swow extension or [Fiber revolt\u002Fevent-loop](https:\u002F\u002Fgithub.com\u002Frevoltphp\u002Fevent-loop), and the same applies below\n\n### Barrier\nBarrier is used to manage concurrency and synchronization in coroutines. It allows tasks to run concurrently and waits until all tasks are completed, ensuring process synchronization.\n\n```php\n\u003C?php\nuse Workerman\\Connection\\TcpConnection;\nuse Workerman\\Coroutine\\Barrier;\nuse Workerman\\Coroutine;\nuse Workerman\\Events\\Swoole;\nuse Workerman\\Protocols\\Http\\Request;\nuse Workerman\\Worker;\nrequire_once __DIR__ . '\u002Fvendor\u002Fautoload.php';\n\n\u002F\u002F Http Server\n$worker = new Worker('http:\u002F\u002F0.0.0.0:8001');\n$worker->eventLoop = Swoole::class; \u002F\u002F Or Swow::class or Fiber::class\n$worker->onMessage = function (TcpConnection $connection, Request $request) {\n    $barrier = Barrier::create();\n    for ($i=1; $i\u003C5; $i++) {\n        Coroutine::create(function () use ($barrier, $i) {\n            file_get_contents(\"http:\u002F\u002F127.0.0.1:8002?task_id=$i\");\n        });\n    }\n    \u002F\u002F Wait all coroutine done\n    Barrier::wait($barrier);\n    $connection->send('All Task Done');\n};\n\n\u002F\u002F Task Server\n$task = new Worker('http:\u002F\u002F0.0.0.0:8002');\n$task->onMessage = function (TcpConnection $connection, Request $request) {\n    $task_id = $request->get('task_id');\n    $message = \"Task $task_id Done\";\n    echo $message . PHP_EOL;\n    $connection->close($message);\n};\n\nWorker::runAll();\n```\n\n### Parallel\nParallel executes multiple tasks concurrently and collects results. Use add to add tasks and wait to wait for completion and get results. Unlike Barrier, Parallel directly returns the results of each task.\n\n```php\n\u003C?php\nuse Workerman\\Connection\\TcpConnection;\nuse Workerman\\Coroutine\\Parallel;\nuse Workerman\\Events\\Swoole;\nuse Workerman\\Protocols\\Http\\Request;\nuse Workerman\\Worker;\nrequire_once __DIR__ . '\u002Fvendor\u002Fautoload.php';\n\n\u002F\u002F Http Server\n$worker = new Worker('http:\u002F\u002F0.0.0.0:8001');\n$worker->eventLoop = Swoole::class; \u002F\u002F Or Swow::class or Fiber::class\n$worker->onMessage = function (TcpConnection $connection, Request $request) {\n    $parallel = new Parallel();\n    for ($i=1; $i\u003C5; $i++) {\n        $parallel->add(function () use ($i) {\n            return file_get_contents(\"http:\u002F\u002F127.0.0.1:8002?task_id=$i\");\n        });\n    }\n    $results = $parallel->wait();\n    $connection->send(json_encode($results)); \u002F\u002F Response: [\"Task 1 Done\",\"Task 2 Done\",\"Task 3 Done\",\"Task 4 Done\"]\n};\n\n\u002F\u002F Task Server\n$task = new Worker('http:\u002F\u002F0.0.0.0:8002');\n$task->onMessage = function (TcpConnection $connection, Request $request) {\n    $task_id = $request->get('task_id');\n    $message = \"Task $task_id Done\";\n    $connection->close($message);\n};\n\nWorker::runAll();\n```\n\n### Channel\n\nChannel is a mechanism for communication between coroutines. One coroutine can push data into the channel, while another can pop data from it, enabling synchronization and data sharing between coroutines.\n\n```php\n\u003C?php\nuse Workerman\\Connection\\TcpConnection;\nuse Workerman\\Coroutine\\Channel;\nuse Workerman\\Coroutine;\nuse Workerman\\Events\\Swoole;\nuse Workerman\\Protocols\\Http\\Request;\nuse Workerman\\Worker;\nrequire_once __DIR__ . '\u002Fvendor\u002Fautoload.php';\n\n\u002F\u002F Http Server\n$worker = new Worker('http:\u002F\u002F0.0.0.0:8001');\n$worker->eventLoop = Swoole::class; \u002F\u002F Or Swow::class or Fiber::class\n$worker->onMessage = function (TcpConnection $connection, Request $request) {\n    $channel = new Channel(2);\n    Coroutine::create(function () use ($channel) {\n        $channel->push('Task 1 Done');\n    });\n    Coroutine::create(function () use ($channel) {\n        $channel->push('Task 2 Done');\n    });\n    $result = [];\n    for ($i = 0; $i \u003C 2; $i++) {\n        $result[] = $channel->pop();\n    }\n    $connection->send(json_encode($result)); \u002F\u002F Response: [\"Task 1 Done\",\"Task 2 Done\"]\n};\nWorker::runAll();\n```\n\n### Pool\n\nPool is used to manage connection or resource pools, improving performance by reusing resources (e.g., database connections). It supports acquiring, returning, creating, and destroying resources.\n\n```php\n\u003C?php\nuse Workerman\\Connection\\TcpConnection;\nuse Workerman\\Coroutine\\Pool;\nuse Workerman\\Events\\Swoole;\nuse Workerman\\Protocols\\Http\\Request;\nuse Workerman\\Worker;\nrequire_once __DIR__ . '\u002Fvendor\u002Fautoload.php';\n\nclass RedisPool\n{\n    private Pool $pool;\n    public function __construct($host, $port, $max_connections = 10)\n    {\n        $pool = new Pool($max_connections);\n        $pool->setConnectionCreator(function () use ($host, $port) {\n            $redis = new \\Redis();\n            $redis->connect($host, $port);\n            return $redis;\n        });\n        $pool->setConnectionCloser(function ($redis) {\n            $redis->close();\n        });\n        $pool->setHeartbeatChecker(function ($redis) {\n            $redis->ping();\n        });\n        $this->pool = $pool;\n    }\n    public function get(): \\Redis\n    {\n        return $this->pool->get();\n    }\n    public function put($redis): void\n    {\n        $this->pool->put($redis);\n    }\n}\n\n\u002F\u002F Http Server\n$worker = new Worker('http:\u002F\u002F0.0.0.0:8001');\n$worker->eventLoop = Swoole::class; \u002F\u002F Or Swow::class or Fiber::class\n$worker->onMessage = function (TcpConnection $connection, Request $request) {\n    static $pool;\n    if (!$pool) {\n        $pool = new RedisPool('127.0.0.1', 6379, 10);\n    }\n    $redis = $pool->get();\n    $redis->set('key', 'hello');\n    $value = $redis->get('key');\n    $pool->put($redis);\n    $connection->send($value);\n};\n\nWorker::runAll();\n```\n\n\n### Pool for automatic acquisition and release\n\n```php\n\u003C?php\nuse Workerman\\Connection\\TcpConnection;\nuse Workerman\\Coroutine\\Context;\nuse Workerman\\Coroutine;\nuse Workerman\\Coroutine\\Pool;\nuse Workerman\\Events\\Swoole;\nuse Workerman\\Protocols\\Http\\Request;\nuse Workerman\\Worker;\nrequire_once __DIR__ . '\u002Fvendor\u002Fautoload.php';\n\nclass Db\n{\n    private static ?Pool $pool = null;\n    public static function __callStatic($name, $arguments)\n    {\n        if (self::$pool === null) {\n            self::initializePool();\n        }\n        \u002F\u002F Get the connection from the coroutine context\n        \u002F\u002F to ensure the same connection is used within the same coroutine\n        $pdo = Context::get('pdo');\n        if (!$pdo) {\n            \u002F\u002F If no connection is retrieved, get one from the connection pool\n            $pdo = self::$pool->get();\n            Context::set('pdo', $pdo);\n            \u002F\u002F When the coroutine is destroyed, return the connection to the pool\n            Coroutine::defer(function () use ($pdo) {\n                self::$pool->put($pdo);\n            });\n        }\n        return call_user_func_array([$pdo, $name], $arguments);\n    }\n    private static function initializePool(): void\n    {\n        self::$pool = new Pool(10);\n        self::$pool->setConnectionCreator(function () {\n            return new \\PDO('mysql:host=127.0.0.1;dbname=your_database', 'your_username', 'your_password');\n        });\n        self::$pool->setConnectionCloser(function ($pdo) {\n            $pdo = null;\n        });\n        self::$pool->setHeartbeatChecker(function ($pdo) {\n            $pdo->query('SELECT 1');\n        });\n    }\n}\n\n\u002F\u002F Http Server\n$worker = new Worker('http:\u002F\u002F0.0.0.0:8001');\n$worker->eventLoop = Swoole::class; \u002F\u002F Or Swow::class or Fiber::class\n$worker->onMessage = function (TcpConnection $connection, Request $request) {\n    $value = Db::query('SELECT NOW() as now')->fetchAll();\n    $connection->send(json_encode($value));\n};\n\nWorker::runAll();\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# Benchmarks\nhttps:\u002F\u002Fwww.techempower.com\u002Fbenchmarks\u002F#section=data-r19&hw=ph&test=plaintext&l=zik073-1r\n\n\n### Supported by\n\n[![JetBrains logo.](https:\u002F\u002Fresources.jetbrains.com\u002Fstorage\u002Fproducts\u002Fcompany\u002Fbrand\u002Flogos\u002Fjetbrains.svg)](https:\u002F\u002Fjb.gg\u002FOpenSourceSupport)\n\n\n## Other links with workerman\n\n[webman](https:\u002F\u002Fgithub.com\u002Fwalkor\u002Fwebman)   \n[AdapterMan](https:\u002F\u002Fgithub.com\u002Fjoanhey\u002FAdapterMan)\n\n## Donate\n\u003Ca href=\"https:\u002F\u002Fwww.paypal.com\u002Fcgi-bin\u002Fwebscr?cmd=_s-xclick&hosted_button_id=UQGGS9UB35WWG\">PayPal\u003C\u002Fa>\n\n## LICENSE\n\nWorkerman is released under the [MIT license](https:\u002F\u002Fgithub.com\u002Fwalkor\u002Fworkerman\u002Fblob\u002Fmaster\u002FMIT-LICENSE.txt).\n","Workerman是一个高性能的异步事件驱动PHP框架，用于构建快速且可扩展的网络应用。它支持HTTP、WebSocket及自定义协议，并具备协程和连接池等特性，特别适合需要处理高并发场景的应用。此框架要求运行在POSIX兼容的操作系统上，并推荐使用Event\u002FSwoole\u002FSwow扩展以获得更佳性能。无论是开发即时通讯、在线游戏后端还是实时数据处理服务，Workerman都能提供稳定而高效的支持。",2,"2026-06-11 03:16:31","top_language"]