Introdução ao Hyperf para PHP

Posted on: January 27, 2026 08:38 PM

Posted by: Renato

Views: 411

Introdução ao Hyperf para PHP 

O que é hyperf ?  Hyperf para o PHP? Framework e como usar?

Se você vem do mundo PHP tradicional (como Laravel ou Symfony rodando em Apache/Nginx), o Hyperf vai parecer um salto para o futuro.

Em resumo: o Hyperf é um framework PHP de alta performance e nativo para a nuvem, focado em microserviços e persistência de memória.


O que torna o Hyperf diferente?

A maioria dos frameworks PHP segue o modelo "share-nothing": a cada requisição, o PHP inicia do zero e morre ao terminar. O Hyperf utiliza o Swoole ou o Swow, que são extensões que permitem ao PHP rodar em corrotinas.

Isso significa que o PHP passa a funcionar de forma semelhante ao Node.js ou Go: o servidor sobe uma vez, mantém as conexões abertas e gerencia múltiplas tarefas simultaneamente sem travar o processo principal.

Principais Características

  • Velocidade Extrema: Milhares de requisições por segundo com baixíssimo consumo de CPU.

  • Injeção de Dependência (DI): Um sistema de DI extremamente robusto com suporte a anotações/atributos.

  • AOP (Programação Orientada a Aspectos): Permite "interceptar" métodos sem alterar o código original (ideal para logs ou cache).

  • Cloud Native: Já vem com componentes prontos para Service Discovery, Circuit Breaker e gRPC.


Como ele se compara ao Laravel?

Característica Laravel (Tradicional) Hyperf
Servidor Nginx + PHP-FPM Swoole / Swow (Standalone)
Estado Stateless (reinicia sempre) Stateful (mantém dados na memória)
I/O Bloqueante Não-bloqueante (Corrotinas)
Curva de Aprendizado Baixa/Média Média/Alta

Como usar (Primeiros Passos)

Para rodar o Hyperf, você precisa da extensão Swoole instalada no seu ambiente PHP ou, o que é mais comum e recomendado, usar Docker.

1. Instalação via Composer

Você pode criar um projeto novo usando o esqueleto oficial:

Bash

composer create-project hyperf/hyperf-skeleton

Durante a instalação, o terminal perguntará quais componentes você deseja incluir (Redis, Database, etc.). O Hyperf é modular: você só instala o que vai usar.

2. Estrutura de um Controller

A sintaxe será familiar se você conhece o ecossistema moderno do PHP, mas com o uso intenso de Attributes:

PHP

namespace App\Controller;

use Hyperf\HttpServer\Annotation\AutoController;

#[AutoController]
class IndexController
{
    public function index()
    {
        return [
            'mensagem' => 'Olá, Hyperf!',
        ];
    }
}

3. Iniciando o Servidor

Diferente do php artisan serve, aqui você inicia o servidor de corrotinas:

Bash

php bin/hyperf.php start

Quando escolher o Hyperf?

  • Se você precisa construir Microserviços que escalam horizontalmente.

  • Se sua aplicação lida com WebSockets ou conexões de longa duração.

  • Se o custo de infraestrutura do PHP-FPM está ficando alto demais para o seu volume de tráfego.

Cuidado: Como o Hyperf mantém a aplicação na memória, erros de "memory leak" ou variáveis globais mal geridas podem derrubar o serviço. É uma ferramenta poderosa, mas exige mais atenção ao ciclo de vida das variáveis.

Para rodar o Hyperf de forma otimizada, o ideal é usar uma imagem base que já contenha o Swoole (ou Swow) pré-instalado. A equipe oficial do Hyperf mantém imagens excelentes no Docker Hub.

Aqui está uma configuração profissional, focada em performance e pronta para desenvolvimento:

1. Dockerfile (Otimizado)

Este Dockerfile utiliza uma abordagem de estágio único para simplicidade, mas foca em configurações recomendadas para o ambiente de execução do Hyperf.

Dockerfile

# Usamos a imagem oficial do Hyperf que já vem com PHP 8.1/8.2 e Swoole
FROM hyperf/hyperf:8.2-alpine-v3.18-swoole

LABEL maintainer="Hyperf Developer <[email protected]>" version="1.0"

