Дочитал Гамму.
Сейчас читаю
Шлосснейгл Джордж
Профессиональное программирование на PHP
М.: Издательский дом "Вильямс", 2006, 624 стр.
Практическое руководство по разработке крупномасштабных Web-сайтов и приложений с помощью PHP 5
George Schlossnagle
Advanced PHP Programming. A practical guide to developing large-scale Web-sites and applications with PHP 5, 2004
Перевод с английского и редакция В. А. Швеца.
12 ..... Содержание
12 ..... Благодарности
13 ..... От издательства
13 ..... К сведению читателей
14 ..... Предисловие
15 ..... Введение
15 ..... PHP на предприятии
16 ..... Структура и организация книги
20 ..... Платформы и версии
21 ..... Часть 1. Методики реализации и разработки
23 ..... Глава 1. Стили кодирования
24 ..... Выбор правильного стиля
24 ..... Форматирование и компоновка кода
24 ..... Введение отступов
26 ..... Длина строки
27 ..... Использование пустого пространства
27 ..... SQL-директивы
28 ..... Управляющие конструкции
32 ..... Именование
34 ..... Константы и глобальные переменные
35 ..... Долговременные переменные
36 ..... Временные переменные
36 ..... Имена переменных из нескольких слов
37 ..... Имена функций
37 ..... Имена классов
38 ..... Имена методов
38 ..... Согласованность имен
38 ..... Соответствие имен переменных именам полей в базе данных
39 ..... Предотвращение запутанности кода
39 ..... Избегайте коротких открывающих тегов
40 ..... Не используйте оператор echo для вывода HTML-кода
40 ..... Разумное использование круглых скобок
41 ..... Документация
42 ..... Внутренние комментарии
42 ..... API-документация
47 ..... Дополнительная литература
49 ..... Глава 2. Объектно-ориентированное программирование с использованием типовых проектов
50 ..... Введение в ОО-программирование
52 ..... Наследование
52 ..... Инкапсуляция
53 ..... Статические (или классовые) атрибуты и методы
54 ..... Специальные методы
55 ..... Краткое введение в типовые проекты
56 ..... Проект Adaptor
60 ..... Проект Template
61 ..... Полиморфизм
63 ..... Интерфейсы и контроль типов
66 ..... Проект Factory
67 ..... Проект Singleton
69 ..... Переопределение
74 ..... SPL и итераторы
79 ..... __call()
81 ..... __autoload()
82 ..... Дополнительная литература
83 ..... Глава 3. Обработка ошибок
85 ..... Обработка ошибок
86 ..... Отображение ошибок
87 ..... Протоколирование ошибок
88 ..... Игнорирование ошибок
89 ..... Обработка ошибок
90 ..... Обработка внешних ошибок
92 ..... Исключения
96 ..... Использование иерархии исключений
97 ..... Пример типизированных исключений
102 .... Каскадные исключения
105 .... Обработка сбоя конструктора
106 .... Установка обработчика исключений верхнего уровня
108 .... Проверка корректности данных
112 .... Когда использовать исключения
113 .... Дополнительная литература
115 .... Глава 4. Реализация средствами PHP: шаблоны и Web
116 .... Smarty
127 .... Создание собственного решения на базе шаблонов
129 .... Дополнительная литература
131 .... Глава 5. Реализация средствами PHP: автономные сценарии
132 .... Введение в интерфейс командной строки PHP
133 .... Обработка ввода-вывода (I/O)
135 .... Разбор аргументов командной строки
138 .... Создание и управление дочерними процессами
145 .... Написание демонов
148 .... Объединение полученных знаний: службы мониторинга
156 .... Дополнительная литература
159 .... Глава 6. Блочное тестирование
160 .... Введение в блочное тестирование
163 .... Написание блочных тестов внутри и вне кода программ
168 .... Дополнительные функции в PHPUnit
168 .... Создание более информативных сообщений об ошибках
170 .... Добавление новых тестовых условий
171 .... Использование методов setUp() и tearDown()
172 .... Добавление слушателей
173 .... Использование графических интерфейсов
174 .... Разработка на основе тестов
184 .... Блочное тестирование в Web-среде
186 .... Дополнительная литература
187 .... Глава 7. Управление средой разработки
188 .... Контроль изменений
204 .... Управление пакетами
205 .... Создание пакетов и размещение кода
208 .... Создание пакетов бинарных файлов
208 .... Комплектация Apache
209 .... Комплектация PHP
210 .... Дополнительная литература
211 .... Глава 8. Проектирование API-интерфейса
212 .... Проектирование, обеспечивающее рефакторинг и расширяемость
212 .... Инкапсуляция логики в функциях
214 .... Сохранение простоты классов и функций
214 .... Именование
216 .... Сокращение связности
217 .... Безопасное программирование
217 .... Учреждение стандартных соглашений
218 .... Использование методик очистки данных
220 .... Дополнительная литература
221 .... Часть 2. Кэширование
223 .... Глава 9. Поверхностная настройка производительности
223 .... Варианты языковой настройки
224 .... Программы кэширования промежуточного кода
227 .... Оптимизаторы
228 .... HTTP-акселераторы
229 .... Обратные прокси-серверы
233 .... Настройка операционной системы для достижения высокой производительности
234 .... Кэширующие прокси-серверы
234 .... PHP-приложения с поддержкой кэш-памяти
239 .... Сжатие содержимого страниц
240 .... Дополнительная литература
243 .... Глава 10. Кэширование данных
244 .... Проблемы кэширования
245 .... Определение кэшируемых компонентов данных
246 .... Выбор стратегии: созданные вручную или серийные классы
246 .... Буферизация вывода
248 .... Кэширование в памяти
256 .... DBM-кэширование
262 .... Кэширование на основе общей памяти
263 .... Кэширование на основе cookie-файлов
268 .... Интеграция кэширования в код приложения
284 .... Дополнительная литература
285 .... Глава 11. Повторное использование вычислений
285 .... Вводный пример: последовательности Фибоначчи
291 .... Кэширование повторно используемых данных внутри запроса
293 .... Кэширование повторно используемых данных между запросами
296 .... Повторное использование вычислений внутри PHP
297 .... PCRE-функции
297 .... Количество элементов массива и длина строки
298 .... Дополнительная литература
299 .... Часть 3. Распределенные приложения
301 .... Глава 12. Взаимодействие с базами данных
302 .... Принципы действия баз данных и запросов
308 .... Модели доступа к базам данных
309 .... Узкоспециальные запросы
309 .... Модель активной записи
312 .... Модель преобразователя
317 .... Модель интегрированного преобразователя
318 .... Настройка доступа к базе данных
319 .... Ограничение результирующего множества данных
320 .... Отложенная инициация
323 .... Дополнительная литература
325 .... Глава 13. Аутентификация пользователей и безопасность сеансов
326 .... Простые схемы аутентификации
327 .... Базовая аутентификация средствами HTTP
328 .... Модификация строки запроса
328 .... cookie-файлы
329 .... Регистрация пользователей
330 .... Защита паролей
332 .... Защита паролей с учетом социотехники
333 .... Поддержка аутентификации: персонификация пользователей
341 .... Единая регистрация
344 .... Реализация единой регистрации
348 .... Дополнительная литература
351 .... Глава 14. Поддержка сеансов
352 .... Клиентские сеансы
353 .... Реализация сеансов с помощью cookie-файлов
356 .... Более надежная реализация сеансов
356 .... Серверные сеансы
358 .... Отслеживание идентификатора сеанса
360 .... Кратко о расширении PHP Sessions
362 .... Нестандартные методы обработки сеансов
367 .... Уборка мусора
369 .... Выбор между клиентскими и серверными сеансами
371 .... Глава 15. Создание распределенной среды
371 .... Что такое кластер?
374 .... Основы кластерных конструкций
380 .... Кэширование в распределенной среде
387 .... Масштабирование баз данных
395 .... Дополнительная литература
397 .... Глава 16. RPC: взаимодействие с удаленными службами
398 .... XML-RPC
406 .... SOAP
408 .... WDSL
416 .... Сравнение SOAP и XML-RPC
416 .... Дополнительная литература
419 .... Часть 4. Производительность
421 .... Глава 17. Оценка производительности: тестирование приложения в целом
422 .... Пассивный поиск "бутылочных горлышек"
424 .... Генераторы нагрузки
429 .... Дополнительная литература
431 .... Глава 18. Профилирование
432 .... Необходимые свойства PHP-профайлера
432 .... Многообразие профайлеров
433 .... Установка и использование APD
435 .... Пример трассировки
437 .... Профилирование более крупного приложения
442 .... Выявление общей неэффективности
444 .... Удаление излишней функциональности
448 .... Дополнительная литература
451 .... Глава 19. Сравнительное тестирование производительности: оценка блоков кода и функций
453 .... Основы эталонного тестирования
453 .... Создание эталонной тестовой нагрузки
454 .... PEAR-комплект для эталонного тестирования
464 .... Примеры эталонных тестов
473 .... Часть 5. Расширяемость
475 .... Глава 20. Устройство PHP и Zend Engine
476 .... Как работает Zend Engine: коды операций и операционные массивы
482 .... Переменные
485 .... Функции
487 .... Классы
488 .... Обработчики объектов
489 .... Создание объектов
489 .... Другие важные структуры
491 .... Жизненный цикл запроса в PHP
493 .... SAPI-уровень
495 .... Ядро PHP
495 .... API-интерфейс PHP-расширений
496 .... API-интерфейс Zend-расширений
498 .... Согласованность всех элементов
500 .... Дополнительная литература
501 .... Глава 21. Расширение PHP: часть 1
502 .... Основы создания расширений
533 .... Пример: клиентская оболочка для Spread-службы
543 .... Дополнительная литература
545 .... Глава 22. Расширение PHP: часть 2
545 .... Реализация классов
546 .... Создание нового класса
547 .... Добавление свойств класса
549 .... Наследование классов
550 .... Добавление методов класса
552 .... Добавление конструкторов класса
553 .... Генерирование исключений
554 .... Использование нестандартных объектов и частных переменных
557 .... Использование Factory-методов
557 .... Создание и реализация интерфейсов
559 .... Написание нестандартных обработчиков сеансов
563 .... API потоков
573 .... Дополнительная литература
575 .... Глава 23. Написание SAPI-интерфейсов и расширение Zend Engine
575 .... SAPI-интерфейсы
576 .... CGI SAPI
576 .... Встраиваемый SAPI-интерфейс
576 .... Входные фильтры SAPI
591 .... Модификация и анализ Zend Engine
592 .... Предупреждения как исключения
594 .... Opcode Dumper
597 .... APD
598 .... APC
598 .... Использование обратных вызовов Zend-расширений
601 .... Домашнее задание
603 .... Предметный указатель
612 .... Реклама
Цитаты:
стр. 47 стр. 59 стр. 120 стр. 121 стр. 132 стр. 133 стр. 145 стр. 155 стр. 217 стр. 219 стр. 297 стр. 428 стр. 431 стр. 432 стр. 454 стр. 465 стр. 586 стр. 47
Руководство по стилю Java - интересный материал для всех, кто намеревается создавать стандарты кодирования. Официальное руководство по стилю Sun доступно на странице
http://javs.sun.com/docs/codeconv/html/CodeConvTOC.doc.html стр. 59
Версии MySQL до 4.1 не предоставляли отдельный интерфейс для подготовки запросов перед выполнением и не допускали использования bind SQL. Однако передача всех переменных данных в процесс по отдельности обеспечивает удобное пространство для перехвата переменных и их экранирования до того, как они будут вставлены в запрос.
...
...
foreach ($this->binds as $ph => $pv) {
$query = str_replace(":$ph", "'".mysql_escape_string($pv)."'", $query);
}
...
стр. 120
Оба предыдущих примера гораздо длиннее чистой PHP-версии:
...
Это не редкость. Решение на основе шаблонов всегда содержит больше кода, чем решение без шаблонов. Абстракция всегда занимает пространство. Идея систем шаблонов заключается не в сокращении базы кода, а в разделении логики
стр. 121
Следует помнить: схема MVC не предназначена для удаления все логики из представления, а только из внешнего представления логики предметной области (или бизнес-логики). Различить логику представления и бизнес-логику не всегда просто.
стр. 132
В своей превосходной книге "The Pragmatic Programmer: From Journeyman to Master" Дэвид Томас (David Thomas) и Эндрю Хант (Andrew Hunt) говорят о том, что все профессиональные программисты изучают (как минимум) один язык в год.
стр. 133
В интерфейсе командной строки (command-line interface, CLI) PHP специальные дескрипторы файлов доступны с помощью следующих констант:
* STDIN;
* STDOUT;
* STDERR.
Использование этих констант идентично открытию соответствующих потоков вручную. (Если используется версия PHP CGI, то это необходимо делать вручную). Потоки открываются явно с помощью таких вызовов:
$stdin = fopen ("PHP://stdin", "r");
$stdout = fopen ("PHP://stdout", "w");
$stderr = fopen ("PHP://stderr", "w");
стр. 145
Другими распространенными сигналами, для которых могут понадобиться обработчики, являются SIGHUP, SIGUSR1, SIGUSR2.
...
Вместо того, чтобы игнорировать эти три сигнала, их обычно используют для отправки процессам простых команд - например, заново считать конфигурационный файл, заново открыть log-файл или вывести информацию о состоянии.
стр. 155
Данный конструктор использует класс ReflectionClass для диагностики классов служб и программ протоколирования перед тем, как пользователь попытается создать соответствующие им объекты. Это хорошо демонстрирует новый API-интерфейс Reflection в PHP 5. Reflection API предоставляет классы для диагностики почти любого внутреннего объекта (класса, метода или функции) в PHP.
стр. 217
Вопросы безопасного программирования не ограничиваются только предотвращением атак. Большинство ошибок возникает из-за халатности и ложных предположений. Чтобы гарантировать, что другие разработчики используют код правильно, программисту необходимо убедиться, что он написан с соблюдением стандартов по порядку аргументов и возвращаемых значений. Некоторые программисты возражают, что при наличии полной документации порядок аргументов не имеет значения. Это неверно. Необходимость обращения к руководству или к собственной документации каждый раз при использовании какой-либо функции замедляет разработку и повышает вероятность появления ошибок.
Ярчайшим примером несогласованного именования аргументов являются клиентские API-интерфейсы PHP для доступа к базам данных MySQL и PostgreSQL. Ниже приведены прототипы функций запросов для обеих библиотек.
resource mysql_query ( string query [, resource connection])
resource pg_query ( resource connection, string query)
стр. 219
Если нет реальной необходимости в открытии удаленных файлов, то следует устанавливать директиву allow_url_fopen = Off в файле php.ini.
...
Майкл Радвин (Michael Radwin) в своем рассказе "One Year of PHP at Yahoo!" предлагает полностью избегать URL-вызовов функции fopen() и вместо этого использовать расширение curl, которое поставляется с PHP. Это гарантирует, что удаленные ресурсы открываются только по замыслу разработчика.
стр. 297
Когда выполняется код, подобный приведенному ниже, PHP-интерпретатор не просматривает массив $array и не считает количество его элементов:
$array = array('a','b','c',1,2,3);
$size = count($array);
Вместо этого по мере добавления объектов в массив $array увеличивается внутренний счетчик. Если элементы удаляются из массива, то счетчик уменьшается.
...
Если для переменной вызывается функция strlen(), то она просто возвращает заранее вычисленное значение. Такое кэширование фактически также важно для обработки двоичных данных, поскольку базовая C-функция strlen() (которую имитирует PHP-функция strlen()) небезопасна в использовании с двоичными данными.
стр. 428
Программа Daiquiri - генератор Web-нагрузки, распознающий и воспроизводящий Apache-журналы в общем формате.
...
Программа Daiquiri, написанная Тео Шлосснейглом (Theo Schlossnagle), доступна на сайте www.omniti.com/~jesus/projects
стр. 431
Программные приложения, как правило, гораздо сложнее автомобильного двигателя, но, несмотря на это, часто даже опытные разработчики предпочитают "угадывать" причины недостатка производительности.
стр. 432
Мнение о том, что критические участки кода можно определить, полагаясь только на интуицию, не что иное, как самонадеянность. Так же как не вызывает доверия механик, утверждающий, что без тестирования знает причину неэффективной работы двигателя, или врач, который заявляет, что без анализов знает причину всех болезней пациента, не вызывает доверия программист, утверждающий, что знает причину замедления приложения, но не профилирует код.
стр. 454
Benchmark_Iterate запускает функцию в пустом цикле, записывает время начала и конца каждого прогона и обеспечивает средства доступа для получения сводной информации по результатам тестирования.
стр. 465
Почему функция substr так проигрывает в скорости strncmp? substr должна выделить память и записать свое возвращаемое значение, а затем выполнить сравнение, тогда как strncmp просто посимвольно сравнивает строки. Несмотря на то что PHP скрывает все подробности управления памятью, затраты на выделение памяти остаются. В ходе множества итераций затраты на выделение 6 байт для результата суммируются.
стр. 586
... атаки с помощью межсайтовых сценариев и атаки с использованием SQL-кода. Несмотря на то, что они проявляются по-разному, оба вида атак предполагают случайное выполнение Web-приложением (или в случае межсайтовых сценариев - пользователем) злонамеренного кода в пространстве приложения.
Решение для защиты от подобных атак простое: необходимо проверять и беспощадно очищать любые данные, вводимые пользователем. Ответственность за процесс очистки лежит на создателе PHP-сценария, но оставлять эту проблему разработчику сценария нежелательно по двум причинам.
* Разработчики иногда допускают ошибки. Межсайтовые сценарии являются чрезвычайно серьезной проблемой безопасности, и не достаточно полагаться на то, что все, кто причастен к разработке PHP-кода, предпримут корректные меры безопасности.
* Очистка всех данных в PHP при каждом запросе может оказаться медленным процессом.