Cliente me chama porque o deploy passou de vinte minutos e a janela de manutenção estourou. A primeira coisa que eu peço não é htop: é a linha exata do comando. Nove em dez vezes é php bin/magento setup:static-content:deploy, pelado, sem nenhuma opção.
Sem opção nenhuma, o Magento tenta gerar tudo — toda área, todo tema instalado, todo idioma disponível — um pacote por combinação, um de cada vez. E a loja usa um tema e um idioma.
A conta que o comando faz
Cada pacote de arquivo estático é uma combinação de três coisas: área (frontend e adminhtml), tema e idioma. Uma loja com Luma, Blank, o tema do cliente e três idiomas instalados já pede uma dezena de pacotes, cada um com CSS, JS, fonte, imagem e dicionário de tradução.
E é sequencial. A opção que liga processo paralelo é -j, descrita no core como Enable parallel processing using the specified number of jobs, e o padrão dela é 0. Zero, não um núcleo por CPU. Enquanto você não passar -j, o servidor de 16 núcleos usa um.
Confira o que está instalado antes de sair chutando. Em Content > Design > Configuration você vê, linha por linha, qual tema cada store view usa de verdade — e normalmente é sempre o mesmo.
Os dois comandos que eu rodo
Em vez de um comando genérico, dois específicos. Primeiro a loja:
php bin/magento setup:static-content:deploy -j 4 \
--area frontend \
--theme Vendor/meutema \
pt_BRDepois o admin, que é outra área e quase sempre outro conjunto de idiomas:
php bin/magento setup:static-content:deploy -j 4 \
--area adminhtml \
pt_BR en_USRepare que o idioma vai como argumento solto no fim, não como opção. As duas formas existem (-l pt_BR também funciona), mas o argumento é o que você vê na documentação da Adobe.
No admin eu deixo en_US junto de propósito: extensão de terceiro costuma trazer texto só em inglês, e o painel quebra de um jeito silencioso quando falta o pacote. Na loja, não — lá só entra o idioma que o cliente vê.
Se o comando responder NOTE: Manual static content deployment is not required in "default" and "developer" modes, a loja não está em produção. Em developer o Magento gera arquivo sob demanda e você não precisa desse comando; se quiser forçar mesmo assim, é o -f.
Tem também o --exclude-theme, útil quando você não sabe o nome exato do seu tema mas sabe que Luma não é usado. Eu prefiro a lista positiva com --theme: é mais difícil errar.
Quantos jobs, e o que costuma travar
Eu começo com -j 4 e subo até uns dois terços dos núcleos disponíveis. Cada job é um processo PHP inteiro, com o memory_limit dele: oito jobs numa máquina de 4 GB não aceleram nada, engasgam.
Três coisas fazem o paralelismo simplesmente não acontecer:
- Sem
pcntl. O core só forka sepcntl_forkexistir e o número de jobs for maior que 1. Muita hospedagem compartilhada corta essa extensão ou põe a função nodisable_functions. Aí o-j 8passa batido e roda em fila do mesmo jeito. - Tempo por job. O limite padrão é 900 segundos (
--max-execution-time). Catálogo com muita imagem de tema pode estourar isso e derrubar o deploy no meio. - Bug de porta no banco. Em 2.4.7 sem patch, rodar com
--jobse ter a porta do MySQL escrita noenv.phpquebra com Port must be configured within host parameter. A Adobe corrige isso no patchACSD-61366, do Quality Patches Tool.
Uma última: rode isso como o dono dos arquivos, nunca como root. Deploy feito de root deixa pub/static com dono errado e a próxima requisição do php-fpm não consegue escrever nada. Se você quer entender onde o estático entra na fila do deploy, eu detalho o resto do processo no guia de performance.
Perguntas rápidas
Posso rodar o static-content:deploy com a loja no ar?
Pode, mas o arquivo velho continua sendo servido até o cache limpar, e durante a geração o disco fica em uso pesado. Eu prefiro rodar dentro da janela de manutenção, junto do resto do deploy.
Preciso apagar pub/static antes de rodar?
Não em toda vez. O comando grava uma versão nova de conteúdo estático a cada execução, então o navegador busca a URL nova. Apagar só resolve caso de arquivo órfão de tema que você desinstalou.
Quantos jobs eu ponho num servidor de 8 núcleos?
Comece com 4 e observe memória. Passar de dois terços dos núcleos costuma não trazer ganho porque a etapa fica limitada por disco, não por CPU.
Pra conferir na fonte
- Static view files deployment — Adobe Experience League
- DeployStaticOptions.php (opções do comando no core) — GitHub — magento/magento2
- Deploy/Process/Queue.php (fork e limite de tempo) — GitHub — magento/magento2
- Quality Patches Tool: usage — Adobe Experience League