Вие се занимавате със създаването и популяризирането на уебсайт под контрола на CMS Joomlaи изведнъж имате нужда да преработите по ваш вкус и настроение проектиране на материала чрез редактиране на стандартните шаблони на компонента com_content? Компонентът отговаря за генерирането на съдържание. Нека да разгледаме структурата на самия компонент.

Местоположение на шаблона за стандартен материал

Оригинални компонентни файлове com_съдържаниеразположен в компоненти\com_content\views\View\tmpl. Ако компонентните файлове са копирани в директорията \templates\template\html\com_content\, която използвате, тогава шаблонът на материала ще бъде взет от файловете на тази папка.

Шаблонни директории и файлове

Директорията за местоположение на шаблона съдържа пет папки за генериране на изгледи.

папка архив

  • Папка с шаблон за изходен архив. Тази статия не се разглежда, рядко се използва от никого. Структурата е подобна на папките, описани по-долу;

папка статия - Материал

папка първа страница - Главна страница

  • default.phpСъщият принцип като category\blog.php;
  • default_item.phpСъщият принцип като category\blog_item.php;
  • default_links.phpСъщият принцип като category\blog_links.php;

папка раздел - Глава

  • blog.phpШаблон за блог на секция. Същият принцип като category\blog.php;
  • blog_item.phpШаблон за отделна статия от раздела на блога. Същият принцип като category\blog_item.php;
  • blog_links.phpШаблон за представяне на връзки под секцията блог. Същият принцип като category\blog_links.php;
  • default.phpСтандартен шаблон за раздел. Показва заглавието на категорията, нейното описание, броя на елементите. След като щракнете върху заглавието на категорията, страницата се обработва от category\default.php;

Пример за редактиране на шаблон. Показва броя прегледи на материала.

Да кажем, че искаме отпечатайте броя на хитоветеиндивидуален материалот категория блог. За да направите това, редактирайте шаблона category\blog_item.php. Кодът за вмъкване на информация за попадения ще бъде както следва:

item->hits ?>

Сега трябва да намерите в шаблонния файл category\blog_item.php мястото, където да вмъкнете този код. Например, преди да се покаже датата на последното редактиране на материала. Търся реда:

item->modified) !=0 && $this->item->params->get("show_modify_date")) : ?>

И преди него вмъкнете ред с кода.

Пример изброяване на категории в множество колони .

Вижте неволно ... Речник на руски синоними и изрази, подобни по значение. под. изд. Н. Абрамова, М .: Руски речници, 1999. несъзнателно по инстинкт, без да го осъзнавате, спонтанно, панически, инстинктивно, без да го осъзнавате, без да го осъзнавате, ... ... Речник на синонимите

Неотчетно, инстинктивно, автоматично, спонтанно, сляпо. См … Речник на синонимите

Неволно, несъзнателно, несъзнателно, инстинктивно, механично, машинално, сляпо, спонтанно; случайно, неволно; Иска или не иска (volens nolens), поради необходимост Той трябваше да направи това поради неща извън неговия контрол... ... Речник на синонимите

Сляпо, подсъзнателно, вътрешно, без да осъзнавате, без да осъзнавате, спонтанно, несъзнателно, без да осъзнавате, несъзнателно, механично, несъзнателно, несъзнателно, интуитивно, несъзнателно, шесто чувство, инстинктивно Речник на руснаците ... ... Речник на синонимите

Вижте неволно ... Речник на руски синоними и изрази, подобни по значение. под. изд. Н. Абрамова, М .: Руски речници, 1999. сляпо несъзнателно, неволно; неясно, безразсъдно, несъзнателно, спонтанно, инстинктивно, робски, несъзнателно, неясно, ... ... Речник на синонимите

адв. на неотговорните. [Майка] искаше да се върне назад, но несъзнателно тръгна отново напред. М. Горки, Майка. [Юдушка] молеше добрата си приятелка майка да управлява безпрекословно имението му. Салтиков Шчедрин, Господа Головлеви ... Малък академичен речник

НЕОТЧЕТЕН, безотчетен, безотчетен; (не се използва кратък мъжки род) безотчетен, безотчетен. 1. Не подлежи на никакъв контрол, не е задължен да се отчита. Той имплицитно (adv.) изхвърли в магазина. 2. Не зависи от разумни съображения, ... ... РечникУшаков

