It’s Show || Race || MicroTime

Газ до ламарината :)

Точно приключих с един експорт/импорт скрипт (export XLS - XML via PHP from MySQL Database / import Excel Spreadsheet as XLS - XML to MySQL DB) и съм почти доволен.. даже и работи :) Остава и клиентите да го оценят. Ама като се замисли човек, ако имаме база данни с няколкостотин или хиляди продукта и се наложи да обновим ценовата листа, например, сещате ли се колко време ще е нужно за да се свърши това през админ панела, продукт по продукт, за всеки по няколко различни цени. Тегаво, a? Жестока досада! А така, експортваш шаблона (настоящата ценова листа), редактираш в Excel, каквото там е нужно, записваш като XML Spreadsheet, оп, качваш през админ панела файла и след няколко секунди цялата работа е свършена! Мммм, благинка. Та сега след като помогнахме на някой си някъде там да има повече време да се задява с колежките, да се позанимаем и ние с малко глупости. It’s showtime :) Оп, microtime(), обърках се ;)

Да ви преставя концепцията на състезанието:

Имаме две кучки бегачки, и двете са резачки (split). Задачата им ще е да отрежат главата на мистър Файл един милион пъти и да я върнат. Борим се за всяка милипунта, щот не можем да си позволим излишен разход на ценни милисекунди :)

Първият състезател:

function getExtByArrayMethod ($file, $allowableExtensions) {
$split = array_reverse(explode('.', $file));
if (in_array(strtolower($split[0]), $allowableExtensions)) {
return $ext = $split[0];
}
}

Той се състезава така: първо му го нацепва на мистър Файл по всяка негова чувствителна точка с explode(’.', $file), после го обръща у лево с array_reverse (виждате ли какви неща има в PHP-то!!!). След това взема първото отсечено след обръщането, смалява го (strtolower) и проверява дали пасва на това, което търси (масив $allowableExtensions с разрешени файлови съкращения). Ако пасне го изплюва сдъвкано - и така един милион пъти :)

Другата кучка:

function getExtByStringMethod ($file, $allowableExtensions) {
$ext = strtolower(substr($file, strrpos($file, '.') + 1));
if (in_array($ext, $allowableExtensions)) {
return $ext;
}
}

Туй говедо не ползва масиви, а третира мистър Файл като простоват низ (string). Първо нанюхва важната последна точка в низа чрез strrpos, и с 1 идея напред, с един удар реже остатъка. Смалява го, проверява дали пасва и ако да, го изплюва - и така един милион пъти.

Ето го семплото циклене:

for ($i = 1; $i < = ITR; $i++) {
getExtByArrayMethod(FILENAME, $allowableExtensions);
}

Тук имаме константи и един масив, които ще ползваме за състезанието:

$allowableExtensions = array('avi', 'mpg', 'mp4',
'mov', 'wmv', 'flv', 'mpeg', 'gp3',
'vob', 'rm', 'txt', 'psd', 'exe');

define('FILENAME', 'video4560289703.public.gp3';);
define('ITR', 1000000);

Ползваме microtime() заедно с една полезна функцийка от php.net за превръщане на резултата в нещо лесно разбираемо и.. Старт! :)

Begin getExtByArrayMethod: 1219751738.47
End getExtByArrayMethod: 1219751748.79
Result: 10.3256812096

Begin getExtByStringMethod: 1219751748.79
End getExtByStringMethod: 1219751755.35
Result: 6.55777096748

Както виждате при един милион итерации моята кучка бие тази на колегата с близо 4 секунди или цели 4000 милипунти, представяте ли си?! :) Колегата явно хич не го е*е за разхищаване на ценно процесорно време :P

Извън кръга на майтапа и чуденката, работа с масиви или със стрингове за конкретното приложение.. нещо сериозно: никога не проверявайте при upload формуляр само за MIME Type на качваните файлове. Това е лесно заобиколимо препятствие и освен, ако не сте фенове да ви го хакват изотзаде, проверявайте винаги комбинирано и за MIME Type, и за разширението на файла, и за големината, и т.н., и т.н. Ама пак мое ви го хакнат, спасение няма :P

Ето го тестовият файл, можете да пробвате..

Tags: , , , , , , , , , , , , , , ,


Ето още един опит, този път с регулярен израз. Класира се с около 8.48567080498 между другите две:

function getExtBy_RegEx_Method ($file) {
return preg_match(”/\.(avi|mpg|mp4|mov|wmv|flv|mpeg|gp3|vob|rm|txt|psd|exe)$/i”, $file, $matches) ? $matches[1] : ”;
}