Опис структури шаблону com_content. Підводний камінь у foreach($items as &$item) Каталоги та файли шаблону

Багато хто любить писати такі конструкції в тому чи іншому вигляді, кожен стикався:
foreach ($items as &$item) ( $item += 2; )
Але не багато хто підозрює про те, яка небезпека тут ховається.
Розглянемо приклад.

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

Причина криється в амперсанді. Він повідомляє, що на зазначені дані посилається ще хтось. Виходячи, Вася не підтер за собою тимчасову змінну, яку використовував для перебору ($item). Змінна використовувалася з дозволом на зміну джерела ("&"), яку також називають "присвоюванням за посиланням". Він був упевнений, що змінна використовуватиметься лише всередині циклу. Петрович, використовуючи змінну з такою ж назвою, під час свого перебору, змінював її значення, і щоразу змінювалося те місце, де ця змінна зберігалася. А зберігалася вона там, де останній елемент масиву Пупкіна.

Звичайно, у випадок у статті перебільшено. На практиці такі зв'язки можуть бути дуже складними, особливо якщо проект недорогий, і в ньому беруть участь недостатньо досвідчені та розрізнені веб-розробники.

Як можна з цим обійтися?

  • Знищувати тимчасові змінні після використання, особливо якщо вони мають якісь зв'язки з даними, що використовуються:
    foreach ($items as &$item) $item += 2; unset($item);
  • Бути обережнішими зі змінними, які вже кимось використовувалися.
  • Інкапсулювати свої дії в окремі функції, методи чи простори імен.
  • Використовувати var_dump замість print_r, і звертати увагу на амперсанд. Щоб дати в файл, а не в браузер, альтернативою print_r($var,true) буде така конструкція:
    function dump() ( ob_start(); foreach(func_get_args() as $var) var_dump($var); return ob_get_clean(); )
Насамкінець скажу, що баги, пов'язані з посиланнями, можуть бути не тільки вforeach. І всі вони колись обговорювалися. Однак, цей випадок, судячи з мого досвіду, настільки поширений на практиці, що заслуговує на окрему увагу.

Займаєтесь створенням та просуванням сайту під керуванням CMS Joomla і у Вас раптом виникла необхідність переробити на свій смак та порядок оформлення матеріалу шляхом редагування стандартних шаблонів компонента com_content ? Компонент відповідає за формування контенту. Давайте розберемося у структурі самого компонента.

Розташування стандартного шаблону матеріалів

Оригінальні файли компонента com_content знаходяться в папці components\com_content\views\Представлення\tmpl. Якщо файли компонента скопіювати в каталог \templates\Вами використовуваний шаблон\html\com_content\, шаблон матеріалів буде братися з файлів цієї папки.

Каталоги та файли шаблону

У директорії розташування шаблону є п'ять папок для формування уявлень.

папка archive

  • Папка шаблон виведення архіву. У цій статті не розглядається, мало хто їм користується. Структура аналогічна нижчеописаним папкам;

папка article - Матеріал

папка frontpage - Головна сторінка

  • default.phpТакий самий принцип, як і у category\blog.php;
  • default_item.phpТакий самий принцип, як і у category\blog_item.php;
  • default_links.phpТакий самий принцип, як і у category\blog_links.php;

папка section - Розділ

  • 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. Код для вставки інформації про хіти буде таким:

Тепер потрібно знайти у файлі шаблону category\blog_item.php місце, де цей код вставити. Наприклад, перед відображенням дати останнього редагування матеріалу. Шукаємо рядок:

І перед нею вставляємо рядок із кодом.

приклад виведення списку категорій у кілька колонок .

Багато fatal і recoverable fatal errors повинні бути схвалені exceptions в PHP 7. Ці error exceptions inherit from the Error class, which itself implements the Throwable interface (the new base interface all exceptions inherit).

Це означає, що custom error handlers не може бути тривалий час, коли тремтять, exceptions можуть бути невдалими (викликати нові fall errors для uncaught Error exceptions).

У повному описі, як з'являються помилки, що працюють в PHP 7 може бути зроблено на PHP 7 errors page . Ця migration guide will merely enumerate the changes that affect backward compatibility.

Internal constructors always throw exceptions on failure

