Ir para conteúdo
  • Cadastre-se

  • Este tópico foi criado há 214 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado (editado)

 

Ei, galera do fórum ACBr! Quem aí já perdeu noites de sono brigando com crashes misteriosos no PHP-FPM ao tentar integrar a ACBrLib via FFI? Pois é, eu passei por isso e resolvi compartilhar essa jornada aqui no tópico, pra ajudar quem tá no mesmo barco. Vamos destrinchar o problema, as tentativas frustradas e a solução que salvou o dia: Laravel Octane com RoadRunner. Se você tem dicas extras ou variações, comenta ai! 


📋 Resumo Rápido (Pra Quem Tem Pressa)

O vilão? SIGSEGV ao carregar ACBrLib via FFI::cdef() no PHP-FPM, culpa da dependência gráfica libgdk-x11-2.0.so que não joga bem em times multi-processo. Tentativas como FPM solitário ou FrankenPHP deram dor de cabeça, mas o herói final é Laravel Octane com RoadRunner: workers isolados, PHP do sistema e zero recompilações. Funciona como mágica no CLI, melhora performance e acaba com os crashes. Ah, e queues são um plano B infalível pra offloadar o trabalho pesado!


🔴 O Problema: O SIGSEGV, Esse Inimigo Invisível 

Sintomas Clássicos

  • Boom! Seu worker FPM morre com um "exited on signal 11 (SIGSEGV)" nos logs – clássico de quem integra libs nativas.
  • Frontend grita "502 Bad Gateway" ou "Connection reset by peer".
  • No Laravel? Logs cheios de drama: "Erro crítico ao carregar a biblioteca ACBr!".

Tudo isso rola no código inocente:

 
$ffi = FFI::cdef(file_get_contents($importsPath), $dllPath);  // Aqui o bicho pega, galera!

Ambiente do Crime

  • PHP 8.3+ no FPM.
  • Laravel 12, FFI on fire.
  • ACBrLib NFe (aquela .so marota).
  • Linux (Ubuntu/Debian) com Interface Gráfica,  porque no Windows com Laragon, era paz e amor graças ao php-cgi sem forks malucos. Alguém aí usa Windows e confirma?

🔍 Causa Raiz: Culpa da GDK, Essa  Dependência Gráfica Teimosa

A estrela problemática é libgdk-x11-2.0.so (dependência do ACBrLib via GTK+). Verifique com:

ldd libacbrnfe64.so | grep gdk  # Spoiler: Ela aparece e causa o drama

Por quê? GDK adora recursos X11 (display, eventos), mas em FPM multi-processo, é como convidar um elefante pra uma festa em apartamento: race conditions, violações de memória e... SIGSEGV! Libs MT como ACBr não curtem forks mas threads sim, processos clones nem tanto. No fórum, já vi posts parecidos e recomendações ao uso do CONSOLE-MT; alguém tem um workaround pra GDK sem Xvfb?


🧪 Tentativas Frustradas

1. FPM Solitário: "Só Eu e Meu Processo"

  • Ideia: Configurar pm.max_children=1
  • Resultado: Ainda crasha, e o server vira lesma. Lição: Não adianta maquiar o problema. Alguém testou isso com ACBr?

