Вместо чтения по одной строке за раз, можно прочитеть весь файл как единое целое. Существуют четыре способа выполнения такого считывания.
Первый способ предусматривает использование функции readfile (). Весь приведенный выше сценарий можно заменить одной строкой:
readfile ("$DOCUMENT_ROOT/phpstroy/test/orders.txt");
Обращение к функции readfile () открывает файл, отображает его содержимое в стандартном выводе (окне браузера), а затем закрывает файл. Прототип этой функции readfile () выглядит следующим образом:
int readfile (string filename [, int use_include_path [, resource context] ] );
Необязательный второй параметр use_include_path указывает, должен ли РНР припоиске файла использовать путь, хранящийся в use_include_path, и действует так же, как и функция fopen (). Третий необязательный параметр context используется, только если файл открыт удаленно, например, через HTTP; такое использование этой функции будет рассмотрено отдельно. Функция readfile ()возвращает общее количество байтов, считываемых из файла.
Внесем соответствующие изменения в файл viewordes.php.
$fp = readfile ("$DOCUMENT_ROOT/phpstroy/test/orders.txt");
if (!$fp)
{
echo '<p><strong>Нет ожидающих заказов. '
.'Пожалуйста, попытайтесь позже. </strong></p>';
exit;
}
echo $fp;
В окне веб-браузера это будет выглядеть ТАК.
Второй способ предполагает применение функции fpassthru (). Сначала небходимо открыть файл с помощью функции fopen (). Затем можно передать указатель файла в функцию fpassthru (), которая загрузит содержимое файла, начиная с позиции, заданной указателем, в стандартный вывод. По окончании этой операции функция закрывает файл.
Представленный выше сценарий можно заменить функцией fpassthru () следующим образом:
$fp = fopen ("$DOCUMENT_ROOT/phpstroy/test/orders.txt", 'rb');
echo fpassthru ($fp);
Внесем соответствующие изменения в файл viewordes.php.
В окне веб-браузера это будет выглядеть ТАК.
Функция fpassthru () возвращает true, если чтение прошло успешно, и false —в противном случае.
Третья возможность считывания всего файла предусматривает использование функции file (). Эта функция идентична функции readfile () за исключением того, что вместо отображения файла в стандартном выводе она переобразует его в массив. Более подробно функция будет рассмотрена при изучении массивов. Эту функцию можно вызвать следующим образом:
$filearray = file ("$DOCUMENT_ROOT/phpstroy/test/orders.txt");
Эта строка приведет к считыванию всего файла в массив с именем $filearray. Каждая строка файла сохраняется в отдельном элементе этого массива. Обратите внимание,что эта функция не является безопастной в отношении бинарных файлов.
Начиная с версии РНР 4.3.0, можно воспользоваться функцией file_get_contents (). Эта функция идентична функции readfile () за исключением того, что она возвращает содержимое файла в виде строки вместо того, чтобы выводить его в окнго браузера. Достоинство этой новой функции состоит в том, что она безопастна в отношении бинарных файлов.
Еще одна возможность обработки файлов состоит в чтении из файла по одному символу за раз. Это реализуется с помощью функции fgets (). В качестве своего единственного параметра она принимает указатель файла и возвращает следующий символ из файла. Цикл while в нашем первоначальном сценарии можно заменить циклом, в котором используется функция fgetc ():
while (!feof ($fp))
{
$char = fgetc ($fp);
if (!feof($fp))
echo ($char == "\n" ? '<br>' : $char);
}
C помощью функции fgetc () этот код считывается из файла по одному символу за раз и сохраняет его в переменной $char, пока не будет достигнут конец файла. Затем выполняется небольшая дополнительная обработка с целью замены текстовых символов конца строки \n HTML-разделителями строк <br>.
Это делается лишь для хорошего форматирования. Если попытаться вывести файл в браузере с символами новой строки между записями, весь файл будет представлен в виде одной строки. Веб-браузеры не визуалируют пробельные символы наподобие символов новой строки, поэтому они должны заменяться HTML-дескрипторами, в частности, <br>. Для изящного решения данной задачи используется тернарная операция.
Незначительный побочный эффект использования функции fgetc () вместо функции fgets () заключается в том, что fgetc () бедет возвращать символ EOF, в то время как fgets () этого не делает. После чтения символа приходится снова проверять feof (), поскольку символ EOF в окне браузера отображаться не должен.
В общем случае считывание файла символ за символом не оправдано, если только по какой-либо особой причине нам не потребуется посимвольная обработка файла.
Последний способ чтения из файла предусматривает использование функции fread (), которая читает из файла произвольное количество байт. Эта функция имеет следующий прототип:
string fread (resource fp, int length);
Функция считывает length байт или все байты до конца файла, в зависимости от того, что произойдет дальше.