- (Гръцки). Лице, на което е поверено да търгува безотговорно, за сметка на друго лице. Речник на чуждите думи, включени в руския език. Chudinov A.N., 1910. ANAGALIST Лице, на което е поверено да търгува за сметка на друго лице без отговорност. Обяснение…… Речник на чуждите думи на руския език

Неотчетно, несъзнателно, механично, неволно, автоматично, механично, автоматично, механично, автопилот Речник на руските синоними. автоматично вижте автоматично Речник на синонимите на руския език. Практическо ръководство. М .: Руски ... Речник на синонимите

Вижте неволно ... Речник на руски синоними и изрази, подобни по значение. под. изд. Н. Абрамова, М.: Руски речници, 1999. инстинктивно, несъзнателно, неволно; неволно, несъзнателно, вътрешно, спонтанно, спонтанно, несъзнателно, сляпо, ... ... Речник на синонимите

Книги

  • Пътуване из Чехословакия, Й. Марко, М. Петерка, Прага, 1959 г. Артия. С много фотографски илюстрации. Обвързване на издателя. Безопасността е добра. Омагьосаният скитник от всяка страна по света, ровейки се в тази красива книга, ще може да ... Категория: Бележки на пътешественици, мемоари, изследвания Издател: Artia,
  • Табло, или Срещи на Сеная, Генадий Григориев, Сергей Носов, Има места в Санкт Петербург, които са просто фантазмогенни. Площад Сенная е един от тях. "Сенная - люлката на фантасмагорията". Самите автори изглеждат изненадани от случилото се с тях на Сеная. Да и... Категория: Класическа и съвременна проза Поредица: Петербургски лица на нашето времеИздател:

Много хора обичат да пишат такива конструкции под една или друга форма, всеки е срещал:
foreach ($items като &$item) ($item += 2;)
Но не много хора са наясно с опасността, която дебне тук.
Помислете за пример.

Вася Пупкин взе масив, премина през него, увеличавайки всички елементи с две:
$items = array("a" => 10, "b" => 20, "c" => 30,); foreach ($items като &$item) ( $item += 2; ) print_r($items);
Погледнах дъмпа, видях, че задачата е решена и си тръгнах доволен:
Масив ([a] => 12[b] => 22[c] => 32)
След известно време Петрович реши да допълни този раздел от код с друго изброяване, като добави по-долу:
$newitems = масив ("a" => 10, "b" => 20, "c" => 30,); foreach ($newitems като $key=>$item) ( $newitems[$key] += 5; ) print_r($newitems);
Той изглеждаше, че и неговата задача е решена и с чувство за постижение затвори файла:
Масив ([a] => 15 [b] => 25 [c] => 35)
След известно време започнаха да излизат необясними грешки. Защо?
Нека направим var_dump($items) в края на кода:
array(3) ( ["a"]=> int(12) ["b"]=> int(22) ["c"]=> &int(30) )
тридесет! Вася Пупкин се кълне, че е проверил. Защо беше 32, а след кода на Петрович 30?

Причината се крие в амперсанда. Той съобщава, че маркираните данни се препращат от някой друг. Когато си тръгваше, Вася не изтри временната променлива зад себе си, която използваше за изброяване ($item). Променливата е използвана с разрешение за промяна на източника ("&"), което също се нарича "присвояване чрез препратка". Той беше сигурен, че променливата ще се използва само вътре в цикъла. Петрович, използвайки променлива със същото име, в хода на своето изброяване, променя стойността й и всеки път мястото, където се съхранява тази променлива, се променя. И беше съхранен на същото място като последния елемент от масива Pupkin.

Разбира се, в случая в статията преувеличени. На практика тези връзки могат да бъдат много сложни, особено ако проектът не е скъп и включва неопитни и различни уеб разработчици.

Как можете да заобиколите това?

  • Унищожете временните променливи след употреба, особено ако имат някаква връзка с използваните данни:
    foreach ($items като &$item) $item += 2; изключване ($ елемент);
  • Бъдете внимателни с променливи, които вече са били използвани от някого.
  • Капсулирайте вашите действия в отделни функции, методи или пространства от имена.
  • Използвайте var_dump вместо print_r и обърнете внимание на амперсанда. За изхвърляне във файл вместо в браузъра, алтернатива на print_r($var,true) би била:
    функция dump() ( ob_start(); foreach(func_get_args() като $var) var_dump($var); return ob_get_clean(); )
