Fork me on GitHub

Ласкаво просимо

В інтернеті міститься багато застарілої інформації, що призводить до розгублення нових PHP користувачів, пропагуючи погані практики та поганий код. Це потрібно зупинити. PHP: Вірний шлях - це легка для читання, швидка довідка кращих практик PHP, прийнятих стандартів кодування та посилань на авторитетні навчальні матеріали зі всього інтернету.

Переклади

PHP: Вірний шлях є, або скоро буде перекладено на багато різних мов:

Письмова відмова від відовідальності

Немає канонічного способу використання PHP. Тим не менше, цей сайт містить скромну збірку кращих практик, доступних варіантів та хорошої інформації. Його мета познайомити нових PHP девелоперів та досвідчених професіоналів з новими ідеями.

Це живий документ, котрий буде продовжувати оновлюватись корисною інформацією та прикладами, як тільки вони стануть доступними.

Як взяти участь

Допоможіть зробити цей веб-сайт найкращим ресурсом для нових PHP програмістів! Візьміть участь на GitHub

Розкажи!

PHP: Вірний Шлях містить веб-банери, зображення, котрі ви можете використати на вашому сайті. Продемонструйте свою підтримку та дозвольте новим PHP девелоперам дізнатися де знайти хорошу інформацію!

Переглянути банери

Вверх

Почнімо

Використовуйте поточну стабільну версію (5.6)

Якщо ви тільки починаєте працювати з PHP, впевніться, що ви працюєте з поточним стабільним релізом PHP 5.6. PHP добився величезних успіхів за останні кілька років, добавивши потужні нові можливості. Не дайте маленькій різниці між версіями 5.2 та 5.6 обманути вас, вона представляє важливі покращення. Якщо ви шукаєте функцію або приклад її використання, ви можете знайти відповідь в документації на php.net.

Вбудований веб-сервер

Ви можете почати вивчення PHP без необхідності у встановленні та конфігурації повноцінного веб-сервера(Необхідний PHP 5.4 або новіше). Для запуску сервера, запустіть наступну команду із вашого терміналу в корені вашого проекту:

> php -S localhost:8000

Встановлення на Mac

OSX іде разом з вбудованим PHP, та зазвичай його версія трохи відстає від останньої стабільної. Lion постачається з PHP 5.3.6 а Mountain Lion з 5.3.10.

Ви можете обновити PHP на OSX через кілька менеджерів пакетів, з рекомендованим php-osx by Liip.

Інший варіант скомпілювати самостійно. В цьому випадку ви повинні впевнитися, що у вас встановлений Xcode, або його аналог від Apple “Інструменти командного рядка для Xcode”, їх можна скачати з Apple’s Mac Developer Center.

Для повного набору “все-в-одному”, включаючи PHP, веб-сервер Apache, та базу даних MySQL з хорошим графічним інтерфейсом, спробуйте MAMP.

Встановлення у Windows

PHP для Windows доступний в кількох видах. Ви можете скачати бінарні файли і до недавнього часу могли використовувати встановлювач ‘.msi’. Встановлювач більше не підтримується починаючи з версії PHP 5.3.0.

Для навчання та локальної розробки ви можете використовувати вбудований вебсервер із PHP 5.4 отож вам не потрібно хвилюватись за його конфугурування. Якщо ви хочете використовувати пакет “все-в-одному” котрий включає вебсервер та MySQL також тоді інструменти такі як Web Platform Installer, XAMPP та WAMP допоможуть вам швидко отримати готове середовище для розробки на Windows. Тим не менше, ці інструменти мають певні відмінності від production тож не забувайте про ці особливості, коли ви працюєте в Windows, а розгортання відбувається в Linux.

Якщо вам потрібно розгорнути вашу систему на Windows тоді IIS7 забезпечить вам найкращу стабільність та продуктивність. Ви можете використовувати phpmanager (GUI плагин для IIS7) щоб спростити конфігурування та керування PHP. IIS7 постачається з вбудованим та готовим до використання FastCGI, вам лише потрібно сконфігурувати PHP як обробник. Для підтримки та додаткових ресурсів існує спеціальний розділ на iis.netдля PHP.

Зазвичай, запуск вашої програми в різних середовищах при розробці та її безпосередньому використанні може призвести до дивних помилок, що появлятимуться коли ви запускаєте програму.Якщо ви розробляєте програми на Windows для використання під Linux, або якусь іншу ОС (не Windows). Тоді ви повинні розглянути використання віртуальної машини. Це звучить складно, та з допомогою Vagrant ви можете встановити прості обгортки, згодом використовуючи Puppet або Chef ви можете створювати ці блоки та ділитися ними з своїми колегами, щоб впевнитися, що ви працюєте над одним і тим же. Більше про це згодом.

Вверх

Керівництво з написання коду

Світ PHP великий та різноманітний, він складається з незліченних бібліотек, фреймворків та компонентів. Це спільне для PHP розробників, можливість обирати кілька з них та обєднувати в одному проекті. Важливо, щоб PHP код притримувався, на стільки, на скільки можливо, загальної стилістики коду, щоб полегшити розробникам змішування та поєднання різноманітних бібліотек для їх проектів.

