Top Related Projects
Event-driven, non-blocking I/O with PHP.
A non-blocking concurrency framework for PHP applications. 🐘
Cross-platform asynchronous I/O
Node.js JavaScript runtime ✨🐢🚀✨
PPM is a process manager, supercharger and load balancer for modern PHP applications.
Quick Overview
Swoole is a high-performance, asynchronous, and concurrent networking engine for PHP. It extends PHP's capabilities, allowing developers to build scalable, real-time web applications and services with ease. Swoole operates as a PHP extension, providing a powerful set of tools for network programming, coroutines, and more.
Pros
- High performance and low latency due to its event-driven, asynchronous architecture
- Supports coroutines, making it easier to write concurrent code in PHP
- Provides built-in components for HTTP, WebSocket, TCP, and UDP servers
- Seamless integration with existing PHP applications and frameworks
Cons
- Steep learning curve for developers new to asynchronous programming
- Requires compilation and installation as a PHP extension, which may be challenging for some users
- Limited compatibility with some existing PHP libraries and frameworks
- Debugging can be more complex compared to traditional PHP applications
Code Examples
- Creating a simple HTTP server:
use Swoole\HTTP\Server;
use Swoole\HTTP\Request;
use Swoole\HTTP\Response;
$server = new Server("127.0.0.1", 9501);
$server->on("request", function (Request $request, Response $response) {
$response->header("Content-Type", "text/plain");
$response->end("Hello, Swoole!");
});
$server->start();
- Using coroutines for concurrent tasks:
use Swoole\Coroutine;
Coroutine\run(function() {
$ch1 = Coroutine::create(function() {
Coroutine::sleep(2);
echo "Task 1 completed\n";
});
$ch2 = Coroutine::create(function() {
Coroutine::sleep(1);
echo "Task 2 completed\n";
});
});
- Creating a WebSocket server:
use Swoole\WebSocket\Server;
$server = new Server("127.0.0.1", 9502);
$server->on("message", function (Server $server, $frame) {
echo "Received message: {$frame->data}\n";
$server->push($frame->fd, "Server received: {$frame->data}");
});
$server->start();
Getting Started
-
Install Swoole:
pecl install swoole
-
Enable Swoole in your PHP configuration:
echo "extension=swoole.so" >> /path/to/php.ini
-
Create a new PHP file (e.g.,
server.php
) with the following content:<?php use Swoole\HTTP\Server; use Swoole\HTTP\Request; use Swoole\HTTP\Response; $server = new Server("127.0.0.1", 9501); $server->on("request", function (Request $request, Response $response) { $response->end("Hello, Swoole!"); }); $server->start();
-
Run the server:
php server.php
-
Access the server at
http://localhost:9501
in your web browser.
Competitor Comparisons
Event-driven, non-blocking I/O with PHP.
Pros of ReactPHP
- Pure PHP implementation, making it easier to install and deploy without additional system dependencies
- More flexible and lightweight, allowing developers to use only the components they need
- Better compatibility across different PHP versions and platforms
Cons of ReactPHP
- Generally slower performance compared to Swoole's C-based implementation
- Lacks some advanced features like coroutines and built-in server components
- Requires more manual configuration and setup for complex applications
Code Comparison
ReactPHP example:
$loop = React\EventLoop\Factory::create();
$socket = new React\Socket\Server('127.0.0.1:8080', $loop);
$socket->on('connection', function (React\Socket\ConnectionInterface $conn) {
$conn->write("Hello World!\n");
});
$loop->run();
Swoole example:
$server = new Swoole\HTTP\Server('127.0.0.1', 8080);
$server->on('request', function ($request, $response) {
$response->end("Hello World!\n");
});
$server->start();
Both examples create a simple HTTP server, but Swoole's implementation is more concise and offers better performance out of the box. ReactPHP provides more flexibility in terms of event handling and component selection, while Swoole offers a more integrated and high-performance solution with additional features like coroutines and built-in server components.
A non-blocking concurrency framework for PHP applications. 🐘
Pros of Amp
- Pure PHP implementation, making it easier to install and use across different environments
- More flexible and lightweight, allowing for easier integration into existing projects
- Better support for long-running processes and event-driven programming
Cons of Amp
- Generally slower performance compared to Swoole's C-based extension
- Less mature ecosystem and fewer built-in features
- May require more manual configuration for advanced use cases
Code Comparison
Amp example:
Loop::run(function () {
$response = yield HttpClient::request("GET", "http://example.com/");
$body = yield $response->getBody()->buffer();
echo $body;
});
Swoole example:
Co\run(function() {
$client = new Swoole\Coroutine\Http\Client('example.com', 80);
$client->get('/');
echo $client->body;
});
Both examples demonstrate asynchronous HTTP requests, but Amp uses generators and promises, while Swoole uses its built-in coroutine system. Swoole's approach is generally more performant but requires the Swoole extension, while Amp's solution is pure PHP and more portable.
Cross-platform asynchronous I/O
Pros of libuv
- More widely adopted and used in popular projects like Node.js
- Better cross-platform support, especially for Windows
- More mature and stable with a longer development history
Cons of libuv
- Lower-level API, requiring more code to implement complex functionality
- Lacks built-in networking protocols and database connectors
- Steeper learning curve for developers new to asynchronous programming
Code Comparison
libuv example (TCP echo server):
uv_tcp_t server;
uv_tcp_init(loop, &server);
uv_ip4_addr("0.0.0.0", 7000, &addr);
uv_tcp_bind(&server, (const struct sockaddr*)&addr, 0);
uv_listen((uv_stream_t*)&server, 128, on_new_connection);
Swoole example (TCP echo server):
$server = new Swoole\Server('127.0.0.1', 9501);
$server->on('connect', function ($server, $fd) {
echo "Client connected\n";
});
$server->start();
The libuv example demonstrates its lower-level C API, while Swoole showcases a higher-level PHP interface with built-in event handling. Swoole provides a more abstracted and easier-to-use API for network programming, while libuv offers finer control and broader platform support at the cost of increased complexity.
Node.js JavaScript runtime ✨🐢🚀✨
Pros of Node.js
- Larger ecosystem with more packages and libraries available
- Better documentation and community support
- More mature and stable platform with longer history
Cons of Node.js
- Generally slower performance compared to Swoole
- Higher memory usage, especially for long-running processes
- Less efficient for handling concurrent connections
Code Comparison
Node.js:
const http = require('http');
const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello World\n');
});
server.listen(8080);
Swoole:
$http = new Swoole\HTTP\Server('127.0.0.1', 8080);
$http->on('request', function ($request, $response) {
$response->header('Content-Type', 'text/plain');
$response->end('Hello World\n');
});
$http->start();
Both examples create a simple HTTP server that responds with "Hello World". The Swoole version is more concise and potentially more performant due to its event-driven, asynchronous nature. However, Node.js offers more flexibility and a larger ecosystem of modules for extending functionality.
PPM is a process manager, supercharger and load balancer for modern PHP applications.
Pros of php-pm
- Pure PHP implementation, easier to install and integrate
- Works with various PHP frameworks out of the box
- Supports multiple process managers (e.g., static, dynamic, ondemand)
Cons of php-pm
- Generally slower performance compared to Swoole
- Less mature and less actively maintained
- Limited to HTTP server functionality
Code Comparison
php-pm example:
$loop = Factory::create();
$socket = new Server('0.0.0.0:8080', $loop);
$server = new IoServer($loop);
$server->listen($socket);
$loop->run();
Swoole example:
$server = new Swoole\HTTP\Server('127.0.0.1', 9501);
$server->on('request', function ($request, $response) {
$response->end('<h1>Hello World</h1>');
});
$server->start();
Summary
php-pm is a pure PHP implementation for process management and HTTP serving, making it easier to integrate into existing PHP projects. It supports various PHP frameworks and offers flexibility in process management strategies. However, it generally provides lower performance compared to Swoole and has limited functionality beyond HTTP serving.
Swoole, on the other hand, is a C-based extension for PHP that offers superior performance and a wider range of features, including WebSocket support, async I/O, and more. It requires compilation and installation as a PHP extension, which may be more complex for some users.
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
Swoole is an event-driven, asynchronous, coroutine-based concurrency library with high performance for PHP.
âï¸ Quick Start
Run Swoole program by Docker
docker run --rm phpswoole/swoole "php --ri swoole"
For details on how to use it, see: How to Use This Image.
Documentation
HTTP Service
$http = new Swoole\Http\Server('127.0.0.1', 9501);
$http->set(['hook_flags' => SWOOLE_HOOK_ALL]);
$http->on('request', function ($request, $response) {
$result = [];
Co::join([
go(function () use (&$result) {
$result['google'] = file_get_contents("https://www.google.com/");
}),
go(function () use (&$result) {
$result['taobao'] = file_get_contents("https://www.taobao.com/");
})
]);
$response->end(json_encode($result));
});
$http->start();
Concurrency
Co\run(function() {
Co\go(function() {
while(1) {
sleep(1);
$fp = stream_socket_client("tcp://127.0.0.1:8000", $errno, $errstr, 30);
echo fread($fp, 8192), PHP_EOL;
}
});
Co\go(function() {
$fp = stream_socket_server("tcp://0.0.0.0:8000", $errno, $errstr, STREAM_SERVER_BIND | STREAM_SERVER_LISTEN);
while(1) {
$conn = stream_socket_accept($fp);
fwrite($conn, 'The local time is ' . date('n/j/Y g:i a'));
}
});
Co\go(function() {
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
while(true) {
$redis->subscribe(['test'], function ($instance, $channelName, $message) {
echo 'New redis message: '.$channelName, "==>", $message, PHP_EOL;
});
}
});
Co\go(function() {
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$count = 0;
while(true) {
sleep(2);
$redis->publish('test','hello, world, count='.$count++);
}
});
});
Runtime Hook
Swoole hooks the blocking io function of PHP at the bottom layer
and automatically
converts it to a non-blocking function, so that these functions can be called concurrently in coroutines.
Supported extension/functions
ext-curl
(Supportsymfony
andguzzle
)ext-redis
ext-mysqli
ext-pdo_mysql
ext-pdo_pgsql
ext-pdo_sqlite
ext-pdo_oracle
ext-pdo_odbc
stream functions
(e.g.stream_socket_client
/stream_socket_server
), SupportsTCP
/UDP
/UDG
/Unix
/SSL/TLS
/FileSystem API
/Pipe
ext-sockets
ext-soap
sleep
/usleep
/time_sleep_until
proc_open
gethostbyname
/shell_exec
/exec
fread
/fopen
/fsockopen
/fwrite
/flock
ð Develop & Discussion
- IDE Helper & API: https://github.com/swoole/ide-helper
- Twitter: https://twitter.com/phpswoole
- Discord: https://discord.swoole.dev
- ä¸æ社åº: https://wiki.swoole.com/#/other/discussion
ð Awesome Swoole
Project Awesome Swoole maintains a curated list of awesome things related to Swoole, including
- Swoole-based frameworks and libraries.
- Packages to integrate Swoole with popular PHP frameworks, including Laravel, Symfony, Slim, and Yii.
- Books, videos, and other learning materials about Swoole.
- Debugging, profiling, and testing tools for developing Swoole-based applications.
- Coroutine-friendly packages and libraries.
- Other Swoole related projects and resources.
⨠Event-based
The network layer in Swoole is event-based and takes full advantage of the underlying epoll/kqueue implementation, making it really easy to serve millions of requests.
Swoole 4.x uses a brand new engine kernel and now it has a full-time developer team, so we are entering an unprecedented period in PHP history which offers a unique possibility for rapid evolution in performance.
â¡ Coroutine
Swoole 4.x or later supports the built-in coroutine with high availability, and you can use fully synchronized code to implement asynchronous performance. PHP code without any additional keywords, the underlying automatic coroutine-scheduling.
Developers can understand coroutines as ultra-lightweight threads, and you can easily create thousands of coroutines in a single process.
MySQL
Concurrency 10K requests to read data from MySQL takes only 0.2s!
$s = microtime(true);
Co\run(function() {
for ($c = 100; $c--;) {
go(function () {
$mysql = new Swoole\Coroutine\MySQL;
$mysql->connect([
'host' => '127.0.0.1',
'user' => 'root',
'password' => 'root',
'database' => 'test'
]);
$statement = $mysql->prepare('SELECT * FROM `user`');
for ($n = 100; $n--;) {
$result = $statement->execute();
assert(count($result) > 0);
}
});
}
});
echo 'use ' . (microtime(true) - $s) . ' s';
Mixed server
You can create multiple services on the single event loop: TCP, HTTP, Websocket and HTTP2, and easily handle thousands of requests.
function tcp_pack(string $data): string
{
return pack('N', strlen($data)) . $data;
}
function tcp_unpack(string $data): string
{
return substr($data, 4, unpack('N', substr($data, 0, 4))[1]);
}
$tcp_options = [
'open_length_check' => true,
'package_length_type' => 'N',
'package_length_offset' => 0,
'package_body_offset' => 4
];
$server = new Swoole\WebSocket\Server('127.0.0.1', 9501, SWOOLE_BASE);
$server->set(['open_http2_protocol' => true]);
// http && http2
$server->on('request', function (Swoole\Http\Request $request, Swoole\Http\Response $response) {
$response->end('Hello ' . $request->rawcontent());
});
// websocket
$server->on('message', function (Swoole\WebSocket\Server $server, Swoole\WebSocket\Frame $frame) {
$server->push($frame->fd, 'Hello ' . $frame->data);
});
// tcp
$tcp_server = $server->listen('127.0.0.1', 9502, SWOOLE_TCP);
$tcp_server->set($tcp_options);
$tcp_server->on('receive', function (Swoole\Server $server, int $fd, int $reactor_id, string $data) {
$server->send($fd, tcp_pack('Hello ' . tcp_unpack($data)));
});
$server->start();
Coroutine clients
Whether you DNS query or send requests or receive responses, all of these are scheduled by coroutine automatically.
go(function () {
// http
$http_client = new Swoole\Coroutine\Http\Client('127.0.0.1', 9501);
assert($http_client->post('/', 'Swoole Http'));
var_dump($http_client->body);
// websocket
$http_client->upgrade('/');
$http_client->push('Swoole Websocket');
var_dump($http_client->recv()->data);
});
go(function () {
// http2
$http2_client = new Swoole\Coroutine\Http2\Client('localhost', 9501);
$http2_client->connect();
$http2_request = new Swoole\Http2\Request;
$http2_request->method = 'POST';
$http2_request->data = 'Swoole Http2';
$http2_client->send($http2_request);
$http2_response = $http2_client->recv();
var_dump($http2_response->data);
});
go(function () use ($tcp_options) {
// tcp
$tcp_client = new Swoole\Coroutine\Client(SWOOLE_TCP);
$tcp_client->set($tcp_options);
$tcp_client->connect('127.0.0.1', 9502);
$tcp_client->send(tcp_pack('Swoole Tcp'));
var_dump(tcp_unpack($tcp_client->recv()));
});
Channel
Channel is the only way for exchanging data between coroutines, the development combination of the Coroutine + Channel
is the famous CSP programming model.
In Swoole development, Channel is usually used for implementing connection pool or scheduling coroutine concurrent.
The simplest example of a connection pool
In the following example, we have a thousand concurrently requests to redis. Normally, this has exceeded the maximum number of Redis connections setting and will throw a connection exception, but the connection pool based on Channel can perfectly schedule requests. We don't have to worry about connection overload.
class RedisPool
{
/**@var \Swoole\Coroutine\Channel */
protected $pool;
/**
* RedisPool constructor.
* @param int $size max connections
*/
public function __construct(int $size = 100)
{
$this->pool = new \Swoole\Coroutine\Channel($size);
for ($i = 0; $i < $size; $i++) {
$redis = new \Swoole\Coroutine\Redis();
$res = $redis->connect('127.0.0.1', 6379);
if ($res == false) {
throw new \RuntimeException("failed to connect redis server.");
} else {
$this->put($redis);
}
}
}
public function get(): \Swoole\Coroutine\Redis
{
return $this->pool->pop();
}
public function put(\Swoole\Coroutine\Redis $redis)
{
$this->pool->push($redis);
}
public function close(): void
{
$this->pool->close();
$this->pool = null;
}
}
go(function () {
$pool = new RedisPool();
// max concurrency num is more than max connections
// but it's no problem, channel will help you with scheduling
for ($c = 0; $c < 1000; $c++) {
go(function () use ($pool, $c) {
for ($n = 0; $n < 100; $n++) {
$redis = $pool->get();
assert($redis->set("awesome-{$c}-{$n}", 'swoole'));
assert($redis->get("awesome-{$c}-{$n}") === 'swoole');
assert($redis->delete("awesome-{$c}-{$n}"));
$pool->put($redis);
}
});
}
});
Producer and consumers
Some Swoole's clients implement the defer mode for concurrency, but you can still implement it flexible with a combination of coroutines and channels.
go(function () {
// User: I need you to bring me some information back.
// Channel: OK! I will be responsible for scheduling.
$channel = new Swoole\Coroutine\Channel;
go(function () use ($channel) {
// Coroutine A: Ok! I will show you the github addr info
$addr_info = Co::getaddrinfo('github.com');
$channel->push(['A', json_encode($addr_info, JSON_PRETTY_PRINT)]);
});
go(function () use ($channel) {
// Coroutine B: Ok! I will show you what your code look like
$mirror = Co::readFile(__FILE__);
$channel->push(['B', $mirror]);
});
go(function () use ($channel) {
// Coroutine C: Ok! I will show you the date
$channel->push(['C', date(DATE_W3C)]);
});
for ($i = 3; $i--;) {
list($id, $data) = $channel->pop();
echo "From {$id}:\n {$data}\n";
}
// User: Amazing, I got every information at earliest time!
});
Timer
$id = Swoole\Timer::tick(100, function () {
echo "âï¸ Do something...\n";
});
Swoole\Timer::after(500, function () use ($id) {
Swoole\Timer::clear($id);
echo "â° Done\n";
});
Swoole\Timer::after(1000, function () use ($id) {
if (!Swoole\Timer::exists($id)) {
echo "â
All right!\n";
}
});
The way of coroutine
go(function () {
$i = 0;
while (true) {
Co::sleep(0.1);
echo "ð Do something...\n";
if (++$i === 5) {
echo "ð Done\n";
break;
}
}
echo "ð All right!\n";
});
ð¥ Amazing runtime hooks
As of Swoole v4.1.0, we added the ability to transform synchronous PHP network libraries into co-routine libraries using a single line of code.
Simply call the Swoole\Runtime::enableCoroutine()
method at the top of your script. In the sample below we connect to php-redis and concurrently read 10k requests in 0.1s:
Swoole\Runtime::enableCoroutine();
$s = microtime(true);
Co\run(function() {
for ($c = 100; $c--;) {
go(function () {
($redis = new Redis)->connect('127.0.0.1', 6379);
for ($n = 100; $n--;) {
assert($redis->get('awesome') === 'swoole');
}
});
}
});
echo 'use ' . (microtime(true) - $s) . ' s';
By calling this method, the Swoole kernel replaces ZendVM stream function pointers. If you use php_stream
based extensions, all socket operations can be dynamically converted to be asynchronous IO scheduled by coroutine at runtime!
How many things you can do in 1s?
Sleep 10K times, read, write, check and delete files 10K times, use PDO and MySQLi to communicate with the database 10K times, create a TCP server and multiple clients to communicate with each other 10K times, create a UDP server and multiple clients to communicate with each other 10K times... Everything works well in one process!
Just see what the Swoole brings, just imagine...
Swoole\Runtime::enableCoroutine();
$s = microtime(true);
Co\run(function() {
// i just want to sleep...
for ($c = 100; $c--;) {
go(function () {
for ($n = 100; $n--;) {
usleep(1000);
}
});
}
// 10K file read and write
for ($c = 100; $c--;) {
go(function () use ($c) {
$tmp_filename = "/tmp/test-{$c}.php";
for ($n = 100; $n--;) {
$self = file_get_contents(__FILE__);
file_put_contents($tmp_filename, $self);
assert(file_get_contents($tmp_filename) === $self);
}
unlink($tmp_filename);
});
}
// 10K pdo and mysqli read
for ($c = 50; $c--;) {
go(function () {
$pdo = new PDO('mysql:host=127.0.0.1;dbname=test;charset=utf8', 'root', 'root');
$statement = $pdo->prepare('SELECT * FROM `user`');
for ($n = 100; $n--;) {
$statement->execute();
assert(count($statement->fetchAll()) > 0);
}
});
}
for ($c = 50; $c--;) {
go(function () {
$mysqli = new Mysqli('127.0.0.1', 'root', 'root', 'test');
$statement = $mysqli->prepare('SELECT `id` FROM `user`');
for ($n = 100; $n--;) {
$statement->bind_result($id);
$statement->execute();
$statement->fetch();
assert($id > 0);
}
});
}
// php_stream tcp server & client with 12.8K requests in single process
function tcp_pack(string $data): string
{
return pack('n', strlen($data)) . $data;
}
function tcp_length(string $head): int
{
return unpack('n', $head)[1];
}
go(function () {
$ctx = stream_context_create(['socket' => ['so_reuseaddr' => true, 'backlog' => 128]]);
$socket = stream_socket_server(
'tcp://0.0.0.0:9502',
$errno, $errstr, STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, $ctx
);
if (!$socket) {
echo "$errstr ($errno)\n";
} else {
$i = 0;
while ($conn = stream_socket_accept($socket, 1)) {
stream_set_timeout($conn, 5);
for ($n = 100; $n--;) {
$data = fread($conn, tcp_length(fread($conn, 2)));
assert($data === "Hello Swoole Server #{$n}!");
fwrite($conn, tcp_pack("Hello Swoole Client #{$n}!"));
}
if (++$i === 128) {
fclose($socket);
break;
}
}
}
});
for ($c = 128; $c--;) {
go(function () {
$fp = stream_socket_client("tcp://127.0.0.1:9502", $errno, $errstr, 1);
if (!$fp) {
echo "$errstr ($errno)\n";
} else {
stream_set_timeout($fp, 5);
for ($n = 100; $n--;) {
fwrite($fp, tcp_pack("Hello Swoole Server #{$n}!"));
$data = fread($fp, tcp_length(fread($fp, 2)));
assert($data === "Hello Swoole Client #{$n}!");
}
fclose($fp);
}
});
}
// udp server & client with 12.8K requests in single process
go(function () {
$socket = new Swoole\Coroutine\Socket(AF_INET, SOCK_DGRAM, 0);
$socket->bind('127.0.0.1', 9503);
$client_map = [];
for ($c = 128; $c--;) {
for ($n = 0; $n < 100; $n++) {
$recv = $socket->recvfrom($peer);
$client_uid = "{$peer['address']}:{$peer['port']}";
$id = $client_map[$client_uid] = ($client_map[$client_uid] ?? -1) + 1;
assert($recv === "Client: Hello #{$id}!");
$socket->sendto($peer['address'], $peer['port'], "Server: Hello #{$id}!");
}
}
$socket->close();
});
for ($c = 128; $c--;) {
go(function () {
$fp = stream_socket_client("udp://127.0.0.1:9503", $errno, $errstr, 1);
if (!$fp) {
echo "$errstr ($errno)\n";
} else {
for ($n = 0; $n < 100; $n++) {
fwrite($fp, "Client: Hello #{$n}!");
$recv = fread($fp, 1024);
list($address, $port) = explode(':', (stream_socket_get_name($fp, true)));
assert($address === '127.0.0.1' && (int)$port === 9503);
assert($recv === "Server: Hello #{$n}!");
}
fclose($fp);
}
});
}
});
echo 'use ' . (microtime(true) - $s) . ' s';
âï¸ Installation
As with any open source project, Swoole always provides the most reliable stability and the most powerful features in the latest released version. Please ensure as much as possible that you are using the latest version.
Compiling requirements
- Linux, OS X or Cygwin, WSL
- PHP 7.2.0 or later (The higher the version, the better the performance.)
- GCC 4.8 or later
1. Install via PECL (beginners)
pecl install swoole
2. Install from source (recommended)
Please download the source packages from Releases or:
git clone https://github.com/swoole/swoole-src.git && \
cd swoole-src
Compile and install at the source folder:
phpize && \
./configure && \
make && make install
Enable extension in PHP
After compiling and installing to the system successfully, you have to add a new line extension=swoole.so
to php.ini
to enable Swoole extension.
Extra compiler configurations
for example:
./configure --enable-openssl --enable-sockets
--enable-openssl
or--with-openssl-dir=DIR
--enable-sockets
--enable-mysqlnd
(need mysqlnd, it just for supporting$mysql->escape
method)--enable-swoole-curl
Upgrade
â ï¸ If you upgrade from source, don't forget to
make clean
before you upgrade your swoole
pecl upgrade swoole
cd swoole-src && git pull && make clean && make && sudo make install
- if you change your PHP version, please re-run
phpize clean && phpize
then try to compile
Major change since version 4.3.0
Async clients and API are moved to a separate PHP extension swoole_async
since version 4.3.0, install swoole_async
:
git clone https://github.com/swoole/ext-async.git
cd ext-async
phpize
./configure
make -j 4
sudo make install
Enable it by adding a new line extension=swoole_async.so
to php.ini
.
ð Benchmark
- On the open source Techempower Web Framework benchmarks Swoole used MySQL database benchmark to rank first, and all performance tests ranked in the first echelon.
- You can just run Benchmark Script to quickly test the maximum QPS of Swoole-HTTP-Server on your machine.
ð°ï¸ Security issues
Security issues should be reported privately, via email, to the Swoole develop team team@swoole.com. You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message.
ðï¸ Contribution
Your contribution to Swoole development is very welcome!
You may contribute in the following ways:
- Report issues and feedback
- Submit fixes, features via Pull Request
- Write/polish documentation
â¤ï¸ Contributors
This project exists thanks to all the people who contribute. [Contributors].
ðï¸ Official Evangelist
Demin has been playing with PHP since 2000, focusing on building high-performance, secure web services. He is an occasional conference speaker on PHP and Swoole, and has been working for companies in the states like eBay, Visa and Glu Mobile for years. You may find Demin on Twitter or GitHub.
ð License
Apache License Version 2.0 see http://www.apache.org/licenses/LICENSE-2.0.html
Top Related Projects
Event-driven, non-blocking I/O with PHP.
A non-blocking concurrency framework for PHP applications. 🐘
Cross-platform asynchronous I/O
Node.js JavaScript runtime ✨🐢🚀✨
PPM is a process manager, supercharger and load balancer for modern PHP applications.
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot