| |
е еще раз посмотрим на предыдущие примеры. Обратите внимание на доселе
не встречавшуюся нам конструкцию or die(). Ее особенно удобно применять как
раз при работе с файлами. Как мы знаем, оператор or имеет очень низкий
приоритет
(даже ниже, чем у =), поэтому в нашем примере всегда выполняется уже после при-
сваивания. Иными словами, первая строчка примера с точки зрения PHP выглядит
так:
($f=fopen("/home/user/file.txt", "r")) or die("Ошибка!");
Глава 15. Работа с файлами 249
Конечно, то, что or обозначает "логическое ИЛИ" в нашем случае не так интересно
(ибо возвращаемое значение просто игнорируется). Нас же сейчас интересует
другое
свойство оператора: выполнять второй свой операнд только в случае ложности
перво-
го. Смотрите: если файл открыть не удалось, fopen() возвращает false, а значит,
осуществляется вызов die() "на другом конце" оператора or.
Заметьте, что нельзя просто так заменить or на, казалось бы равнозначный ему
опе-
ратор ||, потому что последний имеет гораздо более высокий приоритет — выше,
чем у =. Таким образом, в результате вызова функции
$f=fopen("/home/user/file.txt", "r") || die("Ошибка!");
в действительности будет выполнено
$f = (fopen("/home/user/file.txt", "r") || die("Ошибка!"));
Как видите, это не совсем то, что нам нужно.
Безымянные временные файлы
Иногда всем нам приходится работать с временными файлами, которые при завер-
шении программы хотелось бы удалить. При этом нас интересует лишь файловый
дескриптор, а не имя временного файла. Для создания таких объектов в PHP
предусмотрена специальная функция.
int tmpfile()
Создает новый файл с уникальным именем (чтобы другой процесс случайно не по-
считал этот файл "своим") и открывает его на чтение и запись. В дальнейшем вся
работа должна вестись с возвращенным файловым дескриптором, потому что имя
файла недоступно.
Фраза "имя файла недоступно" может породить некоторые сомнения, но это
действительно так по одной-единственной причине: его просто нет. Вот как
такое может произойти? В большинстве систем после открытия файла его имя
можно спокойно удалить из дерева файловой системы, продолжая при этом
работать с "безымянным" файлом через дескриптор, как обычно. При закрытии
этого дескриптора блоки, которые занимает файл на диске, будут автоматиче-
ски помечены как свободные.
Пространство, занимаемое временным файлом, автоматически освобождается при его
закрытии и при завершении работы программы.
Часть IV. Стандартные функции PHP 250
Закрытие файла
После работы файл лучше всего закрыть. На самом деле это делается и автоматиче-
ски при завершении сценария, но лучше все же не искушать судьбу и законы Мэрфи.
Особенно, если вы одновременно открыли десятки (или сотни) файлов.
int fclose(int $fp)
Закрывает файл, открытый предварительно функцией fopen() (или popen() или
fsockopen(), но об этом позже). Возвращает false, если файл закрыть не удалось
(например, что-то с ним случилось или же разорвалась связь с удаленным хостом).
В
противном случае возвращает значение "истина".
Заметьте, что вы должны всегда закрывать FTP- и HTTP-соединения, потому что в
про-
тивном случае "беспризорный" файл приведет к неоправданному простою канала и
из-
лишней загрузке сервера. Кроме того, успешно закрыв соединение, вы будете
уверены в
том, что все данные были доставлены без ошибок.
Особенно своевременное закрытие критично при использовании FTP-файла в
режиме записи, когда вывод программы для ускорения буферизуется. Не за-
крыв файл, вы вообще не сможете быть уверены, что буфер вывода очистил-
ся, а значит, файл записался на удаленную машину верно.
Чтение и запись
Для каждого открытого файла (точнее, для каждого файлового дескриптора, ведь
один и тот же файл может быть открыт несколько раз, т. е. с ним может быть
связано
сразу несколько дескрипторов) система хранит определенную величину, которая на-
зывается текущей позицией ввода-вывода, или указатель файла. Функции чтения и
записи файлов работают именно с этой позицией. А именно, функции чтения читают
блок данных, начиная с этой позиции, а функции записи — записывают, также от-
считывая от нее. Если указатель файла установлен за последним байтом и
осуществляется запись, то файл автоматически увеличивается в размере. Есть
также
|
|