Анимация
JavaScript
|
Главная Библионтека PostMail($User[email],"file:mail.txt",$User[encode]); ?> Этот код довольно красноречиво показывает, что работать с нашей новой функцией PostMail() очень просто. Большая его часть занимается не отправкой писем, а разбором записей в базе данных. Так как переменные $User и $News - глобальные, то не нужно предпринимать никаких дополнительных действий, чтобы использовать их в шаблоне письма. На этом мы завершим рассмотрение возможностей PHP по отправке электронной почты и разбору шаблонов писем. Я не затронул здесь тему, касающуюся включения в письма так называемых attachmentов (или "вложенных файлов"), потому что в формате писем, содержащих "вложения", довольно легко запутаться. Любознательный читатель всегда сможет добавить в модуль Mail.phl функции, позволяющие удобно работать с "вложениями". Для того чтобы разобраться с форматом таких писем, можно даже не искать соответствующую документацию: достаточно просто посмотреть на исходный текст письма, сгенерированного какой-нибудь почтовой программой, и уловить закономерности размещения заголовков и блоков текста. Разные советы В этой небольшой завершающей главе сведены воедино некоторые советы и приемы программирования сценариев, которым не было удалено достаточного внимания в остальных главах книги. Разделенные вычисления Большинство хостинг-провайдеров ставят ограничения на то время, в течение которого могут выполняться сценарии пользователя. Иными словами, если выполнение программы занимает более определенного времени (например, 10 секунд), она прерывается принудительным образом. Минимальный квант времени задается в файле конфигурации php.ini. Как правило, его хватает для большинства программ, но все же существуют Web-приложения, требующие длительной работы. Одним из таких приложений является автоматически генерируемая карта сервера. Она может представлять собой обычный сценарий на PHP, который рекурсивно обходит все каталоги сервера и собирает информацию о файлах, которые в них находятся. Конечно, если сайт велик, кванта времени, отведенного хостинг-провайдером, может и не хватить. Кроме того, не очень вежливо заставлять пользователя ждать загрузки страницы карты сервера дольше нескольких секунд. Как же быть, если описанный сценарий нужен для вашего сайта? Для этого следует формировать карту не при каждом запросе, а лишь изредка, - ведь новые страницы добавляются на сервер довольно редко. Гораздо реже, чем, например, их загружают пользователи. Кроме того, наверное, пользователь не будет особенно недоволен, если изменение на карте сервера проявится не сразу же, а спустя некоторое время - например, час. Главное для него, чтобы карта была всегда перед глазами, а значит, отображалась быстро. Мы можем хранить уже "просчитанную" карту сервера в файле, быстро выдавая его пользователю при запросе. Но даже если мы собираемся обновлять этот файл всего лишь один раз в час (при очередном запросе карты пользователем), мы наталкиваемся на проблему нехватки кванта времени, выделенного хостинг-провайдером. Чтобы решить и эту проблему, придется разбить построение большой карты на множество мелких этапов, каждый из которых занимает, скажем, не более 2-х секунд. Каждый такой этап должен запускаться при очередном обращении пользователя к карте сервера, но уже после того, как содержимое временного файла с "просчитанной" картой будет отправлено пользователю. Таким образом, мы постепенно будем накапливать сведения и, как только весь сайт обработан, перестроим карту во временном файле. В ближайший час будет отображаться именно она. Напишем функцию WalkSite(), которая будет заниматься поиском и обработкой файлов на каждом этапе обхода сайта. Листинг 33.1 содержит код библиотеки, в которой описана эта функция. Чтобы не "привязываться" к специфике конкретной задачи, сделаем функцию универсальной. Будем передавать ей имя процедуры-обработчика, умеющего "вытаскивать" из указанного файла всю информацию, необходимую для построения карты (например, название страницы, ее размер и т. д.), сама же WalkSite() будет просто вызывать этот обработчик в нужный момент времени, следя за тем, чтобы квант времени, отведенный на данный этап построения карты, не истек. Если это произойдет, текущее состояние обхода сервера (включая всю собранную информацию) будет сохранено в специальном файле, а при следующем запуске - восстановлено, с тем чтобы обход продолжился с того же места, где он завершился в прошлый раз. i Листинг 33.1. Библиотека для обхода дерева сайта: siteWalker .phi <? Функция выполняет один этап обхода всех каталогов и файлов сайта. Если обход нужно продолжить, загружается предыдущее состояние из файла $cache. Если этого файла не существует, значит, необходимо начать новый обход, начиная с каталога $Root. Этап будет длиться не более $time секунд ( если 0, то за один раз обрабатывается ровно один файл или каталог). Для каждого обнаруженного файла или каталога вызывается функция, имя которой передано в $Func. Формат функции: function FWalker(string $fname, array &$Result) Эта функция должна обрабатывать найденный файл $fname соответствующим образом и добавлять данные в массив $Result ( в любом формате). Состояние массива $Result будет автоматически сохранено сразу по истечении кванта времени и восстановлено перед началом нового этапа. Возвращает true, если процесс не был закончен на этом этапе, и false, если только что были обработаны последние файлы на сервере. function WalkSite($Root,$Func,$cache,$time,&$Result) { $Start=time(); Состояние в самом начале работы. Нужно обработать корневой каталог $Root. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 [ 164 ] 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 |