Група Взаємодії Фреймворків (раніше відома, як ‘Група PHP Стандартів’) запропонувала та схвалила серію рекомендацій по стилю кодування, відомих як PSR-0, PSR-1 і PSR-2. Не дозволяйте цим смішним іменам спантеличити вас, ці рекомендації всього лиш набір правил, котрі деякі проекти, такі як Drupal, Zend, CakePHP, phpBB, AWS SDK, FuelPHP, Lithium, та інші починають впроваджувати. Ви можете почати використовувати їх для своїх власних проектів або продовжувати використовувати ваш власний стиль.

В ідеалі ви повинні писати код, котрий притримується одного або кількох із цих стандартів, щоб інші розробники могли легко читати і працювати з вашим кодом. Всі вони добавляють вимоги до попередньої рекомендації, отож використання PSR-1 вимагає PSR-0, але не вимагає PSR-2.

Ви можете використовувати PHP_CodeSniffer, для перевірки коду на відповідність цим рекомендаціям, додатки до текстових редакторів; Sublime Text 2 або подібні для отримання допомоги у реальному часі.

Використовуйте Налагоджувач стандартів кодування PHP Фаб’єна Потенсьєра для автоматичної зміни синтаксису вашого коду, щоб він відповідав цим стандартам, це позбавить вас від виправлення кожної проблеми вручну.

Слід використовувати англійську для іменування. Коментарі можуть бути на будь-якій мові, зручній для усіх, хто працює з кодом або буде працювати у майбутньому.

Вверх

Особливості мови

Парадигми програмування

PHP гнучка та динамічна мова, котра підтримує різноманітя технік програмування. Вона значно розвинулася з роками, зокрема додавши солідну об’єктно-орієнтовну модель в PHP 5.0 (2004), анонімні функції та просторові імена в PHP 5.3 (2009), а також трейти в PHP 5.4 (2012).

Об’єктно-орієнтоване програмування

PHP має повний набір особливостей об’єктно-орієнтованого програмування, включаючи підтримку класів, абстрактних класів, інтерфейсів, наслідування, конструкторів, клонування, винятків та ін.

Функціональне програмування

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

Рекурсія - особливіть, котра дозволяє функції викликати саму себе, це підтримується мовою, та більша частина PHP коду фокусується на ітерації.

Нові анонімні функції (з підтримкою для замикань) присутні від PHP 5.3 (2009).

PHP 5.4 добавив нову можливість зв’язувати замикання з областю видимості об’єкта, а також вдосконалено підтримку callables, так що вони можуть бути використані нарівні з анонімними функціями практично у всіх випадках.

Мета програмування

PHP підтримує різноманітні форми мета програмування через такі механізми як Reflection API та Magic Methods. Доступно багато Magic Methods, таких як __get(), __set(), __clone(), __toString(), __invoke(), та ін. що дозволяють розробникам змінювати поведінку класу. Розробники Ruby часто говорять, що PHP бракує method_missing, та він доступний як __call() і __callStatic().

Простори імен

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

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

Це важливо для вас, добавляти ваш код в простори імен, так щоб він міг використовуватися іншими розробниками, без страху зіткнення з іншими бібліотеками.

Один з рекомендованих способів використання просторів імен описаний в PSR-0, котрий призваний забезпечити стандартну домовленість файлів, класів та просторів імен, щоб дозволити файлів для забезпечення plug-and-play коду.

Стандартна бібліотека PHP

Стандартна бібліотека PHP (SPL) постачається з PHP та надає набір класів та інтерфейсів. Вона складається в основному з часто використовуваних класів структури даних (stack, queue, heap, та ін.) та ітераторів, котрі можуть пройти через ці структури даних чи через ваші власні класи, котрі реалізують інтерфейси SPL.

Інтерфейс командної строки

PHP був створений в основному для написання веб додатків, та він також корисний для написання скриптів інтерфейсу командної строки (CLI). PHP програми для командної строки можуть допомогти вам автоматизувати спільні задачі, такі як тестування, розгортання, та адміністрування додатку.

CLI PHP програми дуже потужні, через те, що ви можете використовувати код вашого додатку напряму, без потреби в створенні і забезпеченні безпеки веб-інтерфейсу (GUI) для нього. Тільки впевніться, що ваші CLI PHP скріпти знаходяться в корені вашого веб-серверу.

Спробуйте запустити PHP з консолі:

> php -i

Опція -i відобразить вашу PHP конфігурацію, схоже з функцією phpinfo.

Опція -a забезпечує інтерактивну оболонку, схожу з IRB ruby або інтерактивною оболонкою python. Також є цілий ряд інших корисних опцій командної строки.

Давайте напишемо просту “Hello, $name” CLI програму. Щоб це зробити, створіть файл з іменем hello.php, як показано нижче.

<?php
if($argc != 2) {
    echo "Usage: php hello.php [name].\n";
    exit(1);
}
$name = $argv[1];
echo "Hello, $name\n";

