Учебно-методические материалы для студентов кафедры АСОИУ

Серверные приложения. Библиотечные функции PHP

Цель работы

Использование библиотечных функций обработки текста, HTML, массивов и пр.

Задания к работе

Написать скрипт, читающий файл статистики скачиваний (см. ЛР 8) и подсчитывающий количество скачиваний по каждому файлу. Полученную информацию внедрить в страницы вашего сайта возле ссылок на соответствующие файлы (программа, руководство пользователя и прочие файлы в форматах pdf, doc, zip и т.п.).

Указания к работе

Гибкость языка PHP во многом обеспечивается разнообразными библиотечными функциями. Основные библиотеки включены в типовую поставку пакета PHP и всегда доступны, т.е. не требуется подключать модули библиотек и пересобирать PHP. Подробное описание доступных библиотек приведено в руководстве программиста. Здесь приведем описание некоторых библиотечных функций, которые могут понадобиться для выполнения задания лабораторной работы. Прежде чем перейти к этому описанию, приведем задачу к алгоритмическому представлению (на уровне описания шагов алгоритма):

  1. Открыть файл статистики скачиваний
  2. Пока не достигнут конец файла
    1. Прочитать запись из файла
    2. Выделить из записи имя файла
    3. Для этого файла увеличить значение счетчика скачиваний
  3. Закрыть файл
  4. Вывести значение счетчика

По близкой к приведенному алгоритму схеме можно подсчитать количество уникальных скачиваний. Для этого нужно добавить обработку ip-адресов, исключая повторы.

Итак, функции php, которые можно применить для реализации приведенного алгоритма.

Файловые операции

fopen

fopen -- Открывает файл или URL и возвращает дескриптор открытого файла.

Описание

resource fopen ( string filename, string mode [, bool use_include_path [, resource zcontext]] )

Параметр mode указывает тип доступа, который вы запрашиваете у потока. Он может быть одним из следующих:

Список возможных режимов для fopen() используя mode

mode	Описание
'r'	Открывает файл только для чтения; помещает указатель в начало файла.
'r+'	Окрывает файл для чтения и записи; помещяет указатель в начало файла.
'w'	Открывает файл только для записи; помещает указатель в начало файла и обрезает файл до нулевой длинны. Если файл не существует - пробует его создать.
'w+'	Открывает файл для чтения и записи; помещает указатель в начало файла и обрезает файл до нулевой длинны. Если файл не существует - пробует его создать.
'a'	Открывает файл только для записи; помещает указатель в конец файла. Если файл не существует - пытается его создать.
'a+'	Открывает файл для чтения и записи; помещает указатель в конец файла. Если файл не существует - пытается его создать.
'x'	Создаёт и открывает только для записи; помещает указатель в начало файла. Если файл уже существует, вызов fopen() закончится неудачей, вернёт FALSE и выдаст предупреждение уровня E_WARNING. Если файл не существует, попытается его создать. Это эквивалентно указанию флагов O_EXCL|O_CREAT для внутреннего системного вызова open(2). Эта опция поддерживается начиная с версии PHP 4.3.2 и выше, и работает только для локальных файлов.
'x+'	Создаёт и открывает для чтения и записи; помещает указатель в начало файла. Если файл уже существует, вызов fopen() закончится неудачей, вернёт FALSE и выдаст предупреждение уровня E_WARNING. Если файл не существует, попытается его создать. Это эквивалентно указанию флагов O_EXCL|O_CREAT для внутреннего системного вызова open(2). Эта опция поддерживается начиная с версии PHP 4.3.2 и выше, и работает только для локальных файлов.
'b'	Открывает файл в двоичном режиме.

Необязательный третий параметр use_include_path может быть установлен в '1' или TRUE, если вы также хотите провести поиск файла в include_path.

Если открыть файл не удалось, функция вернёт FALSE и сгенерирует ошибку уровня E_WARNING. Вы можете использовать @ для того, чтобы подавить это предупреждение.

Листинг 1. Примеры использования функции fopen()

<?php
$handle = fopen("/home/rasmus/file.txt", "r");
$handle = fopen("/home/rasmus/file.gif", "wb");
$handle = fopen("http://www.example.com/", "r");
$handle = fopen("ftp://user:password@example.com/somefile.txt", "w");
?>

fgets

fgets -- Читает строку из файла

Описание

string fgets ( resource handle [, int length] )

Возвращает строку размером в length - 1 байт, прочитанную из дескриптора файла, на который указывает параметр handle. Чтение заканчивается, когда количество прочитанных байтов достигает length - 1, по достижении конца строки (который включается в возвращаемое значение) или по достижении конца файла (что бы ни встретилось первым). Если длина не указана, по умолчанию ее значение равно 1 килобайту или 1024 байтам.

Указатель на файл должен быть корректным и указывать на файл, успешно открытый функциями fopen() или fsockopen().

В случае возникновения ошибки функция возвращает FALSE.

Листинг 2. Построчное чтение файла

<?php
$handle = fopen("/tmp/inputfile.txt", "r");
while (!feof($handle)) {
$buffer = fgets($handle, 4096);
echo $buffer;
}
fclose($handle);
?>

feof

feof -- Проверяет, достигнут ли конец файла

Описание

bool feof ( resource handle )

Функция возвращает TRUE в случае, когда дескриптор указывает на достижение конца файла или же если произошла ошибка (включая таймаут сокета), иначе возвращает FALSE (см. листинг 2).

fclose

fclose -- Закрывает дескриптор файла

Описание

bool fclose ( resource handle )

Функция закрывает файл, на который указывает handle. Дескриптор должен указывать на файл, открытый ранее с помощью функции fopen() или fsockopen().

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки (см. листинг 2).

file_get_contents

file_get_contents -- Получить содержимое файла в виде одной строки

