
Точно приключих с един експорт/импорт скрипт (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 милипунти, представяте ли си?!
Колегата явно хич не го е*е за разхищаване на ценно процесорно време
Извън кръга на майтапа и чуденката, работа с масиви или със стрингове за конкретното приложение.. нещо сериозно: никога не проверявайте при upload формуляр само за MIME Type на качваните файлове. Това е лесно заобиколимо препятствие и освен, ако не сте фенове да ви го хакват изотзаде, проверявайте винаги комбинирано и за MIME Type, и за разширението на файла, и за големината, и т.н., и т.н. Ама пак мое ви го хакнат, спасение няма
—
Ето го тестовият файл, можете да пробвате..
Tags: Excel, export, import, microtime, MySQL, PHP, race, showtime, XML, бъзик, експорт, импорт, почивка, състезание, улеснение, функционалност
‹ PHP Security - преглед на печата •

2 коментара
RSS емисия за коментарите към тази публикация
Trackback линк
http://www.vlkomarov.info/blog/2008/08/26/its-show-race-microtime/trackback/
26.08.2008, 16:44
Pingback от Hamaelleon: Нещо се загубих напоследък и не ви спам.. - edno23.com
26.08.2008 at 16:22
Hamaelleon
Ето още един опит, този път с регулярен израз. Класира се с около 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] : ”;
}