This page has been robot translated, sorry for typos if any. Original content here.

PHP Session (Файли, директорії і PHP, Робота з файлами)



file_exists
Перш, ніж робити операції з файлом, часто необхідно переконатися, що вказаний файл взагалі існує. Цим і займається функція file_exists. Ця функція може повертати тільки два значення, як ви самі розумієте, TRUE (якщо зазначений файл існує) і FALSE. Зазвичай використання даної функції виглядає так:
if ( !file_exists("somefile.txt") ) exit("Указанный файл не существует");
Зауважте, що функція діє тільки на локальних файлах, тобто якщо ви захочете перевірити, обзавівся чи Яндекс файлом robot.txt, то ваші зусилля будуть марні. Але зате можливо перевірити будь-який файл, що лежить на локальному сервері незалежно від директорії його розташування.

filesize

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


file

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

Крім того, можливо возз'єднання всіх елементів повернутого масиву в одну змінну. Це робиться за допомогою функції роботи з масивами implode. $text_file = implode("", file("somefile"));
echo $text_file;



readfile

Як і попередня функція, readfile виводить зміст зазначеного файлу, а також повертає число символів в файлі (або кількість байт, кому як подобається, так як один символ дорівнює одному байту). Але врахуйте, що на відміну від file, ця функція не передбачає присвоювання прочитаного вмісту файлу змінної. Якщо ви спробуєте це зробити, то змінної присвоїти тільки число прочитаних символів. $bytes = readfile ("somefile");
echo "Итого - ".$bytes." символов";



fopen

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

Функція fopen має кілька режимів роботи з файлом. Вони вказуються після імені файлу і вдають із себе наступні позначення:
    "R" Файл відкривається тільки для читання його вмісту.
    "R +" Відкриття файлу як для читання, так і для запису.
    "W" Файл відкривається з метою запису.
    "W +" Відкрити файл для читання і запису.
    "A" Файл відкривається для запису в кінець файлу (дозаписи).
    "A +" Відкривається для дозаписи і читання.


fgets

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

Зауважте, що функція fgets використовує додатковий параметр length, який вказує максимальну довжину рядка файлу для читання. Якщо обсяг рядка перевищує це число, то функція поверненням її в "урізаному" вигляді обсягом до числа length байт. За замовчуванням цей параметр встановлений в 1024 байт, або в один кілобайт. Тим більше зверніть увагу на цей параметр, якщо ви використовуєте файли великих розмірів, так як при читанні таких файлів може переповниться буфер виконання PHP (його обсяг вказується у файлі конфігурації), що призведе до зависання.



PHP і HTTP: headers



PHP, будучи мовою вебпрограммірованія, підтримує реалізацію механізму відправки заголовків HTTP.

Спочатку скажемо кілька слів про самих HTTP заголовках.

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

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

Механізм відправки HTTP заголовків в PHP.

Механізм відправки заголовків в PHP представлений функцією header (). Особливість протоколу HTTP полягає в тому, що заголовок повинен бути відправлений до посилки інших даних, тому функція повинна бути викликана на самому початку документа і має виглядати наступним чином:
header("HTTP заголовок", необязательный параметр replace);

Опціональний параметр replace може приймати значення типу bool (true або false) і вказує на те, чи повинен бути заміщений попередній заголовок подібного типу, або додати даний заголовок до вже існуючого.

Що стосується функції header () часто застосовується функція headers_sent (), яка як результат повертає true у випадку успішного відправлення заголовка і false у протилежному випадку.

Розглянемо найбільш використовувані HTTP заголовки.

Cache-control.

"Cache-control:" значення

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

Даний заголовок може бути використаний з наступними значеннями:

* No-cashe - Заборона кешування. Використовується в часто оновлюваних сторінках і сторінках з динамічним змістом. Його дейсвтія подібно META тегу "Pragma: no-cache".
* Public - Дозвіл кешування сторінки як локальним клієнтом, так і проксі-сервером.
* Private - Дозвіл кешування тільки локальним клієнтом.
* Max-age - Дозвіл використання кеш документа протягом заданого часу в секундах. header("Cache-control: private, max-age = 3600") /* Кеширование локальными клиентами и использование в течение 1 часа */

Expires.

"Expires:" HTTP-date

Встановлює дату і час, після якого документ вважається застарілим. Дата повинна вказуватися в наступному форматі (англійською мовою):

День тижня (скор.) Число (2 цифри) Місяць (скор.) Рік години: хвилини: секунди GMT

Наприклад, Fri, 09 Jan 2002 12:00:00 GMT

Поточний час в цьому форматі повертає функція gmdate () в наступному вигляді:
echo gmdate("D, d MY H:i:s")."GMT";

