{"id":15025687,"url":"https://github.com/ollyxar/websockets","last_synced_at":"2025-04-09T20:04:06.134Z","repository":{"id":57031042,"uuid":"107159638","full_name":"ollyxar/websockets","owner":"ollyxar","description":"PHP WebSocket server","archived":false,"fork":false,"pushed_at":"2018-08-08T18:23:37.000Z","size":55,"stargazers_count":31,"open_issues_count":1,"forks_count":7,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-04-09T20:04:00.862Z","etag":null,"topics":["composer","ollyxar-websockets","php","php-websocket-server","php7","php71","unix-socket","websocket-application","websocket-library","websocket-server","websockets"],"latest_commit_sha":null,"homepage":null,"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/ollyxar.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-10-16T17:22:02.000Z","updated_at":"2022-12-29T18:38:46.000Z","dependencies_parsed_at":"2022-08-23T18:50:38.473Z","dependency_job_id":null,"html_url":"https://github.com/ollyxar/websockets","commit_stats":null,"previous_names":[],"tags_count":17,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ollyxar%2Fwebsockets","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ollyxar%2Fwebsockets/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ollyxar%2Fwebsockets/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ollyxar%2Fwebsockets/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ollyxar","download_url":"https://codeload.github.com/ollyxar/websockets/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248103865,"owners_count":21048245,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["composer","ollyxar-websockets","php","php-websocket-server","php7","php71","unix-socket","websocket-application","websocket-library","websocket-server","websockets"],"created_at":"2024-09-24T20:02:50.662Z","updated_at":"2025-04-09T20:04:06.114Z","avatar_url":"https://github.com/ollyxar.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# PHP WebSocket server\n\n[![Build Status](https://travis-ci.org/ollyxar/websockets.svg?branch=master)](https://travis-ci.org/ollyxar/websockets)\n![Version](https://poser.pugx.org/ollyxar/websockets/v/stable.svg)\n![Downloads](https://poser.pugx.org/ollyxar/websockets/d/total.svg)\n![License](https://poser.pugx.org/ollyxar/websockets/license.svg)\n\nSimple and multifunctional PHP WebSocket server\n\n![ollyxar websockets](https://ollyxar.com/img/blog/ows.png)\n\n#### Live chat example\n\n![chat](https://i.imgur.com/7M9LhTD.jpg)\n\n#### Performance\n![ollyxar websockets performance](https://ollyxar.com/img/blog/wss.png)\n\n## Installing WebSockets\n\nThe recommended way to install WebSockets is through [Composer](http://getcomposer.org).\n\n```bash\n# Install Composer\ncurl -sS https://getcomposer.org/installer | php\n```\n\nNext, run the Composer command to install the latest stable version of WebSockets:\n\n```bash\nphp composer.phar require ollyxar/websockets\n```\n\nAfter installing, you need to require Composer's autoloader:\n\n```php\nrequire 'vendor/autoload.php';\n```\n\n## Simple WebSocket server\n\n### MyHandler.php\n\n```php\nuse Generator;\nuse Ollyxar\\LaravelAuth\\FileAuth;\nuse Ollyxar\\WebSockets\\{\n    Frame,\n    Handler as BaseHandler,\n    Dispatcher\n};\n\nclass MyHandler extends BaseHandler\n{\n    /**\n     * MyHandler constructor.\n     * @param $server\n     * @param $master\n     */\n    public function __construct($server, $master)\n    {\n        parent::__construct($server, $master);\n        echo \"I'm: #{$this-\u003epid}\\n\";\n    }\n\n    /**\n     * @param $client\n     * @return Generator\n     */\n    protected function onConnect($client): Generator\n    {\n        yield Dispatcher::async($this-\u003ebroadcast(Frame::encode(json_encode([\n            'type'    =\u003e 'system',\n            'message' =\u003e 'User {' . (int)$client . '} Connected.'\n        ]))));\n    }\n\n    /**\n     * @param $clientNumber\n     * @return Generator\n     */\n    protected function onClose($clientNumber): Generator\n    {\n        yield Dispatcher::async($this-\u003ebroadcast(Frame::encode(json_encode([\n            'type'    =\u003e 'system',\n            'message' =\u003e \"User {$clientNumber} disconnected.\"\n        ]))));\n    }\n\n    /**\n     * @param string $message\n     * @param int $socketId\n     * @return Generator\n     */\n    protected function onClientMessage(string $message, int $socketId): Generator\n    {\n        $message = json_decode($message);\n        if (!empty($message)) {\n            $userName = $message-\u003ename;\n            $userMessage = $message-\u003emessage;\n\n            $response = Frame::encode(json_encode([\n                'type'    =\u003e 'usermsg',\n                'name'    =\u003e $userName,\n                'message' =\u003e $userMessage\n            ]));\n\n            yield Dispatcher::async($this-\u003ebroadcast($response));\n        }\n    }\n}\n```\n\n### User validation\n\nBase `Handler` has own method to validate user to be logged in. By default it is always return true. You should provide your own implementation of method to authorize users.\n\n```php\n    /**\n     * Use this method for custom user validation\n     *\n     * @param array $headers\n     * @param $socket\n     * @return bool\n     */\n    protected function validateClient(array $headers, $socket): bool\n    {\n        return true;\n    }\n```\n\n### ws-server.php\n\n```php\n/**\n * Lets start our server\n */\n(new Server('0.0.0.0', 2083, 6, true))\n    -\u003esetCert()\n    -\u003esetPassPhrase()\n    -\u003esetHandler(MyHandler::class)\n    -\u003erun();\n```\n\n### Nginx reverse proxy\n\n```nginx\n# choose location path\nlocation /websocket/ {\n    # use same host and port from your settings!\n    proxy_pass http://0.0.0.0:2082/;\n    proxy_http_version 1.1;\n    proxy_set_header Upgrade $http_upgrade;\n    proxy_set_header Connection \"upgrade\";\n    proxy_read_timeout 86400;\n}\n```\n\n### Realtime testing (logging)\n\nThe server has internal logger that can output info into console.\nAll that you need is just to enable logging before launching server.\n\n```php\nLogger::enable();\n```\n\n![output logging](https://i.imgur.com/HaukgbL.jpg)\n\n### Communicate with server outside the wss protocol\n\n```php\nuse Ollyxar\\WebSockets\\Server as WServer;\nuse Ollyxar\\WebSockets\\Frame;\n\n$socket = socket_create(AF_UNIX, SOCK_STREAM, 0);\nsocket_connect($socket, WServer::$connector);\n\n$data = new stdClass();\n$data-\u003etype = 'system';\n$data-\u003emessage = 'hello World!';\n$msg = Frame::encode(json_encode($data));\n\nsocket_write($socket, $msg);\nsocket_close($socket);\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Follyxar%2Fwebsockets","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Follyxar%2Fwebsockets","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Follyxar%2Fwebsockets/lists"}