В заключение ще кажа, че грешките, свързани с връзките, могат да бъдат не само във foreach. И всички те някога са били обсъждани. Но този случай, съдейки по моя опит, е толкова често срещан в практиката, че заслужава специално внимание.

Много фатални и възстановими фатални грешки са преобразувани в изключения в PHP 7. Тези изключения за грешки наследяват от класа Error, който сам имплементира интерфейса Throwable (новият базов интерфейс наследява всички изключения).

Това означава, че персонализираните манипулатори на грешки може вече да не се задействат, защото вместо това може да бъдат хвърлени изключения (причиняващи нови фатални грешки за неуловени изключения за грешка).

По-пълно описание на това как работят грешките в PHP 7 може да бъде намерено на страницата за грешки в PHP 7. Това ръководство за мигриране само ще изброи промените, които засягат обратната съвместимост.

// PHP 5 ера код, който ще се повреди.
манипулатор на функция (Изключение $e) (...)
set_exception_handler("манипулатор");

// Съвместим с PHP 5 и 7.
манипулатор на функция ($e) (...)

// Само PHP 7.
манипулатор на функция (Throwable $e) (...)
?>

Вътрешните конструктори винаги хвърлят изключения при повреда

Преди това някои вътрешни класове се връщаха НУЛАили неизползваем обект, когато конструкторът се провали. Всички вътрешни класове сега ще хвърлят изключение в този случай по същия начин, по който потребителските класове вече трябваше.

E_STRICT забелязва промени в сериозността

Всички от E_STRICTизвестията са прекласифицирани на други нива. E_STRICTконстантата се запазва, така че извикванията като докладване_на_грешка(E_ALL|E_STRICT)няма да причини грешка.

E_STRICTзабележете промени в тежестта
Ситуация Ново ниво/поведение
Индексиране по ресурс E_NOTICE
Абстрактни статични методи
"Предефиниране" на конструктор Забележката е премахната, не задейства грешка
Несъответствие на подписа по време на наследяването E_ПРЕДУПРЕЖДЕНИЕ
Едно и също (съвместимо) свойство в два използвани признака Забележката е премахната, не задейства грешка
Достъп до статично свойство нестатично E_NOTICE
Само променливите трябва да се присвояват чрез препратка E_NOTICE
Само променливите трябва да се предават по референция E_NOTICE
Извикване на нестатични методи статично E_ОТТЕГЛЕНО

Промени в обработката на променливи

PHP 7 вече използва абстрактно синтактично дърво, когато анализира изходните файлове. Това позволи много подобрения на езика, които преди това бяха невъзможни поради ограничения в синтактичния анализатор, използван в по-ранните версии на PHP, но доведе до премахването на няколко специални случая от съображения за последователност, което доведе до прекъсвания на обратната съвместимост. Тези случаи са описани подробно в този раздел.

Промени в обработката на индиректни променливи, свойства и методи

Индиректният достъп до променливи, свойства и методи вече ще се оценява стриктно в ред отляво надясно, за разлика от предишната комбинация от специални случаи. Таблицата по-долу показва как се е променил редът на оценяване.

Стара и нова оценка на непреки изрази
изразяване Интерпретация на PHP 5 Интерпретация на PHP 7
$$foo["bar"]["baz"] $($foo["bar"]["baz"]) ($$foo)["bar"]["baz"]
$foo->$bar["baz"] $foo->($bar["baz"]) ($foo->$bar)["baz"]
$foo->$bar["baz"]() $foo->($bar["baz"])() ($foo->$bar)["baz"]()
Foo::$bar["baz"]() Foo::($bar["baz"])() (Foo::$bar)["baz"]()

Кодът, който използва стария ред на оценка отдясно наляво, трябва да бъде пренаписан, за да използва изрично този ред на оценка с фигурни скоби (вижте горната средна колона). Това ще направи кода едновременно съвместим с PHP 7.x и обратно съвместим с PHP 5.x.

var_dump (1 >> - 1);
?>

Фатална грешка: Uncaught ArithmeticError: Преместване на битове с отрицателно число в /tmp/test.php:2 Проследяване на стека: #0 (основен) хвърлен в /tmp/test.php на ред 2

Изместване на битове извън диапазона

Побитови измествания (във всяка посока) извън битовата ширина на an цяло числовинаги ще доведе до 0. Преди това поведението на такива смени беше зависимо от архитектурата.

