我注意到从php 7.2迁移到7.3后,文件浏览器小部件的加载时间要长得多。
通常只需不到一秒钟的操作就需要更长的时间。启用慢日志后,我使用finfo将问题追溯到MIME查找。恢复到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
这是在具有3个CPU的常规DigitalOcean小滴上运行的结果:
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个CPU的液滴上进行的相同测试(这是我第一次遇到此问题的机器;您可以看到原因):
% ./test.sh 100
Testing finfo over 100 iterations
---
Testing PHP 7.2
Took: 0.10123181343079
---
Testing PHP 7.3
Took: 34.721122980118
造成此速度下降的原因是什么?我应该采用任何配置/优化方法吗?
答案 0 :(得分:2)
finfo严重依赖PCRE,在7.3中,他们更新了PCRE库。我在变更日志中找不到其他可能影响到这种程度的更改。
如果是这种情况,除了恢复到7.2或使用其他方法识别mime类型外,您无能为力。或采用其他安全媒介-finfo实际上很容易上当,所以这不是一个很好的解决方案。有关更深入(更可靠)的讨论和示例,请参见PHP file upload: mime or extension based verification?。