finfo значительно медленнее на 7.3 против 7.2 - PullRequest
0 голосов
/ 28 января 2019

Я заметил, что загрузка виджета браузера файлов после перехода с php 7.2 на 7.3 занимает значительно больше времени.

Операция, которая обычно занимает менее секунды, занимала значительно больше времени.После включения slowlog я отследил проблему до поиска MIME с помощью finfo.После возврата к 7.2 проблема была решена.

Это простой тест, который я создал, чтобы проиллюстрировать проблему:

#!/bin/bash
set -e

ITERS=${1:-1000}

echo "Testing finfo over $ITERS iterations"
for VER in '7.2' '7.3'; do
        echo ---
        echo "Testing PHP $VER"
        docker run -i \
                -e "ITERS=${ITERS}" \
                php:${VER}-cli-alpine php <<'EOF'
<?php
$iters = $_ENV["ITERS"];

$start = microtime(true);
for ($i = 1; $i <= $iters; $i++){
  $finfo = new finfo(FILEINFO_MIME);
  $type = $finfo->file("/bin/sh");
  unset($finfo);
}
$ttl = microtime(true) - $start;
echo "Took: $ttl\n";
?>
EOF
done

Вот результат при запуске на пресной капле DigitalOcean с 3 процессорами:

root@phptest:~# ./test.sh 1000
Testing finfo over 1000 iterations
---
Testing PHP 7.2
Took: 1.2104759216309
---
Testing PHP 7.3
Took: 2.4543979167938

Тест 7.3 длился более чем вдвое.Я выполнил этот тест на ряде систем, и во всех случаях я вижу увеличение времени выполнения на 7,3 на 30% и более;в некоторых случаях гораздо больше.Это тот же тестовый запуск для капли с большей нагрузкой и только с 2 ЦП (это машина, на которой я впервые столкнулся с проблемой; вы можете понять, почему):

% ./test.sh 100
Testing finfo over 100 iterations
---
Testing PHP 7.2
Took: 0.10123181343079
---
Testing PHP 7.3
Took: 34.721122980118

В чем может быть причинаэто замедление, и есть ли какие-либо конфигурации / оптимизации, которые я должен использовать?

1 Ответ

0 голосов
/ 28 января 2019

finfo сильно зависит от PCRE, и в 7.3 они обновили библиотеку PCRE.Я не могу найти какие-либо другие изменения в журнале изменений, которые могли повлиять на эту степень.

Если это так, вы ничего не можете с этим поделать, кроме как вернуться к 7.2 или использовать другойметод определения типа пантомимы;или использовать другой вектор безопасности - finfo на самом деле очень легко одурачить, так что в любом случае это не лучшее решение.См. Загрузка файла PHP: проверка на основе mime или расширения? для более подробного (и случайного) обсуждения и примера.

...