Описание

string file_get_contents ( string filename [, bool use_include_path [, resource context [, int offset [, int maxlen]]]] )

Содержимое файла возвращается в строке, начиная с указанного смещения offset и до maxlen байтов. В случае неудачи, file_get_contents() вернёт FALSE.

Использование функции file_get_contents() наиболее предпочтительно в случае необходимости получить содержимое файла целиком.

Функции обработки строк

explode
(PHP 3, PHP 4, PHP 5)
explode -- Разбивает строку на подстроки
Описание
array explode ( string separator, string string [, int limit] )
Возвращает массив строк, полученных разбиением строки string с использованием separator в качестве разделителя. Если передан аргумент limit, массив будет содержать максимум limit элементов, при этом последний элемент будет содержать остаток строки string.
Если separator - пустая строка (""), explode() возвращает FALSE. Если separator не содержится в string, то explode() возвращает массив, содержащий один элемент string.
По историческим причинам, функции implode() можно передавать аргументы в любом порядке, но для explode() это недопустимо. separator всегда должен содержать разделитель, а string - исходную строку.
Замечание: Аргумент limit был добавлен в PHP 4.0.1
Пример 1. Примеры применения explode()
<?php
// Пример 1
$pizza = "piece1 piece2 piece3 piece4 piece5 piece6";
$pieces = explode(" ", $pizza);
echo $pieces[0]; // piece1
echo $pieces[1]; // piece2
// Пример 2
$data = "foo:*:1023:1000::/home/foo:/bin/sh";
list($user, $pass, $uid, $gid, $gecos, $home, $shell) = explode(":", $data);
echo $user; // foo
echo $pass; // *
?>
strstr
(PHP 3, PHP 4, PHP 5)
strstr -- Находит первое вхождение подстроки
Описание
string strstr ( string haystack, string needle )
Возвращает подстроку строки haystack начиная с первого вхождения needle до конца строки.
Если подстрока needle не найдена, возвращает FALSE.
Если needle не является строкой, он приводится к целому и трактуется как код символа.
Замечание: Эта функция учитывает регистр символов. Для поиска без учета регистра используйте stristr().
Пример 1. Пример использования strstr()
<?php
$email = 'user@example.com';
$domain = strstr($email, '@');
echo $domain; // выводит @example.com
?>
Замечание: Если нужно лишь определить, встречается ли подстрока needle в haystack, используйте функцию strpos(), которая работает быстрее и потребляет меньше памяти.
С версии PHP 4.3.0 strstr() безопасна для обработки данных в двоичной форме.
См. также описание функций ereg(), preg_match(), stristr(), strpos(), strrchr() и substr().
substr
(PHP 3, PHP 4, PHP 5)
substr -- Возвращает подстроку
Описание
string substr ( string string, int start [, int length] )
substr() возвращает подстроку строки string длиной length, начинающегося с start символа по счету.
Если start неотрицателен, возвращаемая подстрока начинается в позиции start от начала строки, считая от нуля. Например, в строке 'abcdef', в позиции 0 находится символ 'a', в позиции 2 - символ 'c', и т.д.
Пример 1. Пример использования substr()
<?php
$rest = substr("abcdef", 1); // возвращает "bcdef"
$rest = substr("abcdef", 1, 3); // возвращает "bcd"
$rest = substr("abcdef", 0, 4); // возвращает "abcd"
$rest = substr("abcdef", 0, 8); // возвращает "abcdef"
// к отдельным символам можно обращаться с помощью фигурных скобок
$string = 'abcdef';
echo $string{0}; // выводит a
echo $string{3}; // выводит d
?>
Если start отрицательный, возвращаемая подстрока начинается с start символа с конца строки string.
Пример 2. Использование отрицательного start
<?php
$rest = substr("abcdef", -1); // возвращает "f"
$rest = substr("abcdef", -2); // возвращает "ef"
$rest = substr("abcdef", -3, 1); // возвращает "d"
?>
Если length положительный, возвращаемая строка будет не длиннее length символов. Если длина строки string меньше или равна start символов, возвращается FALSE.
Если length отрицательный, то будет отброшено указанное этим аргументом число символов с конца строки string. Если при этом позиция начала подстроки, определяемая аргументом start, находится в отброшенной части строки, возвращается пустая строка.
Пример 3. Использование отрицательного length
<?php
$rest = substr("abcdef", 0, -1); // возвращает "abcde"
$rest = substr("abcdef", 2, -1); // возвращает "cde"
$rest = substr("abcdef", 4, -4); // возвращает ""
$rest = substr("abcdef", -3, -1); // возвращает "de"
?>
См. также описание функций strrchr(), substr_replace(), ereg(), trim() и mb_substr().

Многобайтовые строки

PHP поддерживает работу с многобайтовыми кодировками (в частности, UTF-8). Для них имеется отдельная библиотека mbstring. В этой библиотеке имеются аналоги обычных строковых функций, адаптированные для многобайтовых строк.

Функции обработки регулярных выражений

Весьма полезными при обработке строк являются функции для работы с регулярными выражениями. PHP поддерживает POSIX- и PERL-совместимый синтаксис синтаксис regex. Для этого используются библиотеки "Regular Expression Functions (POSIX Extended)" и "Функции для работы с регулярными выражениями (Perl-совместимые)"

Рекомендации к выполнению задания

Поставленная задача подсчета скачиваний с помощью php-скрипта может быть решена различными способами. Так, возможно построчное чтение из файла, как это описано выше. Другой способ, более удобный, сводится к считыванию файла целиком и преобразованию содержимого в массив путем разбиения на подстроки. Затем полученный массив можно анализировать с помощью библиотечных функций для работы с массивами.

CC-BY-SA Анатольев А.Г., 09.06.2022