Перш за все, деякі міжнародні класи будуть відновити NULL або unusable object when the constructor failed. Всі міжнародні класи будуть невдовзі йти за винятком в цьому випадку в тому ж випадку, що user classes already had to.

E_STRICT notices severity зміни

Всі E_STRICT відомості мають бути перераховані на інші рівні. E_STRICT constant is retained, so calls like error_reporting(E_ALL|E_STRICT) will not cause an error.

E_STRICT notices severity зміни Situation New level/behaviour
Indexing by a resource E_NOTICE
Abstract static methods
"Redefining" a constructor Notice removed, triggers не error
Signature mismatch протягом inheritance E_WARNING
Same (compatible) property in two used traits Notice removed, triggers не error
Accessing static property non-statically E_NOTICE
Only variables should be assigned by reference E_NOTICE
Тільки variables should be passed by reference E_NOTICE
Calling non-static methods statically E_DEPRECATED
Changes to variable handling

PHP 7 зараз використовує abstract syntax tree коли parsing source files. Це буде прийнято багато дій на мові, які були вкрай неможливими для обмеження в особі, використовувані в попередніх версіях PHP, але будуть виконані в регулярних кількох особливих випадках для конкретних умов, які були виконані в backwardakpati. Вони існують в цьому розділі.

Зміни до handling of indirect variables, properties, and methods

Упрямий доступ до variables, properties, and methods now now be evaluated strictly in left-to-right order, as opposed to the previous mix of special cases. Table below shows how the order of evaluation has changed.

Old and new evaluation of indirect expressions Expression PHP 5 interpretation PHP 7 interpretation
$$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"]()

Код, який використовує загальний правий-лівий контроль послідовності повинен бути перевірений для explicitly use that evaluation order with curly braces (see the above middle column). Це буде зробити код code forwards compatible with PHP 7.x and backwards compatible with PHP 5.x.

Недостатня помилка: Неправильна ArithmeticError: Bit shift negative number in /tmp/test.php:2 Stack trace: #0 (main) thrown in /tmp/test.php on line 2

Out of range bitshifts

Bitwise shifts (in either direction) за bit width of integer will always result in 0. Previously, the behaviour of such shifts was architecture dependent.

Changes to Division By Zero

Перш за все, коли 0 був використаний як дивізійник для будь-якого divide (/) або modulus (%) операторів, E_WARNING може бути emitted і false можна було відновити. Нині, divide divide operator returns a float as ether +INF, -INF, або NAN, as specified by IEEE 754. The modulus operator E_WARNING буде been removed і буде кинути a DivisionByZeroError exception.

Output of the above example in PHP 5:

Warning: Division by zero in %s on line %d bool(false) Warning: Division by zero in %s on line %d bool(false) Warning: Division by zero in %s on line %d bool(false)

Output of the above example in PHP 7:

Warning: Division by zero in %s on line %d float(INF) Warning: Division by zero in %s on line %d float(NAN)

\u(мої cause errors

Натисніть на Addition of New Unicode codepoint escape syntax , strings containing a literal \u( followed by an invalid sequence буде викликати fatal error. Для того, щоб нести backslash повинні бути escaped.

Removed functions Removed INI directives xsl.security_prefs

The xsl.security_prefs directive has been removed. Instead, the XsltProcessor::setSecurityPrefs() метод повинен бути викликаний контролем безпеки preferences на першому-процесор basis.

Інші backward incompatible changes New objects cannot be assigned by reference

The result of the new statement can no longer be assigned to a variable by reference:

Output of the above example in PHP 5:

Відображено: Примітка, що значення return new by reference is deprecated in /tmp/test.php on line 3

Output of the above example in PHP 7:

Попередній error: syntax error, unexpected "new" (T_NEW) в /tmp/test.php on line 3

Invalid class, interface and trait names

Наступні назви не можуть бути використані в name classes, interfaces or traits:

  • bool
  • int
  • float
  • string
  • NULL
  • TRUE
  • FALSE

Ужебільше, наступні назви не повинні бути використані. Однак вони не можуть генерувати помилку в PHP 7.0, вони будуть використовуватися для майбутнього використання і повинні бути розглянуті.

  • object
  • mixed
  • numeric
ASP and script PHP tags removed

Support for using ASP and script tags to delimit PHP code буде been removed. The affected tags are:

Removed ASP and script tags Opening tag Closing tag
Calls from incompatible context removed

Спершу розпізнано в PHP 5.6 , статечні дзвінки спричиняють нестатичний метод з некомпетентним контекстом, що в цей час впроваджується в методі, що називається невизначеним. $this variable і deprecation warning being issued.

Output of the above example in PHP 5.6:

Визначено: Нестатичний метод A::test() не повинен бути названий статічним, оцінюваним $this from incompatible context in /tmp/test.php on line 8 object(B)#1 (0) ( )

Output of the above example in PHP 7:

Визначено: Нестатичний метод A::test() не може бути названий статичним в /tmp/test.php on line 8 Notice: Невизначений variable: this in /tmp/test.php on line 3 NULL

yield is now a right associative operator

Вони налаштовують не довгі вимоги parentheses, і мають бути змінені на правий соціальний функціонал з послідовністю між print and => . Це може бути результатом в зміненому стані:

Батьки можуть бути використані для розслаблення цих випадків.

Functions cannot have multiple parameters with the same name

Це не довгий час, щоб визначити дві або більше функцій параметрів з тим самим ім'ям. Для прикладу, наступна функція буде trigger an E_COMPILE_ERROR :

Functions inspecting arguments report the current parameter value

func_get_arg() , func_get_args() , debug_backtrace() і виключення backtraces не буде тривалий повідомлень оригіналу значення, яке було прописано до параметра, але буде встановлене значення поточної вартості (яка мусить бути змінена).

Output of the above example in PHP 5:

Output of the above example in PHP 7:

Switch statements cannot have multiple default blocks

Це не довгий час, щоб визначити два або більше подробиць блоків в перехідному стані. Для прикладу, наступний перемикач стан буде тригувати an E_COMPILE_ERROR :

JSON extension replaced with JSOND

The JSON extension has been replaced with JSOND, causing три minor BC breaks. Firstly, a number must not end in decimal point (i.e. 34. must be changed to either 34.0 or 34 ). Secondly, коли using scientific notation, the e exponent must no immediately follow a decimal point (i.e. 3.e3 must be changed to either 3.0e3 or 3e3). Зрештою, empty string is no longer вважається дійсним JSON.

Internal function failure on overflow

Передусім, міжнародні функції можуть бути нескінченно truncate цифри виготовлені з float-to-integer coercions коли float був too large to represent as integer. Now, an E_WARNING will be emitted and NULL will be returned.

Fixes to custom session handler return values

Any predicate functions implemented by custom session handlers that return either FALSE or -1 will be fatal errors. If any value from these functions other than a boolean, -1 , or 0 is returned, then it will fail and an E_WARNING will be emitted.

Sort order of equal elements

Внутрішній продаж algorithm був би improved, який може бути в різних sort orders елементів, які compare as equal, than before.

Don't rely on the order of елементів, які compare as equal; it might change anytime.

Misplaced break and switch statements

break and continue statements outside of a loop or switchСтруктуру структури є тепер помічено в часі часу, що встановлений в ході часу, як і триггер an E_COMPILE_ERROR .

Див мимоволі... Словник російських синонімів і подібних за змістом висловів. під. ред. Н. Абрамова, М.: Російські словники, 1999. несвідомо чуттям, сам не усвідомлюючи, стихійно, панічно, інстинктивно, сам того не усвідомлюючи, не усвідомлюючи, ... ... Словник синонімів

Незвітно, інстинктивно, машинально, стихійно, сліпо. Див … Словник синонімів

Мимоволі, несвідомо, несвідомо, інстинктивно, машинально, механічно, сліпо, стихійно; ненавмисно, ненавмисно; волею неволею, хочеш не хочеш (volens nolens), за потребою Це йому довелося зробити за незалежними від нього… … Словник синонімів

Сліпо, підсвідомо, нутром, сам того не усвідомлюючи, сам не усвідомлюючи, стихійно, несвідомо, не усвідомлюючи, несвідомо, механічно, несвідомо, несвідомо, інтуїтивно, несвідомо, шостим почуттям, інстинктивно Словник росіян… … Словник

Див мимоволі... Словник російських синонімів і подібних за змістом висловів. під. ред. Н. Абрамова, М.: Російські словники, 1999. сліпо несвідомо, мимоволі; невиразно, безрозсудно, несвідомо, стихійно, інстинктивно, рабськи, неусвідомлено, неясно, ... ... Словник синонімів

Нареч. до несвідомого. [Мати] хотіла повернути назад, але несвідомо знову пішла вперед. М. Горький, Мати. [Іудушка] благав доброго друга матінку керувати його маєтком несвідомо. Салтиков Щедрін, Панове Головлєви… Малий академічний словник

Беззвітний, несвідомий, несвідомий; (Котк. Чол. не упот.) несвідома, несвідомо. 1. Не підпорядковується ніякому контролю, не повинен звітувати. Він несвідомо (нареч.) розпоряджався в лавці. 2. Не залежить від розумних міркувань, ... ... Тлумачний словник Ушакова

- (Грець.). Особа, якій довірено торгувати несвідомо, за рахунок іншої особи. Словник іншомовних слів, що увійшли до складу російської мови. Чудінов А.Н., 1910. АНАГАЛІСТ Особа, якій довірено торгувати за рахунок іншої особи несвідомо. Пояснення… … Словник іноземних слів російської мови

Несвідомо, несвідомо, механічно, мимоволі, автоматично, машинально, автоматично, механічно, автопілотом Словник російських синонімів. автоматично див. машинально Словник синонімів російської мови. Практичний довідник М.: Російська … Словник синонімів

Див мимоволі... Словник російських синонімів і подібних за змістом висловів. під. ред. Н. Абрамова, М.: Російські словники, 1999. Інстинктивно несвідомо, мимоволі; мимоволі, несвідомо, нутром, спонтанно, стихійно, несвідомо, сліпо, … … Словник синонімів

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

Скільки б ми не використовували PHP, все одно спливають деякі функції, про які ми навіть не чули. Деякі з них були б дуже корисні. Я створив невеликий список корисних функцій, які повинні бути в арсеналі кожного програміста PHP.

1. Створення функцій зі змінною кількістю аргументів

Швидше за все, ви вже знаєте, що PHP дозволяє нам створювати функції з необов'язковими аргументами. Зараз я покажу функцію, в якій кількість аргументів може змінюватися час від часу.

Але для початку, пригадаємо, як ми створюємо функції звичайним чином:

// функція з двома необов'язковими параметрами function foo($arg1 = "", $arg2 = "") ( echo "arg1: $arg1\n"; echo "arg2: $arg2\n"; ) foo("hello", "world"); /* виведе: arg1: hello arg2: world */ foo(); /* виведе: arg1: arg2: */

Тепер подивимося, як можна написати функцію з необмеженою кількістю аргументів. Для цього буде використовувати метод func_get_args():

// не вказуємо аргументи function foo() ( // повертає масив, переданих аргументів $args = func_get_args(); foreach ($args as $k => $v) ( echo "arg".($k+1)." : $v\n"; ) ) foo(); /* нічого не виведе */ foo("hello"); /* виведе arg1: hello */ foo("hello", "world", "again"); /* виведе arg1: hello arg2: world arg3: again */

2. Використовуємо Glob() для пошуку файлів

Часто назви функцій говорять самі за себе. Такого не можна сказати про функцію glob().

Якщо не вдаватися до подробиць, її функціональність схожа з методом scandir(). Вона дозволяє знайти необхідний файл за шаблоном:

// Знайти всі php файли $files = glob("*.php"); print_r($files); /* виведе: Array ( => phptest.php => pi.php => post_output.php => test.php) */

Для знаходження файлів кількох типів треба писати так:

// Знайти всі php і txt файли $files = glob("*.(php,txt)", GLOB_BRACE); print_r($files); /* на виході: Array ( => phptest.php => pi.php => post_output.php => test.php => log.txt => test.txt) */

Також можна в шаблоні вказати шлях:

$files = glob("../images/a*.jpg"); print_r($files); /* на виході: Array ( => ../images/apple.jpg => ../images/art.jpg) */

Щоб отримати повний шлях до документа, використовуйте метод realpath() :

$files = glob("../images/a*.jpg"); // Застосувати функцію "realpath" до кожного елемента масиву $files = array_map("realpath", $files); print_r($files); /* виведе: Array ( => C: wamp \ www \ images \ apple.jpg => C: \ wamp \ www \ images \ art.jpg) * /

3. Інформація про пам'ять, що використовується

Якщо ви відстежуватимете кількість пам'яті, яка з'їдається на роботу ваших скриптів, то, напевно, частіше їх оптимізуватимете.

У PHP існує потужний інструмент відстеження пам'яті, що використовується. У різних частинах скрипта навантаження можуть бути різні. Для того щоб отримати значення пам'яті, що використовується в даний момент, нам слід використовувати метод memory_get_usage() . Для фіксації максимальної кількості пам'яті використовуємо memory_get_peak_usage()

Echo "Initial: ".memory_get_usage()." bytes \n"; /* Initial: 361400 bytes */ // дамо невелике навантаження for ($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()); /* prints Array ( => 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); $ 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: 0.011552 System time: 0 */

Хоча виконання скрипта зайняло близько 3 секунд, процесор не був сильно навантажений. Справа в тому, що при виклику скрипт практично не споживає ресурсів процесора. Взагалі, існує безліч завдань, які займають значний час, але при цьому не використовують процесор. Наприклад, очікування операцій пов'язані з диском. Отже, ви не завжди використовуєте процесорний час у своїх скриптах.

Ось ще приклад:

// пройтися 10 мільйонів разів for($i=0;$i hello => 42 => Array ( => 1 => two) => apple) */

Ось так працюють ці функції. Однак через бурхливе зростання популярності JSON, в PHP 5.2 було додано 2 методи json_encode() і json_decode(). Їхня робота схожа з serialize():

// Складні масив $ myvar = array ( "hello", 42, array (1, "two"), "apple"); // конвертуємо у рядок $string = json_encode($myvar); echo $string; /* виведе ["hello",42,,"apple"] */ // відновлюємо вихідне значення $newvar = json_decode($string); print_r($newvar); /* prints Array ( => hello => 42 => Array ( => 1 => two) => apple) */

Цей варіант є більш компактним і сумісним з іншими мовами, такими як JavaScript. Однак під час роботи з дуже навороченими об'єктами може виникнути втрата даних.

8. Стиснення рядків

Якщо ми говоримо про стиснення, то на думку відразу ж приходять архівні файли у форматі ZIP. PHP надає можливість стиснення довгих рядків без жодних файлів.

У наступному прикладі продемонструємо роботу функцій gzcompress() та gzuncompress() :

$string = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc ut elit id mi ultricies adipiscing. , consectetur adipiscing elit. adipiscing. non mi metus, at lacinia augue. . $compressed = gzcompress($string); echo "Початковий розмір: ". strlen($string)."\n"; /* виведе Original size: 800 */ echo "Compressed size: ". strlen($compressed)."\n"; /* виведе Compressed size: 418 */ // повертаємо $original = gzuncompress($compressed);

У наших силах зменшити обсяг тексту на 50%. У цих цілях можна використовувати методи gzencode() і gzdecode(), які використовують інший алгоритм стиснення.

9. Виконати перед завершенням

PHP існує функція register_shutdown_function() , яка дозволить вам виконати якийсь код перед завершенням роботи скрипта.

Допустимо, ви хочете дізнатися якусь інформацію… Час роботи скрипту:

// Отримуємо час початку $start_time = microtime(true); // якісь операції // ... // Виводимо час роботи echo "execution took:". (Microtime(true) - $start_time). "seconds.";

На перший погляд, це може здатися тривіальним завданням. Для цього, ви можете помістити код в кінці файлу. Однак якщо десь спрацює функція exit(), цей код ніколи не спрацює. Також він не спрацює, якщо на сторінці буде помилка або користувач перерве завантаження сторінки (натиснувши на відповідну кнопку у своєму браузері);

При використанні методу register_shutdown_function() код виконається у будь-якому випадку:

$start_time = microtime(true); register_shutdown_function("my_shutdown"); function my_shutdown() ( global $start_time; echo "execution took: ". (microtime(true) - $start_time). " seconds."; )

Висновок

PHP це ціла планета, яка не перестає нас дивувати своїм вмістом. А що думаєте ви про ці функції?



Подібні публікації