Сделай это быстрее!
Другими словами, пожалуйста, прекратите использовать pathinfo для этой работы. Это довольно медленно. Такие низкоуровневые вызовы должны быть очень быстрыми, поэтому я подумал, что стоит провести некоторое исследование. Я пробовал несколько методов (с различной длиной строки, длиной расширения, несколькими запусками каждый), вот несколько разумных. Мне пришлось обновить предыдущую статистику, потому что версии php (а также ядра и многое другое) меняются, но на серверах Linux вывод всегда один и тот же.
/* 387 ns */ function method1($s) {return preg_replace("/.*\./","",$s);} // edge case problem
/* 769 ns */ function method2($s) {preg_match("/\.([^\.]+)$/",$s,$a);return $a[1];}
/* 67 ns */ function method3($s) {$n = strrpos($s,"."); if($n===false) return "";return substr($s,$n+1);}
/* 175 ns */ function method4($s) {$a = explode(".",$s);$n = count($a); if($n==1) return "";return $a[$n-1];}
/* 731 ns */ function method5($s) {return pathinfo($s, PATHINFO_EXTENSION);}
/* 732 ns */ function method6($s) {return (new SplFileInfo($s))->getExtension();}
Строка теста была something.that.contains.dots.txt; как видите, измерения были разделены на наносекунды. SplFileInfo
и pathinfo
- отличные ребята, но для такой работы просто не стоит их будить. По той же причине explode()
значительно быстрее регулярного выражения. Очень простые инструменты почти всегда побеждают более сложные.
Боковое примечание: в Windows результаты совершенно другие. Думаю, стоит проверить цифры для вашего случая, если вы используете IIS.
Заключение
Похоже, это Путь Самурая:
function fileExtension($s) {
$n = strrpos($s,".");
return ($n===false) ? "" : substr($s,$n+1);
}
Некоторые тестовые примеры
File name fileExtension()
----------------------------------------
file ""
file. ""
file.txt "txt"
file.txt.bin "bin"
file.txt.whatever "whatever"
.htaccess "htaccess"
(Последний вариант немного особенный; это может быть только расширение или пустое расширение с чистым именем .htaccess, я не уверен, есть ли для этого правило. Так что я думаю, вы можете использовать оба, поскольку пока вы знаете, что делаете.)
person
dkellner
schedule
07.04.2020
strrchr($filename, '.');
- person verybadbug   schedule 30.09.2013