##
# Instalação de dependências extras (se necessário)
# O Alpine é muito leve, então adicionamos apenas o essencial
##
RUN apk update && apk add --no-cache \
    libstdc++ \
    openssl \
    php82-pear \
    php82-dev \
    gcc \
    g++ \
    make

# Configuração do diretório de trabalho
WORKDIR /opt/www

# Copiamos o composer.json primeiro para aproveitar o cache das camadas do Docker
COPY composer.json /opt/www/composer.json
COPY composer.lock /opt/www/composer.lock

# Instalação das dependências do Composer
RUN composer install --no-dev --no-scripts --optimize-autoloader

# Copiamos o restante do código
COPY . /opt/www

# Expomos a porta padrão do Hyperf
EXPOSE 9501

# Configurações de performance do PHP (Opcional, mas recomendado)
RUN ln -sf /usr/bin/php82 /usr/bin/php

# Comando para iniciar o servidor
# No Hyperf, usamos o script bin/hyperf.php
ENTRYPOINT ["php", "/opt/www/bin/hyperf.php", "start"]

2. docker-compose.yml (Hyperf + MySQL 8)

Este arquivo configura o ambiente completo. Note que incluí um network para garantir que o Hyperf consiga se comunicar com o MySQL pelo nome do serviço.

YAML

version: '3.8'

services:
  # Serviço do Hyperf
  app:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: hyperf_app
    ports:
      - "9501:9501"
    volumes:
      - .:/opt/www # Monta o código atual para hot-reload em dev
    networks:
      - hyperf_net
    depends_on:
      - mysql
    environment:
      - DB_HOST=mysql
      - DB_PORT=3306
      - DB_DATABASE=hyperf_db
      - DB_USERNAME=root
      - DB_PASSWORD=root_password

  # Serviço do MySQL
  mysql:
    image: mysql:8.0
    container_name: hyperf_mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root_password
      MYSQL_DATABASE: hyperf_db
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql
    networks:
      - hyperf_net

networks:
  hyperf_net:
    driver: bridge

volumes:
  mysql_data:

Como usar:

  1. Configuração do .env: No seu projeto Hyperf, certifique-se de que as variáveis de banco de dados no arquivo .env apontem para o host mysql (o nome do serviço no docker-compose):

    Snippet de código

    DB_HOST=mysql
    DB_PORT=3306
    DB_DATABASE=hyperf_db
    DB_USERNAME=root
    DB_PASSWORD=root_password
    
  2. Subir os containers:

    Bash

    docker-compose up -d
    
  3. Acessar a aplicação: A aplicação estará rodando em http://localhost:9501.

Dicas de Otimização:

  • Scan de Anotações: O Hyperf gera um cache de anotações no diretório runtime/. No Docker de produção, certifique-se de gerar esse cache durante o build para que a inicialização seja instantânea.

  • Hot Reload: Para desenvolvimento, você pode usar o componente hyperf/watcher. Com ele, o container reinicia automaticamente ao detectar mudanças no código PHP.

  • Privilégios: Em produção, evite rodar o container como root. Adicione um usuário específico no Dockerfile.

 JSON Web Tokens + hyperf

Essa é uma excelente implementação básica utilizando a biblioteca firebase/php-jwt.

1. Dependências Necessárias

Certifique-se de ter as bibliotecas instaladas no seu container:

Bash

composer require firebase/php-jwt ramsey/uuid

2. Controller Refatorado (Otimizado para Hyperf)

No Hyperf, os Controllers são Singletons por padrão. O uso de env() dentro do construtor é possível, mas injetar a Request e Response diretamente em propriedades da classe pode causar problemas de "vazamento" de dados entre requisições em ambientes de corrotinas. O ideal é recebê-las nos métodos ou usar o Context.

PHP

namespace App\Controller;

use Hyperf\HttpServer\Annotation\AutoController;
use Hyperf\HttpServer\Contract\RequestInterface;
use Hyperf\HttpServer\Contract\ResponseInterface;
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
use Ramsey\Uuid\Uuid;
use function Hyperf\Support\env;

class ControllerJWT
{
    protected string $jwtKey;

    public function __construct()
    {
        // Pegando a chave do .env ou usando uma fallback
        $this->jwtKey = env('JWT_SECRET', 'sua_chave_super_secreta_123');
    }

