Criando Aplicações PHP de Alta Performance com Swoole no ServBay
O ServBay é um ambiente de desenvolvimento local para web pensado especialmente para desenvolvedores. Ele já integra diversos ambientes de linguagem, bancos de dados e ferramentas, facilitando o fluxo de trabalho no desenvolvimento local. Neste artigo, mostramos como utilizar a extensão Swoole junto ao ServBay para potencializar aplicações PHP, permitindo a criação de serviços de rede de alta performance.
O que é Swoole?
Swoole é um motor de comunicação de rede paralelo e de alto desempenho para PHP, baseado em corrotinas. Escrito totalmente em C, ele oferece recursos de comunicação de rede assíncrona, paralela e com corrotinas na linguagem PHP. Com o Swoole, desenvolvedores PHP podem superar as limitações do modelo tradicional de requisição-resposta de servidores web (como Apache/Nginx + PHP-FPM), processando tarefas de alta concorrência de forma muito mais eficiente — por exemplo, construindo servidores web residentes em memória, processando tarefas assíncronas e serviços de comunicação em tempo real, como WebSocket.
Destaques do Swoole:
- Alta performance: Implementado em C, fornece IO assíncrono, suporte multi-processos e multi-thread.
- Corrotinas: Permite execução assíncrona com código síncrono, tornando o modelo de programação assíncrona simples.
- Suporte a diversos protocolos: Nativamente compatível com TCP, UDP, HTTP, WebSocket e outros protocolos de rede.
- Fácil de usar: APIs simples, no estilo PHP.
- Processo residente: O aplicativo permanece rodando em memória, eliminando o custo de inicializar o ambiente a cada requisição PHP.
Com Swoole, o PHP deixa de ser apenas uma linguagem de script para web — ele passa a oferecer soluções para uma grande variedade de aplicações de rede de alto desempenho.
Habilitando Swoole no ServBay
Um dos principais objetivos do ServBay é facilitar a gestão e o uso de extensões PHP. O Swoole, essencial para desenvolvimento PHP moderno de alta performance, já vem pré-instalado no ServBay. Habilitá-lo requer poucos passos:
Pré-requisitos:
- ServBay instalado e em execução.
- Pelo menos uma versão do PHP instalada no ServBay.
Passos para habilitar:
- Abra a interface do ServBay.
- Vá até “Pacotes (Packages)” ou à área de gerenciamento das versões PHP. (Dependendo da versão, o nome pode variar; geralmente está na tela principal ou em configurações)
- Selecione a versão do PHP em que deseja habilitar o Swoole.
- Encontre e marque a opção da extensão Swoole. O ServBay geralmente exibe as extensões compiladas em lista ou interruptores.
- Salve as alterações e reinicie o ServBay ou o serviço PHP conforme solicitado. O ServBay configurará automaticamente o PHP para carregar o Swoole.
Pronto! Agora basta executar o comando php -m
no terminal para verificar se o swoole
aparece na lista de módulos carregados.
TIP
Por padrão, o ServBay recomenda que você salve seus sites e arquivos de projeto nos seguintes diretórios, facilitando a gestão e configuração:
- macOS:
/Applications/ServBay/www
- Windows:
C:\ServBay\www
Nos exemplos abaixo, usaremos esses caminhos sugeridos.
Criando um Servidor HTTP Swoole Simples
A seguir, vamos montar um servidor HTTP básico com Swoole e mostrar como tratar requisições web.
Passo 1: Crie a pasta do projeto
Abra o terminal, crie e acesse uma nova pasta para seu projeto. Seguindo a sugestão do ServBay:
macOS:
bash
cd /Applications/ServBay/www
mkdir servbay-swoole-http
cd servbay-swoole-http
1
2
3
2
3
Windows:
cmd
cd C:\ServBay\www
mkdir servbay-swoole-http
cd servbay-swoole-http
1
2
3
2
3
Passo 2: Escreva o script do servidor
Na pasta servbay-swoole-http
, crie um arquivo chamado server.php
com o seguinte conteúdo:
php
<?php
use Swoole\Http\Server;
use Swoole\Http\Request;
use Swoole\Http\Response;
// Cria uma instância do servidor HTTP Swoole
// O servidor escuta todas as interfaces de rede (0.0.0.0) na porta 9501
$server = new Server("0.0.0.0", 9501);
// Registra o callback do evento 'start'
// Acionado quando o servidor é iniciado com sucesso
$server->on("start", function (Server $server) {
echo "Swoole HTTP server is started at http://0.0.0.0:9501\n";
// Você pode registrar o ID do processo principal, IDs de processos gerentes, etc.
});
// Registra o callback do evento 'request'
// Acionado ao receber uma nova requisição HTTP
$server->on("request", function (Request $request, Response $response) {
// Define o cabeçalho de resposta
$response->header("Content-Type", "text/plain");
// Processa lógica de acordo com o caminho da requisição ou parâmetros
$path = $request->server['request_uri'] ?? '/';
$content = "Hello ServBay!";
if ($path === '/info') {
$content = "Request path: " . $path . "\n";
$content .= "Method: " . $request->server['request_method'] . "\n";
$content .= "Client IP: " . $request->server['remote_addr'] . "\n";
// Mais informações da requisição disponíveis via $request
}
// Envia a resposta e finaliza a requisição
$response->end($content);
});
// Inicia o servidor
$server->start();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Esse script cria um servidor HTTP Swoole escutando na porta 9501. Ao receber uma requisição, ele responde com "Hello ServBay!". Se a rota for /info
, retorna informações da requisição.
Passo 3: Execute o servidor Swoole
Certifique-se de estar na pasta servbay-swoole-http
no terminal. Execute o servidor com o PHP do ServBay já habilitado para Swoole:
bash
php server.php
1
Se tudo estiver correto, você verá a seguinte mensagem no terminal:
bash
Swoole HTTP server is started at http://0.0.0.0:9501
1
Significa que o servidor HTTP está ativo e escutando a porta 9501.
Passo 4: Acesse o servidor Swoole
Abra seu navegador e acesse:
http://localhost:9501
http://localhost:9501/info
Você verá, respectivamente, o texto Hello ServBay!
e as informações da requisição.
Para parar o servidor, volte ao terminal em que o script está rodando e pressione Ctrl + C
.
Lidando com Conexões WebSocket com Swoole
Swoole oferece suporte nativo a WebSocket, sendo ideal para aplicativos de comunicação em tempo real como chats, jogos, ou push de dados.
Passo 1: Crie o script do servidor WebSocket
No diretório do projeto (servbay-swoole-http
ou um novo, como servbay-swoole-websocket
), crie o arquivo websocket_server.php
com este conteúdo:
Caminho do projeto:
- macOS:
/Applications/ServBay/www/servbay-swoole-http
- Windows:
C:\ServBay\www\servbay-swoole-http
php
<?php
use Swoole\WebSocket\Server;
use Swoole\Http\Request;
use Swoole\WebSocket\Frame;
// Cria uma instância do servidor WebSocket Swoole
// O servidor WebSocket herda do HTTP e pode também lidar com requisições HTTP
$server = new Server("0.0.0.0", 9502); // Escuta na porta 9502
// Registra o evento 'start', acionado ao iniciar o servidor
$server->on("start", function (Server $server) {
echo "Swoole WebSocket server is started at ws://0.0.0.0:9502\n";
});
// Registra o evento 'open'
// Acionado ao estabelecer uma nova conexão WebSocket
// O objeto $request contém informações do cliente, como $request->fd (descritor do cliente)
$server->on("open", function (Server $server, Request $request) {
echo "connection open: {$request->fd}\n";
// Pode enviar uma mensagem de boas-vindas ao cliente
$server->push($request->fd, "Welcome to ServBay WebSocket Demo!");
});
// Registra o evento 'message'
// Acionado ao receber uma mensagem WebSocket do cliente
// $frame contém os dados da mensagem e o descritor do cliente
$server->on("message", function (Server $server, Frame $frame) {
echo "received message from {$frame->fd}: {$frame->data}\n";
// Responde ao remetente ou faz broadcast para todos os clientes conectados
// Aqui, respondendo ao remetente:
$server->push($frame->fd, "Hello, you sent: {$frame->data}");
// Exemplo de broadcast (necessário manter a lista de conexões ou iterar)
// foreach ($server->connections as $fd) {
// if ($fd != $frame->fd) { // Não envia para o próprio remetente
// $server->push($fd, "User {$frame->fd} says: {$frame->data}");
// }
// }
});
// Registra o evento 'close'
// Acionado ao fechar a conexão do cliente
$server->on("close", function ($ser, $fd) {
echo "connection close: {$fd}\n";
});
// Inicia o servidor
$server->start();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
Esse script monta um servidor WebSocket com Swoole na porta 9502. Ele define callbacks para os principais eventos: start
(ao iniciar), open
(nova conexão), message
(receber mensagem), e close
(desconexão). No evento message
, o servidor responde ao remetente com o texto recebido.
Passo 2: Execute o servidor WebSocket
No terminal, navegue até o diretório onde está o websocket_server.php
e execute com PHP do ServBay (habilitado para Swoole):
bash
php websocket_server.php
1
Você verá a mensagem:
bash
Swoole WebSocket server is started at ws://0.0.0.0:9502
1
O servidor WebSocket está ativo na porta 9502.
Passo 3: Conectando ao servidor WebSocket
Há diversos métodos para conectar e testar esse servidor.
Método A: Ferramentas do navegador
Nos navegadores modernos, use o painel “Console” (F12) para testar a conexão:
Acesse uma página (ex:
about:blank
).Abra o Console no DevTools.
Execute:
javascriptvar ws = new WebSocket("ws://localhost:9502"); ws.onopen = function(event) { console.log("WebSocket connection opened:", event); ws.send("Hello from Browser!"); // Mensagem inicial ao conectar }; ws.onmessage = function(event) { console.log("Message from server:", event.data); // Mensagem recebida }; ws.onerror = function(event) { console.error("WebSocket error:", event); // Erro }; ws.onclose = function(event) { console.log("WebSocket connection closed:", event); // Conexão encerrada }; // Use ws.send("sua mensagem") para enviar, ws.close() para fechar
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20Observe as mensagens no Console e logs no terminal do servidor.
Método B: Usando o wscat
O wscat
é um cliente WebSocket de linha de comando baseado em Node.js.
Instale o
wscat
: Certifique-se de ter Node.js e npm. Instale globalmente:bashnpm install -g wscat
1Conecte ao servidor WebSocket:
bashwscat -c ws://localhost:9502
1Se conectar, verá o prompt
>
.Envie mensagens: Digite e pressione enter:
bash> Hello ServBay via wscat
1O servidor devolverá:
bash< Hello, you sent: Hello ServBay via wscat
1Os logs aparecerão também no terminal do servidor.
Para desconectar, pressione Ctrl + C
.
Pontos de Atenção
- Conflito de portas: Tenha certeza que as portas (9501, 9502, etc.) não estão ocupadas por outros programas. Se houver conflito, o Swoole não iniciará.
- Versão do PHP: Certifique-se de que está rodando os scripts com a versão do PHP habilitada para o Swoole no ServBay (use
php -v
para checar). O ServBay possibilita alternar facilmente entre versões de PHP. - Status das extensões: Se o servidor falhar ao iniciar, confira se o Swoole está habilitado para a versão de PHP usada e se o ServBay/PHP foi reiniciado após alterações.
- Gestão de processos residentes: O servidor Swoole permanece rodando em background. Em produção, recomenda-se usar gestores de processos como Supervisor, Systemd, pm2, etc., para garantir reinício automático em caso de falha. No desenvolvimento com ServBay, rodar manualmente no terminal já é suficiente.
Conclusão
Com o ServBay, é simples ativar e usar a extensão Swoole, permitindo que você construa e teste aplicações PHP de alta performance no seu ambiente local — seja para servidores HTTP tradicionais ou aplicações modernas de comunicação em tempo real via WebSocket. A combinação do poder do Swoole com a praticidade do ServBay abre novos horizontes para desenvolvedores PHP, promovendo sistemas ainda mais eficientes e robustos. Experimente o Swoole no ServBay agora mesmo!