PHP встановлює дві спеціальні змінні, котрі базуються на аргументах, з якими запущений ваш скріпт. $argc - це змінна з числовим значенням, що містить count аргументів та $argv - це масив, що містить значення кожного аргумента. Перший аргумент - завжди імя файлу вашого PHP скріпта, в цьому випадку це hello.php.

Вираз exit() використовується з не нульовим числом, щоб дати оболонці зрозуміти, що команда не вдалася. Часто використовувані коди завершення можна знайти тут

Щоб запустити наш скрипт із командної строки:

> php hello.php
Usage: php hello.php [name]
> php hello.php world
Hello, world

Вверх

Управління залежностями

Є багато PHP бібліотек, фреймворків та компонентів на вибір. Ваш проект буде, швидше за все, використовувати декотрі з них - це і є залежності проекту. Навіть якщо ви управляли ними вручну, вам все одно потрібно було турбуватися про автозавантажувачі. Більше цього не потрібно.

Зараз існує дві основні системи управління пакетами для PHP - Composer і PEAR. Котра з них підходить вам? Відповідь - обидві.

В загальному, пакети Composer будуть доступні тільки у проектах, котрі ви явно вкажете, тоді як пакети PEAR будуть доступні для всіх ваших PHP проектів. На перший погляд, PEAR може здатися більш простим підходом, але є певні переваги в використанні підходу проект-до-проекту для залежностей.

Composer і Packagist

Composer це a прекрасний менеджер залежностей для PHP. Вкажіть перелік залежностей вашого проекту в файлі composer.json і після кількох простих команд, Composer автоматично завантажить залежності вашого проекту і встановить автозавантаження для вас.

Вже існує багато PHP бібліотек, котрі сумісні з Composer, готових до використання у вашому проекті. Перелік цих “пакетів” є на Packagist, офіційному репозиторію для Composer сумісних PHP бібліотек.

Як встановити Composer

Ви можете встановити Composer локально (в вашій теперішній робочій директорії; хоча це більше не рекомендується) або глобально (напр. /usr/local/bin). Припустимо ви хочете встановити Composer локально. З кореневої директорії вашого проекту виконайте:

curl -s http://getcomposer.org/installer | php

Це завантажить composer.phar (двійковий PHP архів). Ви можете запустити його через php для управління залежностями вашого проекту. Зверніть увагу: Якщо ви завантажите код напряму в ваш інтерпретатор, будь ласка, спочатку перечитайте його онлайн, для підтвердження його безпеки.

Як встановити Composer (вручну)

Встановлення Composer вручну - прогресивна техніка; проте, існують різні причини, чому розробник може надати перевагу цьому методу над використанням інтерактивного встановлення. Інтерактивне встановлення перевіряє ваше встановлення PHP, щоб впевнитися, що:

Так як ручне встановлення не виконує жодну з цих перевірок, ви повинні вирішити, чи варто йти на такий компроміс. Нижче описано, як отримати Composer вручну:

curl -s http://getcomposer.org/composer.phar -o $HOME/local/bin/composer
chmod +x $HOME/local/bin/composer

Шлях $HOME/local/bin (або вибрана вами директорія) повинні знаходитися у вашій змінній оточення $PATH. Результатом буде доступність команди composer.

Коли ви прочитаєте документацію до пункту, котрий стверджує, що потрібно запускати Composer як php composer.phar install, ви можете замінити цю команду як:

composer install

Як визначити і встановити залежності

Спочатку створіть файл composer.json в тій же директорії, що і composer.phar. Ось приклад переліку для Twig в якості залежності проекту.

{
    "require": {
        "twig/twig": "1.8.*"
    }
}

Далі запустіть цю команду з кореневої директорії вашого проекту.

php composer.phar install

Це завантажить та встановить залежності проекту в директорію vendors/. Далі добавте цю лінію в основний PHP файл вашого додатку; це вкаже PHP використовувати автозавантажувач Composer для залежностей вашого проекту.

<?php
require 'vendor/autoload.php';

Тепер ви можете використовувати залежносі вашого проекту і вони будуть автоматично завантажуватися по вимозі.

PEAR

Інший ветеран пакетних менеджерів, яким насолоджуються багато PHP розробників це PEAR. Він поводиться практично таким же чином і також заслуговує розгляду для ваших проектів. Читати про PEAR.

Вверх

Практики написання коду

Винятки

Винятки являються стандартною частиною найбільш популярних мов програмування, та вони є часто обділені увагою розробниками PHP. Мови, такі як Ruby, надзвичайно детально обробляють Винятки, тому коли щось йде не так, наприклад HTTP запит не вдається, або запит до бази даних відбувається неправильно, або навіть якщо зображення не може знайтися, Ruby (або gems, котрі використовуються) видадуть виняток на екран, що зразу дозволить зрозуміти, де помилка.

PHP сам по собі, досить слабкий в цьому і виклик file_get_contents() зазвичай видасть вам тільки FALSE та попередження. Багато старіших PHP фреймворків, як CodeIgniter, просто повернуть false, добавлять повідомлення у їх власний журнал та можливо дадуть вам можливість використовувати метод $this->upload->get_error(), щоб глянути, що пішло не так. Проблема в тому, що ви повинні шукати помилку і перевіряти документацію, щоб зрозуміти, який помилковий метод може бути в цьому класі, замість того, щоб зробити все це очевидним.

Ще одна проблема, коли класи автоматично видають помилку на екран і закривають процес. Коли ви робите подібне, ви не даєте можливості другому розробнику динамічно обробити цю помилку. Винятки повинні бути викинуті, щоб дати розробнику знати про помилку, щоб він міг вибрати як її вирішити. Наприклад:

<?php
$email = new Fuel\Email;
$email->subject('My Subject');
$email->body('How the heck are you?');
$email->to('guy@example.com', 'Some Guy');

try
{
    $email->send();
}
catch(Fuel\Email\ValidationFailedException $e)
{
    // Валідація не вдалася
}
catch(Fuel\Email\SendingFailedException $e)
{
    // Драйвер не може відправити повідомлення
}

SPL Винятки

Виняток за замовчуванням не має значення і найбільш поширено надавати значення встановлюючи його назву:

<?php
class ValidationException extends Exception {}

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

Якщо наприклад ви використовуєте магічний метод __call() та був запит на невірний метод, тоді замість видачі стандартного невизначеного винятку, чи створення окремого винятку для цього ви можете просто throw new BadFunctionCallException;

Дата і час

В PHP є вбудований клас з назвою DateTime для допомоги вам коли потрібно прочитати, записати, порівняти чи порахувати дату або час. В PHP є багато функцій, повязаних з датою та часом, окрім DateTime, та клас пропонує хороший об’єктно-орієнтований інтерфейс для вирішення більшості задач. Він може обробляти часові зони, та це за межами цього короткого вступу.

Щоб почати працювати з DateTime конвертуйте необроблену строку дати та часу в об’єкт з допомогою фабричного методу createFromFormat() або виконайте new \DateTime, щоб отримати теперішню дату та час. Використовуйте метод format() для конвертації DateTime назад в строку для виводу.

<?php
$raw = '22. 11. 1968';
$start = \DateTime::createFromFormat('d. m. Y', $raw);

echo "Start date: " . $start->format('m/d/Y') . "\n";

Обчислення з DateTime можливе з використанням класу DateInterval. DateTime містить методи add() та sub(), котрі приймають DateInterval як аргумент. Не пишіть код, котрий очікує однакове число секунд кожного дня, перевід годинника та зміна часових поясів знищать це припущення. Використовуйте замість цього інтервали дат. Для розрахунку різниці між датами використовуйте метод diff(). Він поверне новий DateInterval, котрий дуже легко відобразити.

<?php
// створіть копію $start та добавте 1 місяць і 6 днів
$end = clone $start;
$end->add(new \DateInterval('P1M6D'));

$diff = $end->diff($start);
echo "Difference: " . $diff->format('%m month, %d days (total: %a days)') . "\n";
// Різниця: 1 місяць, 6 днів (всього: 37 днів)

З обєктами DateTime ви можете використовувати стандартні порівняння:

<?php
if($start < $end) {
    echo "Start is before end!\n";
}

Останій приклад для демонстрації класу DatePeriod, що використовується для ітерації повторюваних подій. Він може приймати два об’єкти DateTime, початок і кінець, та інтервал для котрого він поверне всі події між об’єктами.

<?php
// вивід всіх четвергів між $start та $end
$periodInterval = \DateInterval::createFromDateString('first thursday');
$periodIterator = new \DatePeriod($start, $periodInterval, $end, \DatePeriod::EXCLUDE_START_DATE);
foreach($periodIterator as $date)
{
    // вивід кожної дати в періоді
    echo $date->format('m/d/Y') . " ";
}

Дизайни проектування

Коли ви будуєте ваші додатки буде корисним використовувати загальноприйняті шаблони у вашому коді та шаблони для загальної структури вашого проекту. Використовувати прийняті шаблони корисно, тому що це спрощує управліня кодом, а також дозволяє іншим розробникам швидко зрозуміти як все працює.

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

Вверх

Бази даних

Часто ваш PHP код буде використовувати базу даних для збереження інформації. У вас є кілька варіантів для підєднання та взаємодії з базою даних. Рекомендованим варіантом до PHP 5.1.0 було використання рідних драйверів, таких як mysql, mysqli, pgsql, тощо.

Рідні драйвери чудові, якщо ви використовуєте ОДНУ базу даних в вашому додатку, та якщо, для прикладу, ви використовуєте MySQL та трошки MSSQL, або вам потрібно підключитися до бази даних Oracle, тоді ви не зможете використовувати ті ж драйвери. Вам буде потрібно вивчити нове API для кожної бази даних — і це може бути нерозумно.

В якості додаткової замітки про рідні драйвери, розширення MySQL для PHP більше не знаходиться в активній розробці і його офіційним статусом від PHP 5.4.0 являється “Застаріло через довгий час використання”. Це означає він буде видалений на протязі наступних кількох релізів, отож в PHP 5.6 (або у всьому, що вийде після PHP 5.5) воно може пропасти. Якщо ви використовуєте mysql_connect() та mysql_query() у свому додатку, тоді вам прийдеться зіткнутися з переписуванням коду, отож найкращим варіантом буде замінити mysql використанням mysqli або PDO у своїх додатках під час вашого процесу розробки, отож би не стикнетеся з неробочим додатком потім. Якщо ви починаєте з нуля тоді відмовтеся повністю від використання розширення mysql: використовуйте Розширення MySQLi, або PDO.

PDO

PDO це абстрактна бібліотека для підключення до бази даних — вбудована в PHP з версії 5.1.0 — вона забезпечує спільний інтерфейс для спілкування з великою кількістю різних баз даних. PDO не буде перекладати ваші SQL запити чи емулювати відсутні можливості; він чисто для підключення до різноманітних типів баз даних через одне і те ж API.

Більш важливо, що PDO дозволяє вам безпечно вводити дані користувача (напр. IDs) в ваші SQL запити без хвилювання щодо атак на SQL введення. Це можливо, завдяки використанню PDO виразів і звязування параметрів.

Припустиму, що PHP отримує числовий ID в якості параметру запиту. Цей ID повинен бути використаний для отримання запису користувача з бази даних. Ось неправильний шлях це зробити:

<?php
$pdo = new PDO('sqlite:users.db');
$pdo->query("SELECT name FROM users WHERE id = " . $_GET['id']); // <-- NO!

Це жахливий код. Ви вставляєте сирі параметри в SQL запит. Це приведе до взламу вашого коду в секунди. Замість цього ви повинні очистити ввід ID використовуючи звязування параметрів PDO.

<?php
$pdo = new PDO('sqlite:users.db');
$stmt = $pdo->prepare('SELECT name FROM users WHERE id = :id');
$stmt->bindParam(':id', $_GET['id'], PDO::PARAM_INT); //<-- Automatically sanitized by PDO
$stmt->execute();

Ось правильний код. Він використовує звязаний параметр в виразі PDO. Це дозволяє уникнути некоректного користувацького вводу ID перед тим як передати запит в базу даних, запобігаючи потенційні атаки типу SQL ін’єкцій.

Рівні абстракції

Багато фреймворків надають свій власний рівень абстракції, котрий може або не може сидіти поверх PDO. Вони часто будуть емулювати можливості для одної системи бази даних, котрі не має інша, повертаючи ваші запити в PHP методи, даючи вам фактичну абстракцію бази даних. Це звісно, добавить деякі накладні витрати, та якщо ви будуєте портативний додаток, якому потрібно працювати з MySQL, PostgreSQL та SQLite тоді мінімальними накладними витратами можна знехтувати задля чистоти коду.

Деякі рівні абстракції були побудовані з використанням PSR-0 стандарту простору імен, отож можуть бути встановлені в будь який додаток:

Вверх

Безпека

Безпека веб додатків

Є погані люди, котрі готові і хочуть зламати ваші веб додатки. Важливо, щоб ви прийняли необхідні заходи безпеки, щоб укріпити безпеку вашого додатку. На щастя, хороші люди з The Open Web Application Security Project (OWASP) склали повний перелік відомих проблем безпеки і методів захисту від них. Це повинно бути прочитано кожним розробником, котрий переймається безпекою.

Хешування паролю з Bcrypt

В кінці кінців кожен будує PHP додаток, котрий базується на авторизації користувача. Імена користувачів і (хешовані) паролі зберігаються в базі даних і пізніше використовуються для авторизації користувачів під час входу.

Важливо, щоб ви правильно хешували паролі, котрі зберігаються в базі даних. Якщо паролі не хешовані і ваша база даних взламана або до неї отриманий несанкціонований доступ третьої сторони, всі користувацькі облікові записи будуть під загрозою.

Хешовані паролі з Bcrypt. Це дуже просто, і (для всіх запитів та цілей) Bcrypt робить неможливим для кого б це не було, відтворити текстову версію паролю, якщо база даних буде компрометована.

Є кілька бібліотек Bcrypt для PHP, котрі ви можете використовувати.

Фільтрування даних

Ніколи не довіряйте користувацькому вводу, котрий передається вашому PHP коду. Завжди перевіряйте і очищайте користувацький ввід, перед його використанням в коді. Функції filter_var і filter_input можуть очистити текст, а також перевірити відповідність вводу певним форматам тексту (наприклад адрес електронної пошти).

