Виктор Зинченко

Software engineer at PDFfiller

Под капотом PHP

Чем мы занимаемся на самом деле?

Чем мы занимаемся?

#2

/* @var Project[] $projects */
$projects = $em->getRepository("Project")->findAll(); // 100500

/* @var Tag[] $tags */
$tags = $em->getRepository("Tag")->findAll(); // 100500

foreach ($projects as $project) {
    foreach ($tags as $tag) {
        // ...
    }
}

#3

Мотивация

#4

OpCache

Load balancer

Varnish

Cache-Control

Cloud

Real time PHP

Queue

Microservices

Memory limit

#5

#6

О чем пойдет речь сегодня

  1. Устройство PHP.
  2. Инфраструктура.
  3. Как находить проблемные места?

disclaimer

#7

Устройство PHP

Интерпретатор   vs   компилятор

PHP - язык, который die();

#8

Интерпретатор PHP

<?php

...

Лексический анализатор
(lexer)

Синтаксический анализатор
(parser)

лексемы (tokens)

ok

Транслятор

operation codes

Zend Engine

zend_compile

zend_execute

#9

Инфраструктура. Общая картина

Приложение (apache, nginx, ...)

Server Abstraction API (SAPI)

PHP core

read request data, send headers

start up / shutdown

output, streams
globals
extensions
configs (.ini)

Zend Engine

parsing
executing
error handling

Extensibility:
caches, profilers, debuggers

PHP

#10

Модули (extensions)

PHP modules (extensions)    vs    Zend extensions

PDO, gd, imagick

opcache

extension=name.so

zend_extension=name.so

7.2
.so

#11

Использование PHP

apt-get install php...      vs    git clone ...  && make

#12

Модули (extensions)

Statically compiled   vs    Dynamically loaded

  • Часть самого PHP
  • Быстрее загружаются
  • Не разбросаны на диске
  • Изменение = рекомпиляция PHP
  • "Раздувает" PHP
  • Нельзя отключить
  • Можно отключать/подключать
  • Рекомпиляция PHP не нужна
  • Дольше стартуют (т.к. подключаются)
  • Разбросаны на диске

#13

Модули (extensions)

Statically compiled   vs    Dynamically loaded

  • Часть самого PHP
  • Быстрее загружаются
  • Не разбросаны на диске
  • Изменение = рекомпиляция PHP
  • "Раздувает" PHP
  • Нельзя отключить
  • Можно отключать/подключать
  • Рекомпиляция PHP не нужна
  • Дольше стартуют (т.к. подключаются)
  • Разбросаны на диске

#14

Как находить проблемные места?

#15

Как находить проблемные места? Easy

1. Память

memory_get_usage(); // текущий момент

memory_get_peak_usage(); // пик

2. Время

$start = microtime(true);
// ... do some magic
$stop = microtime(true);

$executionTime = $stop - $start;

#16

Как находить проблемные места? Не easy

1. Память

php-memprof.so + Webgrind

2. Время

xdebug.so + (KCacheGrind || Webgrind)

#17

Как находить проблемные места? Не easy

#18

Ссылки

#19

Спасибо!