Можливе використання даного HTTP заголовка для заборони кешування. Для цього необхідно вказати минулу дату.

Last-Modified.

"Last-Modified:" HTTP-date

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

Можливо зробити сторінку завжди оновленою:
header("Last-Modified: ".gmdate("D, d MY H:i:s")." GMT");

Location.

"Location:" абсолютний URL

Корисний заголовок, який перенаправляє броузер на вказану адресу. Його дія порівнянна з META тегом Refresh:
<META HTTP-EQUIV="Refresh" CONTENT="0; URL=someURL">

Наприклад, цей заголовок може бути використаний так:
if ($login != $admin_login) header("Location: http://www.server.com/login.php");
else header("Location: http://www.server.com/admin.php?login=$login");

if (!headers_sent()) exit("Произошла ошибка! Пройдите <a href='http://www.server.com/login.php'>авторизацию</a> заново");



PHP і HTTP: cookie.



На попередньому уроці ми розібрали взаємозв'язок протоколу HTTP і мови PHP на рівні HTTP заголовків. На цьому уроці ми познайомимося ще з одним специфічним HTTP заголовком - cookie.

Що таке cookies?
Справа в тому, що в процесі розвитку www-технологій і впровадження мов програмування в Інтернет, перед розробниками програм виникла дуже серйозна проблема - як зберігати результати виконання алгоритму для кожного конкретно взятого користувача на довгий час? Сам по собі протокол HTTP не має можливості фіксування результатів програмних процесів. Використання сесій також не є вирішенням проблеми, так як їх дія припиняється відразу після розриву з'єднання з сервером.

Проблема вирішилася з впровадженням механізму cookies (тобто, в перекладі з англійської, - "печиво"). Cookies володіють чудовою властивістю - вони зберігаються на вінчестері користувача і можуть зберігатися там практично необмежений час.

За своєю суттю cookies - це звичайні текстові файли, що зберігаються в спеціальній директорії, використовуваної броузером (зазвичай ця папка називається Temporary Internet Files), і ви можете побачити їх, зайшовши в цю директорію (швидкий доступ до неї для броузера IE здійснюється через пункти меню Сервіс -> Властивості оглядача -> Тимчасові файли Інтернету -> Налаштування -> Перегляд файлів).

Реалізація механізму cookies в PHP.
Реалізація механізму cookies представлена ​​єдиною функцією setcookie (). Як і у випадку з HTTP заголовками, ця функція повинна бути викликана до відправки будь-яких даних віддаленого клієнта, не допускаються навіть "порожні" символи, то є прогалина, символи перекладу рядка і так далі.

Функція має наступний синтаксис:
setcookie(имя куки, значение, срок годности, информация о пути, домен, защищенность)

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

Значенням, яке несе cookie, може бути будь-який рядок ASCII символів. Наприклад, можна встановити cookie з ім'ям і прізвищем відвідувача, які він до цього ввів в поле форми.
$data = $name."||".$surname;
setcookie("username", $data);


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

Cookie, встановлена ​​у вищевказаному прикладі, буде знищена відразу після закриття броузера користувачем, так як за замовчуванням термін життя cookie встановлюється в нуль. Щоб змінити цей порядок, необхідно вказати третій параметр expire. Визначення цього параметра можна зробити двуми способами:

* Поставити отностітельно термін дії за допомогою функції time (), до якої додається час в секундах для зберігання cookie. Наприклад, щоб визначити cookie на дві години необхідно написати: setcookie("test 1", "это тестовая куки", time() + 3600 * 2); // 3600 - количество секунд в часе setcookie("test 1", "это тестовая куки", time() + 3600 * 2); // 3600 - количество секунд в часе

