Guia: Alta performance com PHP — Suas aplicações backend no próximo nível

Tópicos

  1. Atualize TUDO, sempre!
  2. Refatore sua infraestrutura
  3. Boas práticas e padrões de projeto
  4. Frameworks
  5. Otimizando o PHP-FPM
  6. O poder do OPcache
  7. Utilize cache em memória
  8. Conexões persistentes
  9. Funções nativas
  10. Preloading
  11. Generators
  12. Código assíncrono
  13. Non-blocking I/O com PHP

1. Atualize TUDO, sempre!

E o 8.0 vem aí com novidades e, claro, mais melhorias em performance. Aqui falamos apenas do PHP, mas temos extensões e bibliotecas também, então: atualize TUDO, sempre!

2. Refatore sua infraestrutura

3. Boas práticas e padrões de projeto

Mas atenção, KISS! Padrões não são soluções para tudo, saiba utilizar de forma inteligente e não como bala de prata.

4. Frameworks

  • A equipe está confortável em trabalhar com ele?
  • A comunidade é ativa?
  • Ele é atualizado com qual frequência?
  • A documentação é bem estruturada?
  • Já pensou em usar um micro-framework?

5. Otimizando o PHP-FPM

fpm-workers
[api]
pm = static
pm.max_children = 16
pm.max_requests = 10000

6. O poder do OPcache

Fonte
[opcache]
opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=4000
opcache.validate_timestamps=0
opcache.interned_strings_buffer=12
opcache.use_cwd=0

7. Utilize cache em memória

Fonte do benchmark

8. Conexões persistentes

9. Funções nativas

// Jobfunction cube($number) {    return ($number * $number * $number);}// Without native$cubes = [];foreach($numbers as $number) {    $cubes[] = cube($number);}// With native$cubes = array_map('cube', $numbers);

10. Preloading

opcache.preload=/path/to/project/preload.php
$files = require 'vendor/composer/autoload_classmap.php';

foreach (array_unique($files) as $file) {
opcache_compile_file($file);
}
/usr/bin/composer install --no-dev -o -a

11. Generators

  • É uma forma simples de escrever iterators
  • É possível iterar dados sem precisar construir um array em memória
// range nativo
foreach (range(1, 1_000_000) as $number) {
echo $number . PHP_EOL;
}

// range com generator
function xrange(int $start, int $end) {
for ($i = $start; $i <= $end; $i++) {
yield $i;
}
}

foreach (xrange(1, 1_000_000) as $number) {
echo $number . PHP_EOL;
}

Mas os generators vão além disso. E é aqui que tudo começa a ficar bem mais interessante! Os generators abrem as portas para se trabalhar com corrotinas utilizando PHP. Sim, muito maneiro! E isso já existe desde a versão 5.5.

  1. Introdução teórica a estes termos
  2. Entendendo mais sobre generators
  3. Corrotinas com generators

12. Código assíncrono

use Spatie\Async\Pool;

$pool = Pool::create();

foreach ($things as $thing) {
$pool->add(function () use ($thing) {
// Do a thing
})->then(function ($output) {
// Handle success
})->catch(function (Throwable $exception) {
// Handle exception
});
}

$pool->wait();

13. Non-blocking I/O com PHP

Hello World com ReactPHP
Funcionamento do PHP-FPM + Nginx vs. Swoole

E ai, gostou? Faltou algum assunto importante?

--

--

PHP Software Engineer @ https://github.com/leocarmo

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store