LINUX-BG Адрес : http://www.linux-bg.org |
За пишещите на PHP |
От: Andrey Публикувана на: 20-12-2002 Адрес на статията: http://www.linux-bg.org/cgi-bin/y/index.pl?page=article&id=advices&key=346773248 |
file_get_contents()Поне до момента на излизане на 4.3.0 са ми познати 3 начина за извличане съдържанието на файл от диска или въобще на файл, когато се използва потоци.
Това е един от най-често използваните методи. Може да го срещнете в много скриптове. Достатъчно бърз. Може да участва в израз. Недостатъци : В повечето случаи този код ще работи, но има изключения. До версия 4.3.0 функцията file() не е binary-safe. Т.е. за текстови файлове няма да има проблеми. Проблемите възникват във момента, в който решите да отваряте файл, който съдържа символа на '\0'. Начин за избягване : вж. Пример 2
Това е един от по-малко използван метод. Избягва проблема на предишният метод за версии < 4.3.0 . Скоростта му е някъде около тази на предишният метод, но мисля малко по-бавен. Недостатъци : Може би единственият му недостатък е, че се пише на 3 реда код и не може да бъде част от израз, както е при предишният метод.
Това е един от малко използван метод. Рядкост е да го срещнете в скрипт. Използва се техниката на буфериране на изхода, която не е много популярна. Определено най-бързият от всички показани до момента методи, но за сметка на това се използват повече ресурси (главно памет). Недостатъци : Както и Пример 2, не може да участва в израз. Не във всички случаи е недостатък, но ако паметта ви е кът, тогава не Ви го препоръчвам.
Тази функция се явява еволюционна, защото все пак не е хубаво за скриптов език, който се използва широко за извличане съдържанието на файл да се ползват накуп най-малко 2 функции. Това ще бъде вече най-бързият метод за четене при това е binary-safe. Като вътрешност функцията много наподобява readfile(), но връща резултата вместо да го изкарва на изхода. version_compare() и дебъгванеФункцията се използва са сравнение на два низа, които съдържат версии по PHP стандарта.
За част oт читателите половината код може да е неразбираем. Особено последния ред. Използва се побитово сравнение (аритметичен OR). Това е техника широко използвана oт програмистите на C. Дава възможност само с една операция да се провери дали е трябва да се изпише дадена дебъг информация.
Плюс на този метод е че се събира на 1 ред.
array_shift($ar)Тази функция връща първият елемент от масива $ar като го премахва от там и пренарежда масива. Ако търсите производителност и не се нуждаете от това елементите ви в един масив да са с индекси започващи от нула, то не използвайте тази функция. За разлика от Perl и Python, тук PHP e бавен. Силно намалената производителност е следствие от факта, че всички елементи на масива трябва да бъдат обходени и техните индекси да бъдат преномерирани от 0. Почти никакво е забавянето от прехеширането.Едно възможно решение само веднъж да си подредите масива по индекси (последователни), да правите unset() на първият елемент от масива, като използвате помощна променлива.
do..whiledo..while е цикъл с постусловие. Той се използва доста по-рядко от while. Дори доста често се правят трикове преди while за да се емулира на практика цикъла с постусловие. Тук обаче ще спомена една възможност, на тази конструкция, която намирам за много удобна :
array_map()Освен обикновенното си поведение, тази функция има нещо интересно скрито в нея :
Малко думи за производителностЗа всеки, който е решил да тръгне по пътя на ООП в PHP e ясно, че кода му ще бъде по-бавен. Все пак ако толкова силно желаете или се нуждаете от всяка милисекунда то тогава има какво да направите по въпроса
Навътре в начина на работа на Zend EngineРазликата се получава от спецификата на интерпретация на PHP скриптовете. Ако не използвате "кеш" за код, то ZendEngine1)Зарежда скрипта от диска 2)Прави анализ 2.1)Синтактичен 2.2)Семантичен, като едновременно с него се генерира междинен код 3)Изпълнява генерираният междинният код Междинният компилираният междинен код е това, което популярните продукти като ZendCache и PHPAccelerator кешират. В известна степен междинният код може да се и се оптимизира от тези продукти. Така изпълнението на скриптове може да се ускори значително. Все пак нека да кажа нещо повече за междинният код. Това е асемблера на PHP. Инструкциите са подобни на тези в асемблерите за различни процесори, но съобразени със спецификата на "виртуалната машина". Опкодовете са над 110 във ZE1 и около 140 във ZE2. Когато едно присвояване се превръща в междинен код то се замества с няколко опкода. Зарежда се адреса на променливата, на която се присвоява стойност. Търси се по име(низ) в хеша на текущо активната функция (била тя и main() ). Този адрес се зарежда във временна променлива. След това ако на променливата се присвоява променлива се зарежда нейният адрес, и първата променлива става референция (да не се бърка с указател) към втората. Ако се присвоява израз, то се извлича резултата от временната променлива в която преди това е записан. Всичко това може да изглежда малко сложно, но на практика не е така. Тази теория помага да се обяснени "Пример 10". Когато използват $this->property , се зарежда адреса на $this от хеша на известните променливи в текущият метод, след това в хеша съдържащ член-променливите на класа се извършва търсене по низ, за да се намери адрес на $this->property. Както се вижда разликата, е че при член променливи се извършва едно търсене повече. Все пак $this e една от първите декларирани променливи във всеки метод и търсенето е по-бързо. Ако продължим с разсъжденията на база на горната теория може да се обясни защо са възможно това :
Литература:
<< Често задавани въпроси за Squid (част 2) | Как да накареме конзолата да щади очите ни. >> |
Авторите на сайта, както и техните сътрудници запазват авторските права върху собствените си материали публикувани тук,
но те са copyleft т.е. могат свободно да бъдат копирани и разпространявани с изискването изрично да се упоменава името на автора,
както и да се публикува на видно място, че те са взети от оригиналния им URL-адрес на този сървър (http://www.linux-bg.org). Авторските права на преводните материали принадлежат на техните автори. Ако с публикуването тук на някакъв материал неволно са нарушени нечии права - след констатирането на този факт материалът ще бъде свален.
All trademarks, logos and copyrights mentioned on this site are the property of their respective owners.
|