2. FrankenPHP: O "Monstro" Promissor

  • Top em performance (até 4x mais rápido que FPM!), mas precisa recompilar PHP com FFI embed -> um pesadelo. Abandonado porque, né? Vida curta pra isso. (Dica: Em 2025, ele brilha em setups simples, mas não substitui Nginx/Apache em tudo.

 


✅ Solução Vencedora: Laravel Octane + RoadRunner – O Duo Dinâmico pra ACBr!

Por quê? RoadRunner usa PHP CLI isolado (sem forks malucos), mantém workers persistentes e adora FFI. Benchmarks de 2025 confirmam: throughput insano! Escalável e evita overhead, perfeito pro nosso mundo fiscal.

Passos Rápidos (Atualizados com Dicas de 2025)

  1. Verifique FFI no CLI: php -m | grep ffi. Se não, ative em /etc/php/8.3/cli/conf.d/20-ffi.ini.
  2. Instalar RoadRunner

    # Baixar RoadRunner
    wget https://github.com/roadrunner-server/roadrunner/releases/latest/download/rr_linux_amd64.deb
    
    # Instalar
    sudo dpkg -i rr_linux_amd64.deb
    sudo apt-get install -f -y
    
    # Verificar instalação
    rr --version
    
  3.  Instalar Laravel Octane

    cd /var/www/seu-projeto
    
    # Instalar Octane
    composer require laravel/octane
    
    # Publicar configuração
    php artisan octane:install
    

    Quando perguntado, escolha: RoadRunner

  4.  

    Configurar RoadRunner

    Crie/edite o arquivo .rr.yaml na raiz do projeto:

    version: "3"
    
    rpc:
      listen: tcp://127.0.0.1:6001
    
    server:
      command: "php"
      user: ""
      group: ""
      env:
        - APP_RUNTIME: RoadRunner
    
    http:
      address: 0.0.0.0:80
      middleware: ["gzip"]
      pool:
        num_workers: 4
        max_jobs: 0
        allocate_timeout: 60s
        destroy_timeout: 60s
    
    logs:
      level: error
      output: stdout
      err_output: stderr
    
  5.  Configurar Octane

    Edite config/octane.php:

    'server' => env('OCTANE_SERVER', 'roadrunner'),
    
    'max_execution_time' => 30,
    
  6. Criar Serviço Systemd

    Crie o arquivo /etc/systemd/system/octane.service:

    [Unit]
    Description=Laravel Octane RoadRunner Server
    After=network.target postgresql.service
    
    [Service]
    Type=simple
    User=root
    WorkingDirectory=/var/www/seu-projeto
    Environment="PHP_INI_SCAN_DIR=/etc/php/8.3/cli/conf.d"
    Environment="FFI_ENABLE=1"
    Environment="DISPLAY=:99"
    ExecStart=/usr/bin/php -d ffi.enable=1 /var/www/seu-projeto/artisan octane:start --server=roadrunner --host=0.0.0.0 --port=80 --rpc-host=127.0.0.1 --rpc-port=6001
    Restart=always
    RestartSec=3
    
    [Install]
    WantedBy=multi-user.target
    
    Importante:
    1. Ajuste WorkingDirectory para o caminho do seu projeto
    2. Ajuste a porta se necessário (80 requer root, ou use 8000 e configure proxy reverso)
    3. -d ffi.enable=1 garante que FFI está habilitado
  7. Habilitar e Iniciar Serviço

    # Recarregar systemd
    sudo systemctl daemon-reload
    
    # Habilitar serviço (inicia no boot)
    sudo systemctl enable octane.service
    
    # Iniciar serviço
    sudo systemctl start octane.service
    
    # Verificar status
    sudo systemctl status octane.service
    
    # Ver logs
    sudo journalctl -u octane.service -f

         Xvfb ainda é amigo: apt install xvfb && Xvfb :99 &. Permissões? chown www-data pra evitar birras.


📊 Comparação: FPM vs. RoadRunner

Aspecto          PHP-FPM                                       RoadRunner
FFI/ACBr   ❌ Explode em SIGSEGV ✅ Roda suave como manteiga
Perf.   Boa, mas lenta em picos Estelar – workers eternos!
Manut.   Fácil, mas crash-prone Média, mas vale o ouro
Humor   "Crash? De novo?!" "Pronto pro próximo request!"
 

🐛 Troubleshooting Rápido 

  • Serviço não liga? journalctl -u octane -f – logs salvam vidas.
  • Workers morrendo? Cheque memória (free -h) ou leaks no código.
  • Porta ocupada? lsof -i :80 e mude pra 8000 com proxy.

Se RoadRunner der PT, queues são backups ótimos, simples e crash-free!


📚 Referências Atualizadas (2025 Edition)

Editado por Luis Paiva
Melhoria do titulo
  • Curtir 1
  • Luis Paiva changed the title to SIGSEGV no PHP-FPM ao Usar FFI::cdef com ACBrLib em Ambiente Laravel + Linux! Solução com Laravel Octane + RoadRunner!
Postado

Sim, eu cheguei a testar com ela e funcionou. Poŕem estou trabalhando em um projeto que o cliente é "detalhista" com impressões rsrs. E já entramos em comum acordo sobre a impressão da NFe. Na época estava desenvolvendo em ambiente Windows e ao migrar para Linux algumas opções de Layout de impressão e até mesma impressão em si da NFe não fica exatamente igual quando uso a biblioteca CONSOLE-MT. Por isso esse esforço em fazer funcionar com MT padrão sem ser CONSOLE-MT.

  • Este tópico foi criado há 214 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.

The popup will be closed in 10 segundos...