Користувацький ввід може бути будь яким: $_GET і S_POST дані внесені в форму, деякі значення в суперглобальній змінній $_SERVER і тіло HTTP запиту з допомогою fopen('php://input, ‘r’)`. Запам’ятайте, що користувацький ввід не обмежується лише даними форми, відправленої користувачем. Файли котрі відправляються і завантажуються, значення сесій, дані cookie і дані сторонніх веб сервісів, також прирівнюються до користувацького вводу.

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

Дані можуть бути відфільтровані по-різному, в залежності від їх призначення. Наприклад, коли нефільтрований користувацький ввід передається в HTML код сторінки, він може виконати HTML і JavaScript на вашому сайті! Це відомо, як Cross-Site-Scripting (XSS) і може бути дуже небезпечним видом атаки. Один із способів уникнути XSS, полягає в валідації вводу від всіх HTML тегів (їх видаленням чи заміною на HTML символи).

Інший приклад - це передача даних для виконання командною строкою. Це може бути дуже небезпечно (і, як правило, це погана ідея), але ви можете використати вбудовану функцію escapeshellarg для валідації аргументів командної строки.

Останній приклад приймає користувацький ввід, щоб визначити, який файл завантажувати з файлової системи. Це може бути використано, для зміни імені файлу, на шлях файлу. Вам потрібно забрати “/”, “../.” нульові байти або інші символи із шляху файлу так, щоб він не міг завантажувати приховані, непублічні або конфіденційні файли.

Очистка

Очистка видаляє (або екранує) невірні або небезпечні символи із користувацького вводу.

Для прикладу, вам потрібно нормалізувати користувацький ввід, перед підключенням вводу в HTML або його вставкою в сирий запит SQL. Коли ви використовуєте звязані параметри з PDO вони будуть очищати ввід за вас.

Інколи потрібно дозволити деякі небезпечні HTML теги у вводі, включаючи його в HTML сторінку. Це дуже важко зробити і уникнути інших тегів, та це можна зробити, використовуючи обмежене форматування, як наприклад Markdown або BBCode тим не менше бібліотеки з білим переліком, як HTML Purifier існують саме для цього.

Проглянути очищуючі фільтри

Валідація

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

Проглянути фільтри валідації

Файли конфігурації

Коли ви створюєте файли конфігурації для ваших додатків, кращі практики рекомендують використання одного з наступних способів:

Використання глобальних змінних (Register_Globals)

ПРИМІТКА: З введенням PHP 5.4.0 налаштування register_globals було видалено і більше не може бути використана. Це включено тільки як попередження для кожного, хто в процесі оновлення додатку.

При включенні параметру конфігурації register_globals, що робить кілька типів змінних (в тім числі із $_POST, $_GET і $_REQUEST) глобальними, доступними в глобальній області видимості вашого додатку. Це легко може призвести до проблем з безпекою, так як ваш додаток не зможе ефективно визначити звідки прийшли дані.

Для прикладу: $_GET['foo'] буде доступна через $foo, що може переписати змінні які не були оголошені. Якщо ви використовуєте PHP нижче 5.4.0 впевніться що register_globals виключені.

Повідомлення про помилки

Логування помилок може бути корисним, при пошуку проблемних місць вашого додатку, але він також може розпізнати інформацію про структуру вашого додатку. Для ефективного захисту вашого додатку від проблем, котрі можуть бути викликані виводом цих помилок, вам потрібно налаштувати сервер по різному під час розробки і під час режиму продукту(production)(live).

Розробка

Щоб показати помилки в вашому середовищі розробки, сконфігуруйте наступні налаштування у вашому php.ini:

Продукт

Щоб приховати помилки в вашому середовищі продукту, сконфігуруйте ваш php.ini як:

З цими налаштуваннями в виробництві, помилки все одно будуть добавлятися в лог помилок веб-сервера, та не будуть показуватися користувачу. Для отримання додаткової інформації про ці параметри, дивіться керівництво PHP:

Вверх

Тестування

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

Існує кілька різних типів інструментів тестування (або фреймворків) доступних для PHP, що використовують різні підходи - кожен з яких старається уникнути ручного тестування і потреби для великих команд Забезпечення Якості, просто щоб впевнитися, що останні зміни не зламають існуючого функціоналу.

Розробка через тестування

З Wikipedia:

Розробка через тестування (TDD) технологія розробки програмного забезпечення, яка використовує короткі ітерації розробки, що базуються на попередньому написанні тестів, які визначають необхідні покращення або нові функції. Кожна ітерація має на меті розробити код, який пройде ці тести. Нарешті, програміст або група вдосконалюють код для погодження змін. Один із ключових моментів TDD полягає у тому, що підготовка тестів перед написанням самого коду пришвидшує процес внесення змін. Варто зауважити, що розробка через тестування є методологією розробки програмного забезпечення, а не його тестування. Kent Beck, котрому приписується розробка або ‘перевинайдення’ технології, зазначив у 2003 що TDD заохочує прості рішення в дизайні і вселяє впевненість.

Істує кілька різних типів тестування, котрі ви можете застосувати для свого додатку

Модульне тестування

Модульне тестування це програмний підхід, котрий дозволяє впевнитися, що функції, класи та методи працюють як очікувалось, з моменту коли ви збудували їх до завершення циклу розробки. Через перевірку значень, що входять і виходять з різних функцій та методів, ви можете впевнитися, що внутрішня логіка працює правильно. Через використання Впровадження Залежності і будівництво “удаваних” класів та заглушок ви можете перевірити чи залежності правильно використані для навіть кращого покриття тесту.

Коли ви створюєте клас чи функцію ви повинні створити модульний тест для кожної поведінки, яку він/вона повинні мати. На дуже базовому рівні ви повинні впевнитися, що він видає помилку, коли ви відсилаєте йому погані аргументи і впевнитися, що він працює, коли ви відсилаєте вірні аргументи. Це допоможе впевнитися в тому, що коли ви робите зміни до цього класу чи функції пізніше в процесі розробки, старий функціонал продовжить працювати як очікувалося. Єдиною альтернативою цьому буде var_dump() в test.php, котрий ні в якому разі не допоможе побудувати додаток - малий чи великий.

Інше використання модульного тестування це розробка для open source. Якщо ви можете написати тест, котрий показує зламаний функціонал (напр. невдачі), тоді виправте це і покажіть проходження тесту, у патчів набагато більше шансів бути прийнятими. Якщо ви ведете проект, котрий приймає pull запити тоді ви повинні запропонуваи це як обов’язковий критерій.

PHPUnit це тестовий фреймворк де-факто, для написання юніт тестів для PHP додатків, але є кілька альтернатив.

Інтеграційне тестування

From Wikipedia:

Інтеграційне тестування - це фаза тестування програмного забезпечення, під час якої окремі модулі програми комбінуються та тестуються разом, у взаємодії. Інтеграційне тестування виконується після модульного тестування та перед верифікацією та валідацією ПЗ. Якщо розглядати цей процес як систему, то на вхід їй подаються модулі, які вже пройшли модульне тестування; потім модулі групуються в більші частини, виконуються тести передбачені планом, а на виході системи — інтегрована система, що готова до системного тестування.

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

Функціональне тестування

Інколи також відоме як приймально-здавальне тестування, функціональне тестуванняскладається з використання інструментів, для створення автоматизованих тестів, які насправді використовують ваш додаток замість простої перевірки того, що індивідуальні модулі поводяться правильно і, що ці індивідуальні модулі можуть спілкуватися один з одним правильно. Ці інструменти працюють використовуючи зазвичай справжні дані і симулюючи справжніх користувачів додатку.

Інструменти функціонального тестування

Поведінкова розробка

Існує два різні типи поведінкової розробки (BDD): SpecBDD і StoryBDD. SpecBDD фокусується на технічній поведінці коду, а StoryBDD фокусується на бізнес поведінці або поведінці особливості або ітераціях. PHP має фреймворки для обох типів BDD.

З StoryBDD ви можете писати зрозумілі для людей історії, що описують поведінку вашого додатку. Ці історії можуть згодом бути виконані як справжні тести для вашого додатку. Фреймворк, що використовується в PHP додатках для StoryBDD - Behat, котрий взяв натхнення від проекту Ruby Cucumber і імплементував Gherkin DSL для опису поведінки особливостей.

З SpecBDD, ви пишете специфікації, що описують як ваш справжній код повинен поводитися. Замість тестування функції чи методу, ви описуєте як ця функція чи метод повинні поводитися. PHP пропонує фреймворк PHPSpec для цієї мети. Цей фреймворк натхненний проектом RSpec project для Ruby.

BDD посилання

Додаткові інструменти тестування

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

Посилання на інструменти

Вверх

Сервери та розгортання

PHP додатки можуть розгортатися та виконуватися на веб серверах багатьма способами.

Платформа як послуга (PaaS)

PaaS надає системну та мережеву архітектуру, необхідну для запуску PHP додатків в інтернеті. Це означає мінімум конфігурації для запуску PHP додатків чи PHP фреймворків.

Останнім часом PaaS став популярним методом для розгортання, хостингу та масштабування PHP додатків всіх розмірів. Ви можете знайти перелік PHP PaaS “Платформа як послуга” постачальників в нашому розділі ресурсів.

Віртуальні або виділені сервери

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

nginx та PHP-FPM

PHP, через вбудований в PHP FastCGI менеджер процесів (FPM) працює чудово з nginx - легким та високопродуктивним сервером. Він використовує менше пам’яті ніж Apache та може краще справлятися з одночасними процесами. Це особливо важливо на віртуальних серверах, котрі обмежені в кількості оперативної пам’яті.

Apache та PHP

У PHP та Apache довга історія разом. Apache широко конфігурується та має багато доступних модулів для розширення функціоналу. Це популярний вибір для загальних серверів та легкий для встановлення сервер для PHP фреймворків та open source додатків, таких як WordPress. На жаль, Apache використовує більше ресурсів ніж nginx за умовчанням і не може обробляти стільки ж запитів в той же час.

Apache має кілька можливих конфігурацій для запуску PHP. Найбільш поширеною та легкою для встановлення є prefork MPM з mod_php5. Хоч це і не найефективніша конфігурація щодо використання оперативної пам’яті, вона найлегша для встановлення та використання. Це напевне найкращий вибір, якщо ви не хочете заглиблюватися в аспекти серверного адміністрування. Візьміть до уваги, що якщо ви використовуєте mod_php5 ви повинні використовувати prefork MPM.

Альтернативно, якщо ви хочете вижати більше продуктивності з Apache, тоді ви повинні скористатися перевагами цієї ж FPM system як nginx і запустити worker MPM або event MPM з mod_fastcgi або mod_fcgid. Ця конфігурація буде значно більш ефективною в плані використання оперативної пам’яті та значно швидшою, та вона потребує більше роботи для встановлення.

Загальні сервери

PHP завдячує своїй популярності загальним серверам. Важко знайти хостинг без встановленого PHP, та спочатку впевніться, що він останньої версії. Загальні сервери дозволяють вам та іншим розробникам розгортати вебсайти на одному компютері. Хороша сторота тут в тому, що хостинг стає дешевим. Мінус в тому, що ви не знаєте, яке чудовисько ваші сусіди по хосту збираються створити; перевантаження серверу чи відкриття дири безпеки - основні приводи для хвилювання. Якщо бюджет вашого проекту може дозволити виділений сервер, ви повинні скористатися цією можливістю.

Вверх

Кешування

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

Байт кеш

Коли PHP файл виконується, всередині він спочатку компілюється в байт код (також відомий як opcode) і тільки тоді байт код виконується. Якщо PHP файл не модифікується, байткод завжди буде тим самим. Це означає, що компілювання стає розтратою ресурсів CPU.

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

Популярні байт кеші:

Кешування об’єктів

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

Багато з популярних рішень байт кешування дозволяють вам кешувати вибірковід дані також, отож існує навіть більше причин користуватися їх перевагами. APC, XCache та WinCache кожна надає API для збереження даних з вашого PHP коду в їх кеш пам’яті.

Найбільш використовуваними системами кешування об’єктів є APC та memcached. APC це ідеальний вибір для кешування об’єктів, вона включає просте API для додавання ваших власних даних до свого кешу пам’яті і є дуже легкою для встановлення та використання. Одне справжнє обмеження APC це те, що вона прив’язана до сервера, на якому встановлена. Memcached з іншої сторони встановлена як окремий сервіс і може бути доступною через мережу, що означає, що ви можете зберігати об’єкти у гіпершвидкому сховищі даних в центральному розташуванні і багато різних систем можуть витягувати дані з нього.

В мережевій конфігурації APC зазвичай випереджує memcached в плані швидкості доступу, та memcached здатна масштабуватися швидше і ширше. Якщо ви не очікуєте мати багато серверів, котрі будуть запускати ваш додаток, або вам не потрібний екстра функціонал, що пропонує memcached, тоді APC напевне ваш кращий вибір для кешування об’єктів.

Приклад логіки, що використовується APC:

<?php
// check if there is data saved as 'expensive_data' in cache
$data = apc_fetch('expensive_data');
if (!$data)
{
    // data not in cache, do expensive call and save for later use
    $data = get_expensive_data();
    apc_store('expensive_data', $data);
}

print_r($data);

Дізнатися більше про системи кешування об’єктів:

Вверх

Ресурси

З джерела

Люди для фоловінгу в twitter

Менторство

Провайдери PHP PaaS

Вверх

Фреймворки

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

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

Мікро фреймворки по суті є оболонками для маршруту запиту HTTP до зворотнього виклику, контроллер, метод, тощо. і іноді постачаються з декількома додатковими бібліотеками для надання допомоги в розробці оболонки бази даних, та ін. Вони помітно використовуються для побудови віддалених HTTP сервісів.

Багато фреймворків додають значну кількість функцій в додаток до того, що вже доступне в мікро фреймворку, вони відомі як Повні фреймворки. Вони часто приходять в комплекті з ORM, пакетами аутентифікації, тощо.

Компонентно орієнтованими фреймворками є колекції спеціалізованих та вузькоспеціалізованих бібліотек. Нерівноправні компонентні фреймворки можуть бути використані разом, щоб зробити мікро або повний фреймворк.

Вверх

Спільнота

PHP товариство настільки ж різноманітне, як і велике. Його учасники готові підтримати нових PHP програмістів. Ви повинні розглянути можливість приєднання до групи ваших локальних користувачів PHP (PUG) або участь у більших PHP сонференціях, щоб дізнатися більше про кращі практики, показані тут. Ви також можете спілкуватися через IRC в групі #phpc на сервері irc.freenode.com і фоловити @phpc твітер акаунт. Знайомтеся там з новими девелоперами, вчіть нові теми, і перш за все заводьте нових друзів.

Читайте офіційний календар PHP подій

Групи користувачів PHP

Якщо ви живете у великому місті, є великі шанси, що поблизу група користувачів PHP. Хоча є ще не офіційний список МОПСів, ви можете знайти найближчий МОПС за допомогою пошуку в Google чи Meetup.com. Якщо ви живете в маленькому містечку, там може не бути локальної МОПС, якщо так - почніть одну.

Читати про групи користувачів у PHP Wiki

PHP конференції

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

Знайти PHP конференцію

Вверх