Промени в Деление на нула

Преди това, когато 0 се използваше като делител за операторите за деление (/) или модул (%), щеше да бъде излъчено E_WARNING и невярноще бъдат върнати. Сега операторът за разделяне връща стойност с плаваща единица като +INF, -INF или NAN, както е посочено от IEEE 754. Модулният оператор E_WARNING е премахнат и ще хвърли изключение DivisionByZeroError.

var_dump(3/0);
var_dump(0 / 0);
var_dump(0 % 0);
?>

Резултат от горния пример в PHP 5:

Предупреждение: Деление с нула в %s на ред %d bool(false) Предупреждение: Деление на нула в %s на ред %d bool(false) Предупреждение: Деление на нула в %s на ред %d bool(false)

Резултат от горния пример в PHP 7:

Предупреждение: Деление с нула в %s на ред %d float(INF) Предупреждение: Деление на нула в %s на ред %d float(NAN) PHP Фатална грешка: Uncaught DivisionByZeroError: Modulo с нула в %s ред %d

$str = "0xffff" ;
$int = filter_var ($str, FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX);
if (false === $int ) (
хвърля ново изключение("Невалидно цяло число!");
}
var_dump($int); // int(65535)
?>

\u(може да причини грешки

Поради добавянето на новия синтаксис за избягване на кодовата точка на Unicode, низове, съдържащи литерал \u(последвано от невалидна последователност, ще доведе до фатална грешка. За да избегнете това, водещата обратна наклонена черта трябва да бъде екранирана.

Премахнати функции

Премахнати INI директиви

xsl.security_prefs

Директивата xsl.security_prefs е премахната. Вместо това, XsltProcessor::setSecurityPrefs()методът трябва да бъде извикан, за да контролира предпочитанията за сигурност на базата на процесор.

Други обратно несъвместими промени

Новите обекти не могат да се присвояват чрез препратка

Резултатът от новоператорът вече не може да бъде присвоен на променлива чрез препратка:

клас C ()
$c =& нов C ;
?>

Резултат от горния пример в PHP 5:

Отхвърлено: Присвояването на върнатата стойност на new чрез препратка е отхвърлено в /tmp/test.php на ред 3

Резултат от горния пример в PHP 7:

Грешка при анализиране: синтактична грешка, неочаквано „ново“ (T_NEW) в /tmp/test.php на ред 3

Невалидни имена на класове, интерфейси и характеристики

Следните имена не могат да се използват за именуване на класове, интерфейси или характеристики:

  • bool
  • вътр
  • плавам
  • низ
  • НУЛА
  • ВЯРНО
  • НЕВЯРНО

Освен това не трябва да се използват следните имена. Въпреки че няма да генерират грешка в PHP 7.0, те са запазени за бъдеща употреба и трябва да се считат за остарели.

  • обект
  • смесен
  • числови

PHP таговете за ASP и скрипт са премахнати

Поддръжката за използване на ASP и скриптови тагове за ограничаване на PHP кода е премахната. Засегнатите тагове са:

Премахнати ASP и скриптови тагове
отварящ етикет Затварящ етикет
<% %>
<%= %>

Обажданията от несъвместим контекст са премахнати

Отхвърлени по-рано в PHP 5.6, статични извиквания, направени към нестатичен метод с несъвместим контекст, сега ще доведат до извикан метод с недефиниран $товапроменлива и се издава предупреждение за отмяна.

клас А (
публична функция test() (var_dump($this);)
}

// Забележка: НЕ разширява A
клас B (
публична функция callNonStaticMethodOfA() ( A::test(); )
}

(ново B)-> callNonStaticMethodOfA();
?>

Резултат от горния пример в PHP 5.6:

Отхвърлено: Нестатичният метод A::test() не трябва да се извиква статично, като се приема $this от несъвместим контекст в /tmp/test.php на ред 8 object(B)#1 (0) ( )

Резултат от горния пример в PHP 7:

Отхвърлено: Нестатичният метод A::test() не трябва да се извиква статично в /tmp/test.php на ред 8 Забележка: Недефинирана променлива: това в /tmp/test.php на ред 3 NULL

yield вече е десен асоциативен оператор

Конструкцията yield вече не изисква скоби и е променена на десен асоциативен оператор с приоритет между печати => . Това може да доведе до промяна в поведението:

добив на ехо - 1;
ехо (добив) - 1;
// И сега се тълкува като
добив на ехо (- 1);

Дайте $foo или умрете;
// Преди това се интерпретира като
yield($foo or die);
// И сега се тълкува като
(yield $foo ) или умрете;
?>

Скобите могат да се използват за разграничаване на тези случаи.

Функциите не могат да имат няколко параметъра с едно и също име

Вече не е възможно да се дефинират два или повече функционални параметъра с едно и също име. Например, следната функция ще задейства an E_COMPILE_ERROR:

функция foo ($a, $b, $unused, $unused) (
}
?>

Функциите, проверяващи аргументите, отчитат текущстойност на параметъра

func_get_arg(), func_get_args(), debug_backtrace()и обратното проследяване на изключение вече няма да отчита оригиналната стойност, която е била предадена на параметър, но вместо това ще предостави текущата стойност (която може да е била модифицирана).

функция foo ($x ) (
$x++;
var_dump(func_get_arg(0));
}
foo(1); ?>

Резултат от горния пример в PHP 5:

Резултат от горния пример в PHP 7:

Операторите Switch не могат да имат множество блокове по подразбиране

Вече не е възможно да се дефинират два или повече блока по подразбиране в команда за превключване. Например следният оператор switch ще задейства an E_COMPILE_ERROR:

превключвател (1 ) {
по подразбиране:
прекъсване;
по подразбиране:
прекъсване;
}
?>

Разширението JSON е заменено с JSOND

Разширението JSON е заменено с JSOND, причинявайки три незначителни прекъсвания на BC. Първо, числото не трябва да завършва с десетична запетая (т.е. 34. трябва да се промени на едно от двете 34.0 или 34 ). Второ, когато използвате научна нотация, декспонентата не трябва да следва непосредствено десетичната запетая (т.е. 3.e3трябва да се промени на едно от двете 3.0e3или 3e3). И накрая, празен низ вече не се счита за валиден JSON.

Неизправност на вътрешната функция при препълване

Преди това вътрешните функции съкращаваха безшумно числата, получени от принудителни действия от float към цяло число, когато float беше твърде голям, за да се представи като цяло число. Сега ще бъде излъчено E_WARNING и НУЛАще бъдат върнати.

Корекции на връщаните стойности на манипулатора на персонализирани сесии

Всички предикатни функции, реализирани от персонализирани манипулатори на сесии, които връщат едно от двете НЕВЯРНОили -1 ще бъдат фатални грешки. Ако има стойност от тези функции, различна от булева, -1 , или 0 се връща, тогава ще се провали и ще бъде излъчено E_WARNING.

Ред на сортиране на равни елементи

Вътрешният алгоритъм за сортиране е подобрен, което може да доведе до различен ред на сортиране на елементи, които се сравняват като равни, отколкото преди.

Не разчитайте на реда на елементите, които се сравняват като равни; той може да се промени по всяко време.

Неправилно поставени изрази за прекъсване и превключване

прекъсвами продължиизрази извън цикъл или превключвателконтролната структура вече се откриват по време на компилиране, вместо по време на изпълнение, както преди, и задействат an E_COMPILE_ERROR.

Колкото и да използваме PHP, някои функции все още изскачат, за които дори не сме чували. Някои от тях биха ни били много полезни. Създадох кратък списък с полезни функции, които всеки PHP програмист трябва да има в своя арсенал.

1. Създаване на функции с променлив брой аргументи

Вероятно вече знаете, че PHP ни позволява да създаваме функции с незадължителни аргументи. Сега ще покажа функция, в която броят на аргументите може да се променя от случай на случай.

Но първо, нека си припомним как създаваме функции по обичайния начин:

// функция с два незадължителни параметъра function foo($arg1 = "", $arg2 = "") ( echo "arg1: $arg1\n"; echo "arg2: $arg2\n"; ) foo("здравей", "свят"); /* изход: arg1: здравей arg2: свят */ foo(); /* изход: arg1: arg2: */

Сега нека да разгледаме как можете да напишете функция с неограничен брой аргументи. За това ще се използва методът func_get_args():

// не указвайте аргументи функция foo() ( // връща масив от предадени аргументи $args = func_get_args(); foreach ($args as $k => $v) ( echo "arg".($k+1) ." : $v\n"; ) ) foo(); /* не извежда нищо */ foo("здравей"); /* изход arg1: здравей */ foo("здравей", "свят", "отново"); /* изход arg1: здравей arg2: свят arg3: отново */

2. Използвайте Glob() за намиране на файлове

Често имената на функциите говорят сами за себе си. Същото не може да се каже за функцията glob().

Без да навлизаме в подробности, неговата функционалност е подобна на метода scandir(). Тя ви позволява да намерите необходимия файл по шаблона:

// намиране на всички php файлове $files = glob("*.php"); print_r($файлове); /* изход: масив ( => phptest.php => pi.php => post_output.php => test.php) */

За да намерите файлове от няколко типа, трябва да напишете така:

// намиране на всички php и txt файлове $files = glob("*.(php,txt)", GLOB_BRACE); print_r($файлове); /* изход: масив ( => phptest.php => pi.php => post_output.php => test.php => log.txt => test.txt) */

Можете също да посочите пътя в шаблона:

$files = glob("../images/a*.jpg"); print_r($файлове); /* изход: масив ( => ../images/apple.jpg => ../images/art.jpg) */

За да получите пълния път до документ, използвайте метода realpath():

$files = glob("../images/a*.jpg"); // Прилагане на функцията "realpath" към всеки елемент от масива $files = array_map("realpath",$files); print_r($файлове); /* изход: масив ( => C:\wamp\www\images\apple.jpg => C:\wamp\www\images\art.jpg) */

3. Информация за използваната памет

Ако следите количеството памет, което се изяжда от вашите скриптове, вероятно ще ги оптимизирате по-често.

PHP има мощен инструмент за проследяване на паметта. В различните части на скрипта натоварванията могат да бъдат различни. За да получите стойността на използваната памет в този момент, трябва да използваме метода memory_get_usage(). За да коригирате максималното количество използвана памет, използвайте memory_get_peak_usage()

echo "Първоначално: ".memory_get_usage()." байтове \n"; /* Първоначално: 361400 байта */ // дава малко натоварване за ($i = 0; $i< 100000; $i++) { $array = md5($i); } // и ещё for ($i = 0; $i < 100000; $i++) { unset($array[$i]); } echo "Final: ".memory_get_usage()." bytes \n"; /* Final: 885912 bytes */ echo "Peak: ".memory_get_peak_usage()." bytes \n"; /* Peak: 13687072 bytes */

4. Информация за процесора

За да направите това, трябва да използвате метода getrusage(). Но имайте предвид, че тази функция няма да работи на Windows.

Print_r(getrusage()); /* отпечатва масив ( => 0 => 0 => 2 => 3 => 12692 => 764 => 3864 => 94 => 0 => 1 => 67 => 4 => 0 => 0 => 0 => 6269 => 0) */

Очертаната по-горе картина ще бъде ясна за тези, които имат опит в системна администрация. За всички останали предлагаме дешифриране:

  • ru_oublock: брой блокови записи
  • ru_inblock: брой четения на блокове
  • ru_msgsnd: брой изпратени съобщения
  • ru_msgrcv: брой получени съобщения
  • ru_maxrss: максимален размер на нестранициран набор
  • ru_ixrss: обща споделена памет
  • ru_idrss: общо количество несподелени данни
  • ru_minflt: брой използвани страници с памет
  • ru_majflt: брой грешки в страницата
  • ru_nsignals: брой получени сигнали
  • ru_nvcsw: брой превключвания на контекст по процес
  • ru_nivcsw: брой принудителни превключвания на контекста
  • ru_nswap: брой достъпи до диска по време на страниране
  • ru_utime.tv_usec: време, прекарано в потребителски режим (микросекунди)
  • ru_utime.tv_sec: време, прекарано в потребителски режим (секунди)
  • ru_stime.tv_usec: време в привилегирован режим (микросекунди)
  • ru_stime.tv_sec: време за привилегирован режим (секунди)

За да разберете кои ресурси на вашия процесор се използват от скрипта, имате нужда от стойността на 'user time' (време в потребителски режим) и 'system time' (време в привилегирован режим). Можете да получите резултата както за секунди, така и за микросекунди. За да преобразувате общия брой секунди в десетично число, трябва да разделите стойността на микросекундите на 1 милион и да добавите секунди към стойността.

Някак объркващо. Ето един пример:

// почивка 3 секунди sleep(3); $ данни = getrusage (); echo "Потребителско време: ". ($data["ru_utime.tv_sec"] + $data["ru_utime.tv_usec"] / 1000000); echo "Системно време: ". ($data["ru_stime.tv_sec"] + $data["ru_stime.tv_usec"] / 1000000); /* отпечатва потребителско време: 0.011552 системно време: 0 */

Въпреки че изпълнението на скрипта отне около 3 секунди, процесорът не беше силно натоварен. Въпросът е, че при повикване (заспиване) скриптът практически не консумира ресурси на процесора. Като цяло има много задачи, които отнемат значително време, но не използват процесора. Например изчакване на операции, свързани с диска. Така че не винаги използвате процесорно време във вашите скриптове.

Ето още един пример:

// ходете 10 милиона пъти за ($i=0;$i<10000000;$i++) { } $data = getrusage(); echo "User time: ". ($data["ru_utime.tv_sec"] + $data["ru_utime.tv_usec"] / 1000000); echo "System time: ". ($data["ru_stime.tv_sec"] + $data["ru_stime.tv_usec"] / 1000000); /* выводит User time: 1.424592 System time: 0.004204 */

Скриптът отне 1,4 секунди процесорно време. В този случай времето за системни разговори обикновено е малко.

Времето в привилегирован режим (системно време) е времето, което процесорът изразходва за изпълнение на системни заявки към ядрото от името на програмата. Пример:

$start = микровреме (вярно); // извикване на microtime на всеки 3 секунди while(microtime(true) - $start< 3) { } $data = getrusage(); echo "User time: ". ($data["ru_utime.tv_sec"] + $data["ru_utime.tv_usec"] / 1000000); echo "System time: ". ($data["ru_stime.tv_sec"] + $data["ru_stime.tv_usec"] / 1000000); /* выводит User time: 1.088171 System time: 1.675315 */

Сега системното време е изразходвано много повече, отколкото в предишния пример. Всичко това благодарение на метода microtime (), който използва системни ресурси.

Все пак трябва да се отбележи, че показаното време може да не е точно, т.к. в даден момент ресурсите на процесора се използват и от други програми, което може да доведе до малка грешка.

5. Магически константи

В PHP има много магически константи, като номер на текущия ред (__LINE__), път на файл (__FILE__), път на директория (__DIR__), име на функция (__FUNCTION__), име на клас (__CLASS__), име на метод (__METHOD__) и пространства от имена (__NAMESPACE__) .

Няма да ги разглеждаме всички. Нека просто да разгледаме няколко:

// този скрипт зависи от текущото местоположение на файла и // може да причини проблеми, ако се използва от различни директории require_once("config/database.php"); // този скрипт няма да създава проблеми require_once(dirname(__FILE__) . "/config/database.php");

Използвайте __LINE__ при отстраняване на грешки в скриптове:

// код // ... my_debug("някакво съобщение за отстраняване на грешки", __LINE__); /* изход Ред 4: някакво съобщение за отстраняване на грешки */ // още код // ... my_debug("друго съобщение за отстраняване на грешки", __LINE__); /* изход Ред 11: друго съобщение за отстраняване на грешки */ функция my_debug($msg, $line) ( echo "Ред $line: $msg\n"; )

6. Генериране на уникални идентификатори

Има моменти, когато трябва да генерирате уникален низ. Много пъти съм виждал, че функцията md5() се използва за решаване на този проблем:

// генериране на случаен низ echo md5(time() . mt_rand(1,1000000));

Но всъщност PHP има специална функция uniqid() за тази цел.

// генериране на произволен низ echo uniqid(); /* извежда 4bd67c947233e */ // още веднъж echo uniqid(); /* отпечатва 4bd67c9472340 */

С невъоръжено око можете да видите, че първите знаци са меко казано подобни ... Това се дължи на факта, че този метод използва време на сървъра за генериране на знаци. Дори е полезно, защото. всички генерирани стойности се получават по азбучен ред, което прави възможно бързото им сортиране.

За да намалим шансовете за получаване на дубликат, можем да добавим префикс или да използваме втори параметър (увеличете броя на знаците):

// с префикс echo uniqid("foo_"); /* изход foo_4bd67d6cd8b8f */ // с втори параметър echo uniqid("",true); /* извежда 4bd67d6cd8b926.12135106 */ // и двете ехо uniqid("bar_",true); /* отпечатва bar_4bd67da367b650.43684647 */

Този метод генерира редове, по-малки от md5, така че можете да спестите място.

7. Сериализация

Случвало ли ви се е да съхранявате сложни данни в база данни или файл? За да конвертирате обект в низ, PHP предоставя специална функция.

Най-общо казано, тези методи са 2: serialize() и unserialize()

// сложен масив $myvar = array("hello", 42, array(1,"two"), "apple"); // конвертиране в низ $string = serialize($myvar); ехо $низ; /* изход a:4:(i:0;s:5:"здравей";i:1;i:42;i:2;a:2:(i:0;i:1;i:1;s :3:"two";)i:3;s:5:"apple";) */ // получаваме оригиналната стойност $newvar = unserialize($string); print_r($newvar); /* отпечатва масив ( => здравей => 42 => масив ( => 1 => две) => ябълка) */

Ето как работят тези функции. Въпреки това, поради бързото нарастване на популярността на JSON, 2 метода json_encode() и json_decode() бяха добавени в PHP 5.2. Тяхната работа е подобна на serialize():

// сложен масив $myvar = array("hello", 42, array(1,"two"), "apple"); // конвертиране в низ $string = json_encode($myvar); ехо $низ; /* отпечатва ["hello",42,,"apple"] */ // възстановяване на оригиналната стойност $newvar = json_decode($string); print_r($newvar); /* отпечатва масив ( => здравей => 42 => масив ( => 1 => две) => ябълка) */

Тази опция е по-компактна и съвместима с други езици като JavaScript. Въпреки това, когато работите с много сложни обекти, може да възникне загуба на данни.

8. Компресиране на низове

Когато говорим за компресиране, веднага се сещаме за архивни файлове в ZIP формат. PHP предоставя възможност за компресиране дълги линиибез никакви файлове.

В следващия пример ще демонстрираме работата на функциите gzcompress() и gzuncompress():

$string = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc ut elit id mi ultricies adipiscing. Nulla facilisi. Praesent pulvinar, sapien vel feugiat vestibulum, nulla dui pretium orci, non ultricies elit lacus quis ante. Lorem ipsum dolor sit amet , consectetur adipiscing elit. Aliquam pretium ullamcorper urna quis iaculis. Etiam ac massa sed turpis tempor luctus. Curabitur sed nibh eu elit mollis congue. Praesent ipsum diam, consectetur vitae ornare a, aliquam a nunc. In id magna pellentesque tellpis posuere seded non mi metus, at lacinia augue. Sed magna nisi, ornare in mollis in, mollis sed nunc. Etiam at justo in leo congue mollis. Nullam in neque eget metus hendrerit scelerisque eu non enim. Ut malesuada lacus eu nulla bibendum id euismod urna sodales. " ; $компресиран = gzcompress($низ); echo "Оригинален размер: ". strlen($string)."\n"; /* отпечатва Оригинален размер: 800 */ echo "Компресиран размер: ". strlen($compressed)."\n"; /* изход Компресиран размер: 418 */ // връща $original = gzuncompress($compressed);

Можем да намалим количеството текст с 50%. За същата цел можете да използвате методите gzencode() и gzdecode(), които използват различен алгоритъм за компресиране.

9. Стартирайте преди завършване

PHP има функция register_shutdown_function(), която ще ви позволи да изпълните някакъв код, преди скриптът да приключи.

Да приемем, че искате да разберете някаква информация... Време на изпълнение на скрипта:

// получаване на начален час $start_time = microtime(true); // някои операции // ... // отпечатване на времето за изпълнение echo "изпълнението отне: ". (microtime(true) - $start_time). "секунди.";

На пръв поглед това може да изглежда като тривиална задача. За тези цели можете да поставите кода в края на файла. Въпреки това, ако функцията exit() е изпълнена някъде преди, този код никога няма да работи. Също така няма да работи, ако има грешка на страницата или потребителят прекъсне зареждането на страницата (като щракне върху съответния бутон в своя браузър);

Когато използвате метода register_shutdown_function(), кодът ще бъде изпълнен така или иначе:

$start_time = микровреме(вярно); register_shutdown_function("my_shutdown"); функция my_shutdown() ( глобално $start_time; echo "изпълнението отне: ". (microtime(true) - $start_time). " секунди."; )

Заключение

PHP е цяла планета, която не спира да ни учудва със съдържанието си. Какво мислите за тези функции?