PHP PHP  ·  30 вопросов  ·  ~85 мин  ·  ⏱ Таймер 25:00  ·  Сложный  · 

Производительность PHP и OPcache

Тест не предлагает угадывать «быструю» конструкцию по репутации. Нужно читать профиль, отличать время PHP от ожидания базы или сети, понимать роль OPcache и выбирать оптимизацию, подтверждённую измерением.

Отвечено: 0 из 30
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. Сначала найдите измеряемое узкое место, затем оцените цену и проверяемый эффект изменения. Таймер — 85 минут.
Вопрос 1 из 30
С чего начинать оптимизацию?
PHP
$started = hrtime(true);
$response = $application->handle($request);
$metrics->observe('request_seconds', (hrtime(true) - $started) / 1e9, ['route' => $route]);
Вопрос 2 из 30
Чем wall time отличается от CPU time?
PHP
$wallStart = hrtime(true);
$cpuStart = getrusage();
$result = $service->run();
$wallSeconds = (hrtime(true) - $wallStart) / 1e9;
$cpuEnd = getrusage();
Вопрос 3 из 30
Почему логирование каждого элемента большого цикла искажает профиль?
PHP
foreach ($rows as $row) {
    $logger->debug('processing row', ['id' => $row['id']]);
    process($row);
}
Вопрос 4 из 30
Что показывает flame graph?
Вопрос 5 из 30
Почему профиль на одной пустой записи вводит в заблуждение?
Вопрос 6 из 30
Что кэширует OPcache?
PHP
$status = opcache_get_status(false);
var_dump($status['opcache_enabled'] ?? false);
Вопрос 7 из 30
Почему при такой настройке изменение подключаемого PHP-файла может не проявиться до сброса OPcache или перезапуска PHP-FPM?
BashPHP
# php.ini production
# opcache.enable=1
# opcache.validate_timestamps=0

php -r "require '/srv/app/bootstrap.php';"
Вопрос 8 из 30
Что делает opcache_reset?
PHP
if (!opcache_reset()) {
    throw new RuntimeException('OPcache не сброшен');
}
Вопрос 9 из 30
Какой эффект даёт OPcache preload?
Вопрос 10 из 30
Почему мало памяти OPcache вредно?
Вопрос 11 из 30
Что такое N+1?
PHP
$posts = $postsRepository->latest();
foreach ($posts as $post) {
    $post->comments = $commentsRepository->forPost($post->id);
}
Вопрос 12 из 30
Почему SELECT * вреден на горячем endpoint?
PHP
$stmt = $pdo->query('SELECT * FROM audit_events ORDER BY created_at DESC LIMIT 100');
Вопрос 13 из 30
Что проверять до добавления индекса?
SQLSQL — план запроса
EXPLAIN (ANALYZE, BUFFERS)
SELECT id, total
FROM orders
WHERE user_id = 42 AND status = 'paid'
ORDER BY created_at DESC
LIMIT 50;
Вопрос 14 из 30
Как уменьшить N+1 для комментариев?
Вопрос 15 из 30
Почему медленный запрос нельзя исправить только кэшированием навсегда?
Вопрос 16 из 30
Почему fetchAll опасен для большого экспорта?
PHP
$stmt = $pdo->query('SELECT * FROM events');
$events = $stmt->fetchAll(PDO::FETCH_ASSOC);
Вопрос 17 из 30
Как generator влияет на память?
PHP
function rows(PDOStatement $statement): Generator
{
    while (($row = $statement->fetch(PDO::FETCH_ASSOC)) !== false) {
        yield $row;
    }
}
Вопрос 18 из 30
Почему static-массив в worker опасен?
PHP
function lookup(string $key): mixed
{
    static $cache = [];
    return $cache[$key] ??= loadLargeValue($key);
}
Вопрос 19 из 30
Что измеряет memory_get_peak_usage(true)?
Вопрос 20 из 30
Почему unset не всегда сразу уменьшает RSS процесса?
Вопрос 21 из 30
Почему один benchmark run ненадёжен?
PHP
for ($run = 0; $run < 30; $run++) {
    $started = hrtime(true);
    benchmarkCase();
    $samples[] = hrtime(true) - $started;
}
sort($samples);
Вопрос 22 из 30
Что сравнивать в web-load test?
PHP
$report = [
    'requests_per_second' => $rps,
    'p50_ms' => $p50,
    'p95_ms' => $p95,
    'p99_ms' => $p99,
    'error_rate' => $errors / $requests,
    'cpu' => $cpu,
    'memory' => $memory,
];
Вопрос 23 из 30
Почему тест на localhost может скрыть сетевое узкое место?
PHP
$client = new HttpClient(baseUri: 'http://127.0.0.1:8080');
$response = $client->get('/report');
Вопрос 24 из 30
Как установить performance budget?
Вопрос 25 из 30
Что делать после оптимизации?
Вопрос 26 из 30
Почему timeout важнее бесконечного ожидания?
PHP
$client = new HttpClient([
    'connect_timeout' => 0.5,
    'timeout' => 2.0,
]);
Вопрос 27 из 30
Какой fallback безопасен?
PHP
try {
    return $catalog->livePrice($productId);
} catch (TimeoutException) {
    return PriceResult::stale($cachedPrice, 'Временно показана последняя известная цена');
}
Вопрос 28 из 30
Что мониторить у OPcache?
PHP
$status = opcache_get_status(false);
$metrics->gauge('opcache_hit_rate', $status['opcache_statistics']['opcache_hit_rate'] ?? 0);
$metrics->gauge('opcache_wasted_bytes', $status['memory_usage']['wasted_memory'] ?? 0);
$metrics->gauge('opcache_restarts', array_sum($status['opcache_statistics']['oom_restarts'] ?? [0]));
Вопрос 29 из 30
Как выпускать рискованную оптимизацию?
Вопрос 30 из 30
Почему общий кэш ответа должен включать контекст доступа?

Ответьте на все 30 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу