Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Котеров Д. В., Костарев А. Ф. - PHP 5. 2-е издание (В подлиннике) - 2008

.pdf
Скачиваний:
6114
Добавлен:
29.02.2016
Размер:
11.36 Mб
Скачать

114

Часть II. Выбор и настройка инструментария

Обращаем ваше внимание на то, что любая директива вида dir=value может быть также указана прямо в командной строке при запуске сервера. Это делается так: --dir=value. Обратное, вообще говоря, верно не обязательно: существуют параметры командной строки, которые не могут быть представлены в виде директив.

Итак, выполните следующие действия:

1.Укажите IP-адрес, на котором MySQL будет ожидать подключения: bind-address=127.0.0.1

Мы рекомендуем использовать только 127.0.0.1, чтобы сервер был доступен лишь с текущей машины (но не из локальной сети). Это позволит обезопасить себя от хакерских атак.

2.Укажите каталог, который MySQL будет использовать для хранения временных файлов (конечно, он должен существовать):

tmpdir=/tmp

3.Укажите путь к каталогу, хранящему файлы различных кодировок: character-sets-dir=/usr/local/mysql/share/charsets

4.Укажите кодировку по умолчанию, используемую при создании всех таблиц: default-character-set=cp1251

Этот параметр очень важен: неверное его значение (в частности, значение, используемое MySQL по умолчанию) приводит к ошибкам при поиске и неправильной сортировке результатов запросов.

5.Укажите основной каталог MySQL, а также папку, где сервер будет хранить свои данные:

basedir = /usr/local/mysql/ datadir = /usr/local/mysql/data/

6.Остальные параметры затрагивают работу с таблицами типа InnoDB, поддерживающими высокую надежность хранения данных и защищенных от аппаратных сбоев. В этой книге работа с такими таблицами не рассматривается, поэтому вы можете пропустить директивы, касающиеся InnoDB.

Вполне вероятно, что сервер запустится и без настройки всех многочисленных параметров — просто на "значениях по умолчанию". Однако в этом случае он просто будет работать неправильно.

Как может выглядеть my.cnf, представлено в листинге 5.5.

Листинг 5.5. Файл /usr/local/mysql/my.cnf

[mysqld]

bind-address=127.0.0.1

tmpdir=/tmp

Глава 5. Установка PHP и MySQL

115

character-sets-dir=/usr/local/mysql/share/charsets default-character-set = cp1251

init-connect = "set names cp1251" skip-character-set-client-handshake basedir = /usr/local/mysql/ datadir = /usr/local/mysql/data/

Запуск и остановка

Для того чтобы запустить MySQL-сервер в фоновом режиме, используется программа Z:\usr\local\mysql\bin\mysqld-max.exe. Конечно, запускать ее отдельно от Apache вряд ли целесообразно, поэтому давайте добавим команду запуска и остановки в файлы /etc/Run.bat и /etc/Stop.bat соответственно.

К сожалению, чтобы корректно запустить MySQL, приходится использовать довольно длинный список параметров (листинг 5.6).

Листинг 5.6. Файл /etc/Run.bat (полная версия)

@echo off

:: Программа для запуска всех серверов: Apache и MySQL. call Boot.bat

Z:

:Установка пути поиска php.ini. set PHPRC=\usr\local\php5

set PATH=%PHPRC%;%PATH%

:Запуск Apache.

cd \usr\local\apache start apache.exe

: Запуск MySQL.

cd \usr\local\mysql\bin

: Следующая команда НА ОДНОЙ СТРОКЕ!

start mysqld-max.exe --defaults-file=\usr\local\mysql\data\my.cnf --user=root --standalone

: Добавьте сюда команды для запуска других серверов

Для завершения работы MySQL применяется утилита mysqladmin.exe. В листинге 5.7 приводится полная версия Stop.bat с применением этой программы.

Листинг 5.7. Файл /etc/Stop.bat (полная версия)

@echo off

:: Программа для остановки всех серверов: Apache и MySQL.

:Остановка Apache. Z:

cd \usr\local\apache

start apache.exe -k shutdown

:Остановка MySQL

cd \usr\local\mysql\bin mysqladmin.exe -u root shutdown

: Добавьте сюда команды для остановки других серверов

116

Часть II. Выбор и настройка инструментария

Учтите, что, в отличие от Apache, при нормальной работе окно MySQL открывается, а через несколько минут закрывается. Тем не менее процесс mysqld-max.exe остается в памяти и продолжает работать. Нажмите комбинацию клавиш <Ctrl>+<Alt>+ +<Del>, чтобы убедиться в этом.

Рекомендуется останавливать MySQL (а заодно и Apache) перед выключением компьютера (при помощи Stop.bat). В противном случае базы данных могут быть повреждены. Впрочем, вероятность этого события весьма мала.

Тестирование MySQL

Давайте теперь проверим, все ли работает. Для начала запустите наш файл /etc/Run.bat, чтобы активизировать сервер. Создайте PHP-сценарий с именем mysql.php в каталоге Z:\home\localhost\www (листинг 5.8).

Листинг 5.8. Файл /home/localhost/www/mysql.php

<?php ## Скрипт для проверки работоспособности MySQL. echo "<pre>";

//Открываем соединение с СУБД MySQL:

//Пользователь: root, пароль: пустой. @mysql_connect("localhost", "root", "")

or die(mysql_error());

//Будем работать с базой данных mysql (существует по

//умолчанию и хранит конфигурацию сервера MySQL). @mysql_select_db("mysql")

or die(mysql_error());

//Выбираем все записи из таблицы users БД mysql.

$r = @mysql_query("SELECT * FROM user") or die(mysql_error());

// В цикле печатаем каждую найденную строку. while ($row = mysql_fetch_assoc($r)) {

print_r($row);

}

?>

Теперь запустите серверы (Apache и MySQL) и наберите в браузере адрес:

http://localhost/mysql.php

Если все сконфигурировано правильно, вы должны получить несколько десятков строк вывода в браузере без сообщений об ошибках. Данный скрипт распечатывает всю информацию о пользователях MySQL, которая хранится в таблице user базы данных с именем mysql.

В пределах СУБД обычно существует несколько именованных баз данных, каждой из которых можно назначить отдельного пользователя с соответствующими правами доступа.

Обратите внимание, что СУБД MySQL запущена на текущей машине, а значит, для соединения с ней нужно указывать адрес сервера localhost. (Собственно, выше мы

Глава 5. Установка PHP и MySQL

117

сконфигурировали СУБД так, чтобы она принимала запросы только с текущей машины.) Пользователь root существует сразу же после инсталляции и получает неограниченный доступ ко всем таблицам и базам данных. При установке MySQL пользователю root не назначается пароль, так что в качестве последнего параметра функции mysql_connect() передается пустая строка.

Для работы с MySQL в PHP 5 необходимо подключение библиотеки расширения php_mysql.dll. В PHP 4 функции для работы с этой СУБД были встроены в ядро.

Отладка и устранение ошибок

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

Отключение межсетевого экрана (firewall)

Многие начинающие пользователи сталкиваются с проблемой при запуске Apache и MySQL: соответствующие процессы находятся в памяти, однако любая попытка обращения к ним (например, из браузера или PHP-скрипта) приводит к неудаче. Это может быть связано с неправильной настройкой межсетевого экрана (другие распространенные названия — firewall, брандмауэр), который блокирует входящие подключения к неизвестным ему портам (Apache присвоен порт 80, MySQL — 3306). Если вы используете брандмауэр стороннего производителя (Outpost, AtGuard, ZoneAlarm и др.), убедитесь, что в его настройках подключения к локальной машине (localhost, 127.0.0.1) разрешены без всяких ограничений.

Просмотр истории обращения к файлам

При запуске Apache и PHP иногда выдаются весьма странные сообщения об ошибках, вроде "Не удается загрузить файл Z:/usr/local/php5/php5apache.dll". При этом доподлинно известно, что данный файл в указанном месте имеется. Как определить, что в реальности происходит?

На сайте http://www.sysinternals.com имеется масса весьма полезных утилит, позволяющих определить, что происходит в системе в данный конкретный момент. Одна из них — File Monitor (файл filemon.exe) — помогает отслеживать, какие программы к каким файлам обращаются и происходят ли при этом ошибки.

Например, запустите File Monitor, а потом сразу же — Apache. В главном окне программы вы увидите массу записей, по одной на каждое обращение к файлу (рис. 5.1). Можно заметить, что Apache вначале считывает необходимые DLL-библиотеки, затем — httpd.conf, а под конец переходит к запуску PHP (если он установлен в виде модуля). На данном этапе и появляется возможность определить, почему не удается загрузить php5apache.dll: соответствующие строки будут помечены как "File not found".

118

Часть II. Выбор и настройка инструментария

 

 

 

 

 

 

Рис. 5.1. Пример сообщений File Monitor

Утилита File Monitor позволяет настроить фильтры, чтобы отслеживать работу не всех приложений, а только некоторых. Например, вы можете указать ей, чтобы слежение велось исключительно за процессом Apache.

На сайте также имеются программы для слежения за сетевой активностью, процессами, открытыми файлами и т. д.

Просмотр заголовков HTTP

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

Но решение проблемы все-таки существует. Вы можете воспользоваться специальной программой — прокси-сервером (сокращенно его часто называют просто "прокси" от англ. proxy — "представитель"), которая выступает в роли посредника между браузером и Apache.

При использовании прокси-сервера сеанс связи происходит так:

1.Браузер посылает запрос (вместе со всеми заголовками) прокси-серверу.

2.Прокси-сервер определяет, на какую машину должен быть отослан этот запрос.

3.Прокси-сервер соединяется с Apache и передает ему заголовки, выданные браузером.

4.Apache выдает результат работы скрипта назад прокси-серверу.

5.Прокси-сервер отправляет то, что ему пришло, в браузер пользователя.

Глава 5. Установка PHP и MySQL

119

Как видите, прокси-сервер имеет полный контроль над всей информацией, идущей от браузера к серверу. Остается лишь найти программу, которая может работать в роли прокси и вести журнал всех прошедших через нее заголовков.

Одна из таких программ — Proxomitron. Она весьма популярна, бесплатна и доступна для свободного скачивания, например, по адресу http://www.proxomitron.info /files/index.shtml.

Хотя развитие программы в настоящий момент приостановлено, вы по-прежнему можете пользоваться работающими версиями Proxomitron.

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

1.В настройках браузера перейдите на вкладку Подключение и нажмите кнопку

Настройка сети.

2.Поставьте флажок Использовать прокси-сервер.

3.Нажмите кнопку Дополнительно и введите адрес прокси, как указано на рис. 5.2.

Рис. 5.2. Настройки прокси-сервера

4.Для того чтобы включить режим просмотра заголовков, щелкните правой кнопкой мыши по пиктограмме Proxomitron на панели задач и выберите в меню пункт Open log window.

120

Часть II. Выбор и настройка инструментария

5.Оставьте окно открытым, перейдите в браузер и откройте любой URL. В окне журнала вы увидите все заголовки запросов и ответов в том виде, в котором они проходят через Proxomitron.

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

Работа с интерактивным отладчиком PHPEd

Отладка (debug, буквальный перевод — "истребление жуков") — это процесс выявления и исправления ошибок (синтаксических и смысловых) в уже написанном коде. Как правило, на отладку уходит до 80% времени работы программиста. В совокупности с тем фактом, что отладка — процесс в высшей степени творческий, требующий изворотливого и динамического ума, не будет преувеличением заявить: программисты в основном только и делают, что отлаживают свои программы. Если вы собираетесь связать свою профессию с программированием, будьте готовы проводить целые часы в погоне за особенно изощренными ошибками, независимо от языка программирования.

Неудивительно, что от грамотно организованного процесса отладки программы зависит ее конечный успех. В самом деле, программист будет работать с гораздо большим энтузиазмом, если то, что он делает, не вызывает отвращения. Нет ничего хуже в программировании, чем чрезмерно усложненная отладка. Представьте, например, что вы сидели за компьютером три дня и написали внушительный объем кода. Вы запускаете его и убеждаетесь (ну конечно же!), что он не работает. (Код вообще почти никогда не работает сразу.) Если процесс отладки затруднен, у вас могут просто опуститься руки, вы разочаруетесь в том, что сделали. И наоборот, если локализовать ошибку легко, вы, воодушевленные, продолжите программировать.

Фраза "у меня нет времени" не является оправданием, дело именно в увлеченности и энтузиазме. Если они есть, то времени хватит на любую задачу. Наоборот, если вас преследует апатия, всегда удобнее покривить душой и списать неудачу проекта на нехватку времени.

Традиционная отладка PHP-сценариев

Очень и очень долго (почти 8 лет!) PHP-программисты имели всего лишь один способ отладки своих сценариев. Он заключался в циклическом выполнении следующей последовательности действий:

1.Программист пишет очередной участок кода скрипта.

2.Затем он запускает скрипт в браузере и смотрит, появились ли сообщения об ошибках.

3.Если ошибки есть, и они носят синтаксический характер (например, пропущена точка с запятой), программист открывает в текстовом редакторе проблемный

Глава 5. Установка PHP и MySQL

121

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

4. Если явных сообщений об ошибках нет, но скрипт работает неправильно, программист начинает думать, где же может "скрываться" ошибка. Он вставляет в программу различные отладочные операторы, вроде phpinfo() (см. гл. 23), print_r($подозрительная_переменная) (см. гл. 9) или просто echo $переменная

(см. гл. 8). После этого работа опять начинается с пункта 2. Программист действует, как говорится, методом "научного тыка" — он проводит эксперименты со своей программой до тех пор, пока не удастся локализовать причину ошибки.

Главное неудобство описанного способа отладки заключено в том, что на момент обнаружения сообщения об ошибке или просмотра отладочных данных скрипт уже завершил свою работу. Фактически, программист наблюдает "остаточный след" некорректной работы скрипта, а не сам скрипт. Этим разработчик походит на физикаэкспериментатора, который вначале взрывает атомную бомбу, а уж потом смотрит, к каким результатам это привело.

Интерактивный отладчик

В то же время, многие старые языки не-Web-программирования (прежде всего это C, Pascal, затем — Java) имеют прекрасные средства для интерактивной отладки программ. При этом программист может вмешиваться в работу программы прямо в середине ее выполнения, просматривать и даже изменять "на ходу" значения переменных, отслеживать историю вызовов функций. Он может также выполнять программу "по шагам" — трассировать ее, наблюдая, как изменяются значения выражений. Люди, всю жизнь работавшие с подобными языками, часто даже не могут понять, как же PHP-программисты умудряются обходиться без интерактивного отладчика — это же так неудобно, так сильно затягивает и без того сложный процесс отладки скриптов!

Что касается Web-программирования, то интерактивная отладка Web-приложений изначально считалась чем-то нетипичным и сложным. Дело тут, конечно, в молниеносной скорости работы большинства сценариев. Если прикладная программа работает минуты и часы, и вы можете экспериментировать, не перезапуская ее, то со скриптами дело обстоит совсем по-другому. Например, скрипты всегда запускаются через браузер, путем указания их URL, а иногда — даже путем нажатия кнопки отправки данных в некоторой форме. "Поймать" в интерактивном отладчике нужное событие, происходящее во время работы скрипта, — задача не из легких. К тому же необходимо помнить, что PHP-скрипт запускается на сервере, а отладка в действительности происходит на машине клиента, и обмен между сервером и клиентом возможен только по сети.

Интерактивная отладка Web-приложений в идеальном случае должна вестись по следующей схеме:

1.Запускаем отладчик.

2.Переходим в интересующий нас участок кода и устанавливаем в нем так называемую точку останова (breakpoint).

3.Открываем браузер.

122

Часть II. Выбор и настройка инструментария

4.Запускаем скрипт (не важно как — через форму или вручную, введя URL).

5.Отладчик "вываливается" на установленной ранее точке останова, пропуская весь код, который идет до этого.

6.Дальше можно трассировать программу по шагам, просматривать переменные и значения выражений, историю вызова функций и т. д.

Во время трассировки промежуточные результаты выдаются все в то же самое окно браузера; также имеется возможность продолжить выполнение скрипта "до конца".

Обратите особое внимание на пункт 4: нам важно, чтобы скрипт запускался непосредственно из браузера — так сказать, в своей "родной и привычной" обстановке. Никакие "эмуляции браузера" (вроде запуска php.exe с параметрами, заставляющими его выполнить скрипт) нам не подходят — это слишком неудобно на практике и запутывает процесс отладки.

Отладчик PHPEd

Мы рады сообщить, что конец 2003 г. — начало 2004 г. ознаменовались крупной победой на фронте интерактивной отладки PHP-приложений. Компания NuSphere наконец-то создала и довела до нормальной степени удобства отладчик PHPEd, не уступающий по своим функциям отладчикам языков C, Pascal и даже Java, и поддерживающий приведенную выше схему. Главная особенность PHPEd для Windows заключается в том, что он позволяет по-настоящему отлаживать скрипты, запущенные непосредственно из браузера (включая те, которые стартуют в ответ на отправку HTML-форм), и в то же время имеет удобные средства для работы сразу с несколькими проектами (например, виртуальными хостами) в рамках одного Web-сервера.

