KakapoWP KakapoWP
Entrar Testar grátis
Centro de Ajuda/Performance/Configurar WebP e AVIF

Configurar WebP e AVIF

Aplica-se a: Kakapo Performance· 6 min de leitura

Primeiro ver o que o teu servidor consegue

Na área «Imagens» está o cartão «Capacidades deste servidor». Ele não mostra o que está no papel, mas o que foi medido no PHP em execução: biblioteca de imagem GD com a respetiva versão, ler JPEG, ler PNG, ler WebP, escrever WebP, escrever AVIF. A pergunta é feita a dobrar — a função tem de existir e o formato tem de constar de imagetypes(). Isso é importante, porque alguns alojamentos compilam o GD sem WebP ou sem AVIF: nesse caso, imagewebp() existe e só falha quando é chamada.

Se faltar um formato, o interruptor correspondente continua visível, mas fica desligado e traz a justificação. Para o WebP, ela é: o GD tem de ser compilado com libwebp. Para o AVIF: PHP 8.1 ou mais recente com libavif. Ambos são assunto do teu alojamento. Um desvio pela chamada AJAX não ajuda — o servidor recusa expressamente ligar um formato que não está disponível.

A linha «Imagick» é pura informação. Este módulo não usa o Imagick; se aí estiver «não existe», não te falta nada.

Ligar e definir os três números

Há três interruptores e três campos numéricos. «Gerar WebP» e «Gerar AVIF» estão desligados de fábrica, «Entregar através de <picture>» está ligado. A separação é intencional: podes primeiro deixar que os ficheiros surjam e ligar a entrega mais tarde. Ao contrário vale o mesmo: se desligares a entrega, os ficheiros continuam a surgir, mas para os visitantes vai marcação inalterada.

A qualidade do WebP está em 82 e a do AVIF em 50. Ambos os campos aceitam valores de 30 a 100; tudo o que esteja acima ou abaixo é cortado para dentro desse intervalo. As predefinições diferentes não são um descuido: o AVIF mede de outra forma que o JPEG, e aí 50 já tem um aspeto muito limpo. Acima de 90, no WebP o ficheiro cresce mais depressa do que o ganho visível.

O limite máximo em megapíxeis está em 40 e aceita valores de 4 a 400. Protege contra o limite de memória: uma fotografia de 6000 × 4000 ocupa cerca de 96 MB ao ser descodificada, independentemente do tamanho do seu ficheiro. Além disso, antes de cada descodificação o Kakapo faz as contas com a memória realmente ainda livre e salta a imagem, em vez de deixar o carregamento morrer no limite.

Se alterares um dos três interruptores, o cache de páginas guardado é descartado. A qualidade e o limite de megapíxeis deixam-no ficar — só fazem efeito no carregamento seguinte e não tornam errada nenhuma página já guardada.

O que acontece ao carregar

A conversão decorre no fim do carregamento, assim que o WordPress tiver gerado todos os tamanhos de imagem. São processados o ficheiro dos metadados e cada tamanho gerado — não o original guardado pelo núcleo, que de qualquer forma nunca é entregue.

Cada ficheiro derivado fica como ficheiro acompanhante ao lado do seu original e leva o nome completo deste mais a extensão: de bild.jpg passa a bild.jpg.webp, e não bild.webp. Motivo: na mesma pasta podem estar lado a lado bild.jpg e bild.png; ao substituir apenas a extensão, um dos ficheiros derivados esmagaria o outro. Se no destino já houver alguma coisa, ela não é tocada.

Primeiro escreve-se num ficheiro auxiliar com o número do processo e um valor aleatório no nome. Só quando, depois de medido, for mais pequeno do que o original é que passa para o seu lugar por rename. Se for maior ou do mesmo tamanho, é eliminado e fica-se pelo original. Por isso, uma execução interrompida nunca deixa para trás um ficheiro derivado demasiado grande.