    public function generate(ResponseInterface $response)
    {
        $payload = [
            'iss'  => 'hyperf-app',         // Emissor
            'iat'  => time(),               // Gerado em
            'exp'  => time() + 3600,        // Expira em 1 hora
            'uuid' => Uuid::uuid4()->toString(),
            'data' => bin2hex(random_bytes(16))
        ];

        $token = JWT::encode($payload, $this->jwtKey, 'HS256');

        return [
            'status' => 'success',
            'token'  => $token,
            'expires_in' => 3600
        ];
    }

    public function decode(RequestInterface $request, ResponseInterface $response)
    {
        // Captura o Header Authorization
        $authHeader = $request->getHeaderLine('Authorization');
        $token = str_replace('Bearer ', '', $authHeader);

        if (!$token) {
            return $response->json(['error' => 'Token not provided'])->withStatus(401);
        }

        try {
            // Decodificação usando a Key object (exigência das versões recentes do firebase/php-jwt)
            $decoded = JWT::decode($token, new Key($this->jwtKey, 'HS256'));
            
            return [
                'status' => 'valid',
                'data'   => $decoded
            ];
        } catch (\Exception $e) {
            return $response->json([
                'error' => 'Invalid or expired token',
                'message' => $e->getMessage()
            ])->withStatus(401);
        }
    }
}

3. Configuração de Rotas (config/routes.php)

Se você não usar a anotação #[AutoController], defina manualmente:

PHP

use Hyperf\HttpServer\Router\Router;

Router::addRoute(['GET', 'POST'], '/generate', 'App\Controller\ControllerJWT@generate');
Router::addRoute(['GET', 'POST'], '/decode', 'App\Controller\ControllerJWT@decode');

Dicas de "Pulo do Gato" para Hyperf:

  1. Segurança de Corrotina: Note que eu passei RequestInterface $request diretamente nos argumentos do método. Isso garante que o Hyperf injete a instância correta da requisição atual daquela corrotina específica.

  2. Middleware: Em um projeto real, você não faria o decode dentro do Controller. Você criaria um Middleware para proteger as rotas. Assim, o Controller só seria executado se o token fosse válido.

  3. Configuração: Em vez de env() direto no Controller, o padrão do Hyperf é criar um arquivo em config/autoload/jwt.php e usar o ConfigInterface para ler os dados.

Transformar a validação em um Middleware é a forma correta de trabalhar no Hyperf. Isso mantém seu Controller "limpo", focado apenas na lógica de negócio, enquanto o Middleware cuida da segurança.

1. Criando o Middleware

No Hyperf, o Middleware intercepta a requisição antes de ela chegar ao Controller. Se o token for inválido, nós barramos a requisição ali mesmo.

Execute o comando para gerar a classe: php bin/hyperf.php gen:middleware JwtAuthMiddleware

Depois, edite o arquivo em app/Middleware/JwtAuthMiddleware.php:

PHP

namespace App\Middleware;

use Hyperf\HttpServer\Contract\RequestInterface;
use Hyperf\HttpServer\Contract\ResponseInterface;
use Hyperf\Context\Context;
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
use Psr\Http\Message\ResponseInterface as PsrResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;

class JwtAuthMiddleware implements MiddlewareInterface
{
    protected string $jwtKey;

    public function __construct(protected ResponseInterface $response, protected RequestInterface $request)
    {
        $this->jwtKey = (string) env('JWT_SECRET', 'sua_chave_super_secreta_123');
    }

    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): PsrResponseInterface
    {
        $authHeader = $request->getHeaderLine('Authorization');
        $token = str_replace('Bearer ', '', $authHeader);

        if (!$token) {
            return $this->response->json(['error' => 'Token não fornecido'])->withStatus(401);
        }

        try {
            $decoded = JWT::decode($token, new Key($this->jwtKey, 'HS256'));
            
            // "Pulo do gato": Salva os dados do token no Contexto da Corrotina
            // Assim, qualquer Controller pode acessar os dados do usuário logado
            $request = $request->withAttribute('user_data', (array) $decoded);
            Context::set(ServerRequestInterface::class, $request);

            return $handler->handle($request);
        } catch (\Exception $e) {
            return $this->response->json(['error' => 'Token inválido ou expirado'])->withStatus(401);
        }
    }
}