Следует заметить, что попытки создания интерактивного отладчика для PHP ведутся уже довольно давно, в том числе компанией Zend, автором ядра PHP. Тем не менее все полученные результаты нельзя считать законченными и удобными в работе. Например, среда Zend Studio обладает целым списком недостатков и неудобств, возглавляет который неудобный интерфейс.

В мае 2004 г. авторы этой книги протестировали и сравнили около десятка различных отладчиков для PHP, претендующих на звание "интерактивных" (Zend Studio, ActiveState Komodo, PHP Coder, PHPEdit, PHP Expert Editor, PHPEclipse, Svoi.Net PHPEdit и, наконец, NuSphere PHPEd). Полностью приведенной схеме интерактивной отладки удовлетворяет только PHPEd (второй "кандидат" — это Zend Studio).

Настройка PHPEd

Все отладчики для PHP работают по одной и той же схеме и состоят из трех взаимосвязанных компонентов:

серверное ядро отладчика: часть интерпретатора PHP на сервере;

клиентская интерактивная среда разработки: текстовый редактор с поддержкой функций отладчика — например, в нем можно расставлять точки останова, просматривать значения переменных и т. д.;

Глава 5. Установка PHP и MySQL

123

"слушатель" (Listener) отладчика, выступающий в роли "клея" между клиентским и серверным компонентами; помогает им обмениваться данными.

Ядро отладчика

Ядро — это обычная динамическая библиотека (имеет расширение DLL в Windows и SO — в Unix), которую необходимо подключить к интерпретатору PHP (в виде CGI или модуля Apache — не важно). Ядро содержит код для сетевого взаимодействия интерпретатора PHP с клиентской частью отладчика (возможно, запущенной на другой машине). Например, если программист хочет выполнить очередную строку приостановленного сценария, он посылает сетевой запрос ядру отладчика, а оно уж определяет необходимую реакцию. Ядро также передает данные на машину клиента (например, значения затребованных переменных).

В настоящий момент более-менее распространены три отладочных ядра для PHP.

Первое ядро — "оригинального" производства компании Zend.

Название второго — Xdebug. Дистрибутив бесплатен и доступен на сайте http://www.xdebug.com.

Автор третьего отладочного ядра — Дмитрий Дмитриенко из компании NuSphere. Оно называется php_dbg и, по-видимому, получило в настоящий момент наибольшее распространение. PHPEd базируется именно на этом ядре.

Для установки php_dbg необходимо внести изменение в конфигурационный файл PHP php.ini. Далее мы приведем инструкции по настройке Windows-версии php_dbg.

1.Найдите в PHPEd-каталоге DLL-библиотеку php_dbg. Она может содержаться, например, в файле C:\Program Files\Phped\debugger\server\Win32-i686\php_dbg.dll- версия, где версия должна соответствовать версии установленного на сервере интерпретатора PHP (версии не обязательно должны совпадать в точности; как правило, новый PHP корректно работает со старой php_dbg).

2.Скопируйте найденный файл в подкаталог ext основного каталога PHP-ин- терпретатора. В этом же каталоге содержится множество других расширений PHP.

3.Отредактируйте файл php.ini, добавив туда следующие строки:

extension=php_dbg.dll-ВЕРСИЯ

[Debugger]

debugger.enabled=on debugger.profiler_enabled=on

Этим мы, во-первых, подключаем ядро к серверу, а во-вторых, активизируем его.

4.Если PHP работает в виде модуля Apache, перезапустите Web-сервер.

5.Откройте в браузере любой скрипт, содержащий вызов phpinfo() внутри себя (см. листинг 5.4). Убедитесь, что на появившейся странице диагностики присутствует блок, посвященный библиотеке php_dbg.

"Слушатель" отладчика

Данный компонент отладчика устанавливается на клиентской машине и является "парой" для "дружественного" ему ядра. "Слушатель" для php_dbg называется DbgListener.exe.

Тут вы можете оставить комментарий к выбранному абзацу или сообщить об ошибке.

Оставленные комментарии видны всем.