O carregamento tem um orçamento de tempo de 12 segundos. O AVIF é várias vezes mais lento a gerar do que o WebP, e seis tamanhos vezes dois formatos batem de outro modo no tempo de execução do servidor web — quem gere o site veria um carregamento interrompido. O que já não couber é recolhido por uma passagem posterior única: fica agendada 30 segundos mais tarde e dispõe então de 90 segundos. Tanto o que foi feito como o que foi saltado fica anotado no anexo, para que a mesma tentativa não se repita a cada nova geração.

Nos JPEG, uma rotação EXIF é aplicada a posteriori, porque o WebP e o AVIF vindos do GD não transportam essa indicação. Em originais PNG, o Kakapo tenta primeiro o WebP sem perdas — logótipos, gráficos e capturas de ecrã ficam assim muitas vezes mais pequenos, sem que as arestas se desfiem. A transparência mantém-se em ambos os formatos de destino.

Como é feita a entrega

O Kakapo envolve o <img> num <picture> e coloca à frente as fontes AVIF e WebP, primeiro o AVIF — o navegador escolhe a primeira fonte que entende. O <picture> recebe display:contents, para que nos layouts flex e grid do teu tema não empurre uma caixa adicional para dentro da disposição.

Escolha deliberada contra a alternativa via .htaccess: a negociação de conteúdo precisa de regras do Apache, não faz efeito nenhum no nginx e colide com os caches intermédios de CDN que não variam o cabeçalho Accept. Com <picture>, quem decide é o navegador, sem uma única linha de configuração do servidor.

A intervenção é feita sobre os conteúdos dos artigos e as imagens de destaque, com prioridade 22 — depois do Lazy-Load (20) e antes da reescrita de CDN (25), para que também as fontes recém-criadas passem pelo CDN. Os blocos <picture> já existentes ficam intocados, tal como as imagens de anfitriões externos e tudo o que esteja fora da pasta de uploads.

Vale a pena conhecer uma regra: um formato só é oferecido se a maior versão do srcset existir como ficheiro derivado. Se faltar uma média ou uma pequena, o navegador pega na imediatamente maior — alguns kilobytes a mais, mas nunca uma imagem desfocada. Se faltasse a maior, um ecrã largo já não conseguiria chegar à resolução completa; é exatamente esse caso que fica excluído.

Quando não surge nada: ler os motivos

O cartão «Ficheiros gerados & poupança real» mostra, por formato, o número de ficheiros, a soma dos originais, a soma dos ficheiros derivados e a diferença. Cada número resulta da comparação de dois tamanhos de ficheiro reais no momento da geração — nada é estimado nem extrapolado. «Originais» é aí apenas a soma dos ficheiros para os quais surgiu um ficheiro derivado, não todo o teu acervo multimédia.

Por baixo está o que não foi convertido, com o motivo. Os mais importantes:

«O resultado era maior do que o original» — não é um erro. Em miniaturas muito pequenas isso acontece regularmente com o AVIF; o original mantém-se e os restantes tamanhos recebem à mesma o seu ficheiro derivado.

«Não é gravável» — verifica as permissões na pasta de uploads. É o único motivo que realmente exige a tua intervenção.

«Já existia um ficheiro no destino» — não foi substituído. Na maioria das vezes vem da execução em lote sobre o acervo e é já exatamente aquilo que deveria surgir aqui.

«Não coube na memória» — aumenta o limite de megapíxeis ou o limite de memória do PHP.

«Não é legível» — ficheiro danificado, JPEG em CMYK ou uma variante exótica. «Não é JPEG/PNG/WebP» — as animações GIF e os PDF não são tocados de propósito.

Se o cartão estiver vazio, liga o WebP e carrega uma imagem. As imagens que já estão na biblioteca multimédia não são alcançadas por aí, mas sim através da execução em lote mais abaixo na mesma página.

Este artigo foi útil?