2. Registrando o Middleware em config/autoload/middlewares.php

Você pode aplicar o middleware de forma global (em todas as rotas) ou apenas em um grupo específico. Geralmente, usamos em grupos:

PHP

return [
    'http' => [
        // Middlewares globais aqui
    ],
];

Ou diretamente no arquivo de rotas (routes.php), o que é mais comum para APIs:

PHP

use App\Middleware\JwtAuthMiddleware;
use Hyperf\HttpServer\Router\Router;

// Rota pública para gerar o token
Router::addRoute(['GET', 'POST'], '/generate', 'App\Controller\ControllerJWT@generate');

// Grupo de rotas protegidas pelo JWT
Router::addGroup('/v1', function () {
    Router::addRoute(['GET'], '/perfil', 'App\Controller\UserController@me');
    Router::addRoute(['GET'], '/decode', 'App\Controller\ControllerJWT@decode');
}, ['middleware' => [JwtAuthMiddleware::class]]);

3. Como acessar os dados no Controller agora?

Agora seu método decode ou qualquer outra rota protegida fica muito mais simples, pois o Middleware já fez o trabalho pesado:

PHP

public function me(RequestInterface $request)
{
    // Recupera os dados que o Middleware injetou no atributo da requisição
    $userData = $request->getAttribute('user_data');

    return [
        'mensagem' => 'Acesso autorizado!',
        'user' => $userData
    ];
}

Por que isso é melhor?

  1. Reutilização: Você protege 10 ou 100 rotas apenas adicionando-as ao grupo no arquivo de rotas.

  2. Organização: O Controller não precisa saber como o token é validado, ele apenas recebe os dados prontos.

  3. Performance: O Hyperf gerencia o Middleware de forma extremamente eficiente dentro do ciclo de vida das corrotinas.

- Fonte:

https://github.com/hyperf/hyperf

https://github.com/thiagoeti/php-hyperf-firebase-jwt

https://www.linkedin.com/feed/update/urn:li:activity:7421928265054945280/

https://packagist.org/packages/differdev/hyperf-skeleton

https://github.com/DifferDev/hyperf-skeleton


1

Share

Donate to Site


About Author

Renato

Developer

Add a Comment
Comments 0 Comments

No comments yet! Be the first to comment

Blog Search


Categories