* Другий спосіб - завдання абсолютного терміну закінчення придатності cookie. Він встановлюється за допомогою функції mktime (), яка повертає конкретну дату видалення куки. Якщо необхідно задати термін життя cookie до півночі 1 вересня 2003 року, то слід визначити cookie так: setcooikie("test 2", "куки с абсолютной датой удаления", mktime(0, 0, 0, 9, 1, 2003);

Необов'язковий параметр шляху обмежує область дії cookie в межах певних директорій. Причому в цю область входять всі шляхи, що починаються зі значення в цьому параметрі. наприклад:
setcookie("test 3, "", 0, "/mus");

Ми встановили куку, пропустивши параметри значення і часу і визначивши область дії всіма шляхами, що починаються з рядка "/ mus", тобто сюди входять і директорія "/ music /", і "/ museums /". Щоб однозначно визначити шлях, необхідно завершити шлях слешем. Тобто для обмеження дії куки каталогом "/ mus", необхідно було написати в параметрі "/ mus /".

Наступним опціональним параметром є параметр визначення дії cookie в межах зазначеного домену. Причому значення цього параметра "someserver.com" відповідає тільки сайт з адресою http://someserver.com , а значенням ".someserver.com" відповідають уже і http://someserver.com , і http: //mail.someserver. com , і http://my-someserver.com , тобто всі домени, кінчаються даної рядком.

Останній параметр функції setcookie () вказує на те, що дана cookie повинна бути послана через захищене з'єднання (HTTPS). Цей параметр необхідний при установці cookie з конфіденційної даними.
setcookie("my_cookie", $value, time() + 3600 * 24 * 5, "/", ".myphp.dem.ru", 1);

Читання cookie.
Звернення до встановленої cookie йде через її ім'я. Наприклад, продовжуючи приклад вище, прочитати cookie можна наступним чином:
echo "У вас сохранены следующие данные:<br>";
echo $my_cookie;


Звернення до даних, збереженим в cookie, також може відбуватися через масив $ HTTP_COOKIE_VARS. Він схожий з іншими подібними масивами, такими як $ HTTP_POST_VARS і іншими, і містить всі значення, прочитані з cookie.

Видалення cookie.
Видалення cookie проводиться відправкою нової cookie з ім'ям видаляється без будь-яких додаткових параметрів.

наприклад:
$data = $my_cookie;
setcookie("my_cookie");
echo "Следующие данные были удалены:<br>" . $data;

Регулярні заявки.



Цей урок трохи не вписується в логічний ланцюг наших занять, а був створений "під тиском громадськості", тобто на прохання читачів, і буде присвячений регулярними виразами і функцій роботи з ними. Напевно, мої розрахунки, що статті Олександра Грімаловского "Регулярні вирази" буде досить для розуміння цієї теми, були невірними.

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

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

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

Функції роботи з регулярними виразами.
Необхідно сказати, що PHP своєму розпорядженні як власним механізмом роботи з регулярними виразами (POSIX), так і запозиченим в іншого серверного мови програмування Perl. Зовні їх легко розрізнити по назвах функцій: функції першого типу починаються з символів "ereg", а другого - "preg".

Але назви функцій не єдина їхня відмінність. Перш за все вони містять деякі відмінності в синтаксисі регулярних виразів. Так, Perl-подібні функии вимагають роздільники: $str = "регулярное выражение"; // просто строка
$preg = preg_replace("/р.+е/i", "<i>[вырезано]</i>", $str);
$ereg = eregi_replace("р.+е", "<i>[вырезано]</i>", $str);
echo $preg."<br>".$ereg;
$str = "регулярное выражение"; // просто строка
$preg = preg_replace("/р.+е/i", "<i>[вырезано]</i>", $str);
$ereg = eregi_replace("р.+е", "<i>[вырезано]</i>", $str);
echo $preg."<br>".$ereg;

Як бачите, ми використовуємо функції заміни частині рядка за допомогою регулярних виразів. Зверніть увагу на шаблон функції preg_replace: як роздільник тут виступають слеші, причому після закриваючого роздільника слід модифікатор i, який вказує, що шаблон є нечутливим до регістру. Той же ефект досягається при використанні POSIX функції з суфіксом i (eregi_replace).

Функція preg_replace в нашому прикладі проявила так звану "жадібність", і охопила всю рядок, яка починається з букви "р" і закінчується "е". Змусити функцію не «скупитися" допомагає модифікатор U.

Функція знайшла мінімальну відстань між буквами "р" і "е" і замінило його зазначеної рядком.

Функція eregi_replace також проявила "жадібність", але змінити цей порядок вже не можна, так як в POSIX-функціях не передбачено використання модифікаторів.

Приклади на регулярні вирази.

Переведення часу в стандартний час Unix.

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

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

Найцікавіше - перший етап. Он-то нас і цікавить в плані використання регулярних виразів. $str = "12:57:43 - 10.03.02"; // $str содержит некоторую дату
$str = preg_replace("!(\d{2})\.(\d{2})\.(\d{2})!", "\\2/\\1/\\3", $str);

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

    \\ 0 - містить рядок, відповідну всьому шаблоном (в нашому прикладі "10.03.02").
    \\ 1 - містить символи, відповідні тільки першому елементу, укладеним в дужки (тобто "10").
    \\ 2 - містить символи, відповідні тільки другому елементу, укладеним в дужки (тобто "03").
    і так далі.


На цьому етапі ми отримаємо дату "12:57:43 - 03/10/02". Тепер доводимо це до кінця.
$str = str_replace("-", "", $str); // вырезаем знак "-"
$time = strtotime($str);


Тепер можна використовувати змінну $ time, як заманеться.