![]() |
VOOZH | about |
Build high-performance, scalable, concurrent TCP, UDP, Unix Socket, HTTP, WebSocket, GRPC services with PHP and easy to use coroutine, fibers API
Write your next scalable async application with PHP coroutines and fibers.
Compared with other async programming frameworks or software such as Nginx, Tornado, Node.js, Open Swoole is a complete async solution that has built-in support for async programming via fibers/coroutines, a range of multi-threaded I/O modules (HTTP Server, WebSockets, GRPC, TaskWorkers, Process Pools) and support for popular PHP clients like PDO for MySQL, Redis and CURL.
You can use sync or async, coroutine, fiber API to write the applications or create thousands of light weight fibers within one Linux process.
Open Swoole enhances the efficiency of your PHP applications and brings you out of the traditional stateless model, enabling you to focus on the development of innovative products at high scale, bringing event loops and asynchronous programming to the PHP language.
Event-driven, PHP Coroutine, PHP Fiber, Asynchronous API
Async TCP / UDP / HTTP / Websocket / HTTP2 / GRPC Client / Server Side API
IPv4 / IPv6 / UnixSocket / TCP / UDP and SSL / TLS / DTLS
Native PHP Coroutine and PHP Fiber Support
High performance, scalable, support C1000K
Milliseconds task scheduler
Multiprocessing and daemonize
PHP PSR support
GRPC server and clients
Free and Open Source (Apache 2 License)
# Linux users #!/bin/bashpecl install openswoole-26.2.0 # Mac users brew install php #!/bin/bashpecl install openswoole-26.2.0 # Install core librarycomposer require openswoole/core:26.2.0
<?php$server=newOpenSwoole\HTTP\Server("127.0.0.1",9501);$server->on("start",function(OpenSwoole\Http\Server$server){echo"OpenSwoole http server is started at http://127.0.0.1:9501\n";});$server->on("request",function(OpenSwoole\Http\Request$request,OpenSwoole\Http\Response$response){$response->header("Content-Type","text/plain");$response->end("Hello World\n");});$server->start();
<?php$server=newOpenSwoole\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();
<?php$server=newOpenSwoole\Server("127.0.0.1",9503);$server->on('connect',function($server,$fd){echo"connection open: {$fd}\n";});$server->on('receive',function($server,$fd,$from_id,$data){$server->send($fd,"OpenSwoole: {$data}");$server->close($fd);});$server->on('close',function($server,$fd){echo"connection close: {$fd}\n";});$server->start();
<?php$client=newOpenSwoole\Client(\OpenSwoole\Constant::SOCK_TCP);if(!$client->connect('127.0.0.1',9501,0.5)){exit("connect failed. Error: {$client->errCode}\n");}$client->send("hello world\n");echo$client->recv();$client->close();
<?php// Enable coroutine support for Redis APIco::set(['hook_flags'=>OpenSwoole\Runtime::HOOK_ALL]);$redis=newRedis();$redis->connect('127.0.0.1',6379);$val=$redis->get('key');echo$val;$http=newOpenSwoole\Coroutine\Http\Client('127.0.0.1',80);$http->get('/index.php');echo$http->body;$http->close();
<?php$server=newOpenSwoole\Http\Server("0.0.0.0",9501);$server->set(['worker_num'=>1,'task_worker_num'=>2,]);$server->on('Request',function($request,$response)use($server){$tasks[0]=['time'=>0];$tasks[1]=['data'=>'openswoole.com','code'=>200];$result=$server->taskCo($tasks,1.5);$response->end('<pre>Task Result: '.var_export($result,true));});$server->on('Task',function(OpenSwoole\Server$server,$task_id,$worker_id,$data){if($server->worker_id==1){sleep(1);}$data['done']=time();$data['worker_id']=$server->worker_id;return$data;});$server->start();
<?phprequire__DIR__.'/vendor/autoload.php';useOpenSwoole\Core\Psr\Middleware\StackHandler;useOpenSwoole\Core\Psr\Response;useOpenSwoole\HTTP\Server;usePsr\Http\Message\ResponseInterface;usePsr\Http\Message\ServerRequestInterface;usePsr\Http\Server\MiddlewareInterface;usePsr\Http\Server\RequestHandlerInterface;$server=newServer('127.0.0.1',9501);$server->on('start',function(Server$server){echo"OpenSwoole http server is started at http://127.0.0.1:9501 ";});classDefaultResponseMiddlewareimplementsMiddlewareInterface{publicfunctionprocess(ServerRequestInterface$request,RequestHandlerInterface$handler):ResponseInterface{return(newResponse('aaaa'))->withHeader('x-a','1234');}}$stack=(newStackHandler())->add(newDefaultResponseMiddleware());$server->setHandler($stack);$server->start();
<?phprequire__DIR__.'/vendor/autoload.php';useHelloworld\GreeterService;useHelloworld\StreamService;useOpenSwoole\GRPC\Middleware\LoggingMiddleware;useOpenSwoole\GRPC\Middleware\TraceMiddleware;useOpenSwoole\GRPC\Server;// enable hooks on IO clientsco::set(['hook_flags'=>OpenSwoole\Runtime::HOOK_ALL]);$server=(newServer('127.0.0.1',9501))->register(GreeterService::class)->register(StreamService::class)->withWorkerContext('worker_start_time',function(){returntime();})// use middlewares->addMiddleware(newLoggingMiddleware())->addMiddleware(newTraceMiddleware())->set(['log_level'=>\OpenSwoole\Constant::LOG_INFO,])->start();
Join 4,000+ others and never miss out on new tips, tutorials, and more.
Debug OpenSwoole Coroutines with Xdebug Step Debugging
Build a Production Health Check with OpenSwoole Event Loop Lag Metrics
MemVector: Vector Search, Embeddings and RAG in a PHP Extension
OpenSwoole 26.2.0 released with PHP 8.5 support
New Features and Changes in PHP 8.5 and OpenSwoole 26.2.0
OpenSwoole 25.2.0 released with PHP 8.4 support