Laravel (227) PHP (151) linux (124) Variados (110) ubuntu (58) Dicas (58) developer (48) postgresql (45) database (44) sql (42) Docker (32) front-end (31) mysql (31) devops (26) webdev (24) programming (23) tecnologia (19) eloquent (19) aws (19) dba (18) OUTROS (17) backend (16) laravelphp (16) debian (12) dev (12) 100DaysOfCode (10) git (10) react (10) reactjs (10) inteligencia-artificial (9) PHP Swoole (9) node (9) javascript (9) nginx (9) Architecture (8) linux-tools (8) vue (7) github (7) ciencia (7) webservice (6) jwt (6) vim (6) windows (6) arquitetura (6) nodejs (6) api (6) vscode (6) reactnative (5) rest (5) DevSecOps (5) servers (5) apache (5) macox (5) s3 (5) authentication (5) ia (5) shell (4) mongodb (4) angular (4) autenticacao (4) wsl (4) Swoole (4) lets-encrypt (4) query (4) Raspberry (4) angularjs (4) inteligenciadedados (4) Padrao de design (4) artigo (4) google (4) npm (4) openai (4) Kubernetes (4) gitlab (4) opensource (4) mariadb (4) jenkins (4) json (3) authorization (3) phpswoole (3) ddd (3) blade (3) terminal (3) log (3) mac (3) fedora (3) containers (3) ssh (3) bash (3) hardware (3) tests (3) macos (3) web (2) jobs (3) websocket (3) db (3) politica (3) js (3) mysqli (3) Black Hat (3) RabbitMQ (3) educacao (3) intel (3) CMS (2) sail (3) script (3) performance (3) bancodedados (2) tailwind (2) homeOffice (2) html (2) openswoole (2) artificialintelligence (2) security (2) seguranca (2) auth (2) cron (2) phpunit (2) kube (2) multiple_authen (2) policia (2) neovim (2) golang (2) noticias (2) livros (2) Transcribe (2) ElonMusk (2) redis (2) claude (2) ArchLinux (2) java (2) saude (1) phpfpm (2) autorizacao (2) monitoring (2) laptop (2) gnome (2) powerbi (2) telefonia (2) nvm (2) imagick (2) maps (2) colors (2) Passport (2) JQuery (2) Curisidades (2) Solid (2) zsh (2) Go (2) BigLinux (2) POO (2) LazyVim (2) gource (2) Python (2) Oauth2 (2) android (2) unix (2) magento (2) iot (2) ffmpeg (2) combustivel (2) webhook (2) microservices (2) Migration (1) workflow (1) cqrs (1) kitematic (1) geospacial (1) yeshua (1) data (1) sonarqube (1) Axios (1) pipelines (1) Mozilla (1) kvm (1) GitOps (1) sqlite (1) podcast (1) n8n (1) LaravelFilament (1) God (1) DesenvolvimentoProfissional (1) sw (1) bigtech (1) postgres (1) NoCookies (1) LeetCode (1) governancadedados (1) prf (1) nosql (1) Lideranca (1) Hackers (1) Bots (1) pytorch (1) nuxt (1) liquid (1) ec2 (1) transaction (1) c4 (1) rancher (1) algoritimo (1) Observability (1) Elasticsearch (1) translate (1) certbot (1) Oh My Zsh (1) ibm (1) escopos (1) usb (1) ckeditor (1) API_KEY_GOOGLE_MAPS (1) Manjaro (1) vicuna (1) coding (1) rust (1) markdown (1) JasperReports (1) Fibonacci (1) community (1) Samurai (1) payment (1) messaging (1) Jesus (1) flutter (1) militar (1) fullsta (1) smartphones (1) automacao (1) Monitor (1) zend (1) spaceship (1) PKCE (1) l2tp (1) Glacier (1) laraveloctane (1) Deus (1) binaural (1) gpt (1) bolsonaro (1) privacidade (1) linkedin (1) documentation (1) brain (1) adb (1) nvidia (1) host (1) ecommerce (1) c4-models (1) altadisponibilidade (1) octane (1) lucena (1) http (1) TypeScript (1) chatgpt (1) idiomas (1) eventdrive (1) uuid (1) restfull (1) aplicativo (1) optimization (1) mapas (1) Fetch (1) collections (1) RustLang (1) matematica (1) Filament (1) compactar (1) paypal (1) microg (1) forcas armadas (1) front (1) cor (1) auth (1) modelagemdedados (1) k8s (1) gasolina (1) wsl2 (1) csv (1) soap (1) piada (1) KubeCon (1) zorin-os (1) spring-boot (1) backup (1) playwright (1) Deepin (1) storage (1) benchmark (1) networking (1) Swoole (1) biologia (1) node-red (1) LETSENCRYPT (1) Grunt (1) Diagramas (1) boot (1) haru (1) dracula (1) TrabalhoEmEquipe (1) Brasil (1) queue (1) agi (1) llama (1) hotfix (1) economia (1) transcription (1) cache (1) Amazon (1) October (1) lumen (1) Hyperf (1) replication (1) faceapp (1) vala (1) cloudstack (1) rpi (1) apple (1) oracle (1) iode (1) ffaa (1) vpn (1) MeioAmbiente (1) firefox (1) composer (1) scheduling (1) Asahi (1) pendrive (1) microservice (1) front (1) wine (1) covid19 (0) services (1) phpjasper (1) models (1) kali-linux (1) geojson (1) yarn (1) picpay (1) Monolith (1) banco (1) PNPM (1) Desenvolvedor (1) Structurizr (1) symfony (1) presenter (1) lider (1) guard (1) tensorflow (1) bootstrap (1) nuance (1) historia (1) dropbox (1) traefik (1) bug (1) akitando (1) llm (1) htm (1) transformers (1) cavalotroia (1) odd (1) m1 (1) Error (1) cinnamon (1) repmgr (1) federal (1) ruby (1) AppSec (1) orm (1) ArquiteturaDeSoftware (1) Passwordless (1) memcached (1) flow (1) compression (1) athena (1) controllers (0) OOD (0)

New Articles



Get Latest Updates by Email