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

Самоучитель по PHP 4

.pdf
Скачиваний:
61
Добавлен:
02.05.2014
Размер:
4.36 Mб
Скачать

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

101

{echo "Не могу соединиться с базой ".DBName."!<br>"; echo mysql_error();

exit;

}

mysql_select_db(DBName);

//Создаем таблицу t. Если такая таблица уже есть,

//сообщение об ошибке будет подавлено, т. к.

//используется "@"

@mysql_query("create table t(id int, a text)");

//Вставляем в таблицу 10 записей for($i=0; $i<10; $i++)

{ $id=time();

mysql_query("insert into t(id, a) values($id, 'Ñòð$i!')");

}

//Выводим все записи

$r=mysql_query("select * from t"); for($i=0; $i<mysql_num_rows($r); $i++)

{$f=mysql_fetch_array($r); echo "$f[id] -> $f[a]<br>\n";

}

?>

Теперь наберите в браузере:

http://localhost/mysql.php

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

Обращаю ваше внимание на константы DBName, HostName, UserName и Password. DBName должен содержать имя базы данных (в нашем случае это test — база данных, которая создается MySQL по умолчанию). HostName — всегда localhost, ведь мы работаем на локальном компьютере. В макросе UserName проще всего подставлять root, который является владельцем всех таблиц. При установке MySQL пользователю root не назначается пароль, так что константа Password равна пустой строке.

ЧАСТЬ III.

ОСНОВЫ ЯЗЫКА PHP

Глава 6

Характеристика языка PHP

Дочитав до этого места, вы уже должны проникнуться мыслью, что писать сценарии на Си, мягко говоря, неудобно. (Если подобного ощущения у вас нет, значит, я плохо написал первую часть и ее придется переделывать…).

Так на чем же писать? Многие тут же ответят: "Конечно, на том, на чем обычно пишут сценарии — на Perl!". Да, это распространенная точка зрения. Однако у Perl, наряду с его неоспоримыми достоинствами, существуют и недостатки. Причем недостатки весьма серьезные. Вот один из них: Perl не приспособлен непосредственно для программирования сценариев. Это в некотором роде универсальный язык, поэтому он не поддерживает напрямую того, чего бы нам хотелось. А вот и второй: у Perl синтаксис не способствует читабельности программы. Он не похож ни на Си, ни на Паскаль (а эти языки замечательно зарекомендовали себя как самодокументирующиеся). Вообще, я сам принадлежу к той категории людей, которые очень болезненно воспринимают непродуманный синтаксис языка программирования, отсюда и мое отноше-

ние к Perl...

PHP — язык, специально нацеленный на работу в Интернете, язык с универсальным (правда, за некоторыми оговорками) и ясным синтаксисом, удивительно похожим на Си, сочетающий достоинства Perl и Си. И хотя этот язык еще довольно молодой, он (точнее, его интерпретатор) установлен уже на порядка миллиона серверов по всему миру, и цифра продолжает расти. Новое поколение PHP — четвертое — должно вообще стереть все преимущества Perl перед PHP, как с точки зрения быстродействия обработки программ (а третья версия PHP сильно отставала от Perl при обработке больших циклов), так и с точки зрения синтаксиса. Наконец, большинство PHPсценариев (особенно не очень больших размеров) работают быстрее аналогичных им программ, написанных на Perl (конечно, если сравнивать с обычными Perlсценариями, а не программами, запускаемыми под управлением mod_perl).

Думаю, у PHP есть лишь один серьезный недостаток, который менее выражен у Perl: это — его медлительность при работе с большими и сложными сценариями. Однако работы по преодолению этой трудности давно ведутся и, если верить разработчикам PHP, версия 4 является уже компилятором, построенным примерно на том же принципе, что и компилятор Perl. Давайте поговорим на последнюю тему чуть подробнее.

106

Часть III. Основы языка PHP

Интерпретатор или компилятор?

Возможно, вы уже слышали, что PHP версии 4, в отличие от своего предшественника, является компилятором. Так вот, это не совсем так. Во избежание разногласий в терминах давайте определимся, что мы будем называть компилятором, а что — интерпретатором. Если быть до конца откровенными, компиляторами очень часто и незаслуженно называют программы, которые на самом-то деле являются интерпретирующими трансляторами, т. е., по своей главной функции — интерпретаторами. Так обстоит дело и с PHP версии 4.

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

Давайте посмотрим, как работает PHP версии 4. Получая на свой вход исходный код программы, он в первую очередь анализирует его (в частности, проверяет синтаксис)

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

Итак, мы видим, что PHP составлен из двух почти независимых блоков — транслятора и интерпретатора. Зачем же понадобилось так делать? Конечно, из соображений быстродействия. Посудите сами: синтаксический разбор осуществляется всего один раз на этапе трансляции, а исполняется уже "полуфабрикат" — байт-код, который гораздо более удобен для этих целей.

Пусть, например, в программе есть цикл с большим числом итераций. PHP версии 3, в котором отсутствует фаза трансляции, вынужден перед исполнением очередной итерации заново анализировать ее код, проводить строковый разбор, проверку синтаксиса и т. д. В то же время PHP версии 4 делает это только один раз (при трансляции кода программы), и на каждой итерации цикла занимается лишь исполнением готового байт-кода. Выигрыш очевиден, не правда ли?

Язык Perl, который практически всегда называют компилятором, работает точ- но по такой же схеме он транслирует текст программы во внутреннее пред- ставление, а затем использует результирующий код при исполнении. Так что,

Глава 6. Характеристика языка PHP

107

можно сказать, PHP версии 4 представляет собой компилятор ровно настоль- ко, насколько им является Perl.

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

Как вы видите, PHP версии 4 коренным образом отличается от своего предшественника — PHP версии 3. Фактически, весь код программы в очередной раз был переписан заново. При этом возникла серьезная проблема с переносимостью программ: не так-то легко обеспечить совместимость классического интерпретатора с новым транслирующим блоком (вообще, трансляторы по своей природе ограничивают свободу действий, зато привносят быстродействие). Тем не менее, разработчики PHP блестяще справились с проблемой: практически любая программа, работающая на PHP версии 3 и не использующая недокументированных возможностей языка, будет работать и на четвертой версии.

Что же такое PHP? Как мы выяснили, уж точно не компилятор, т. к. не имеет ни малейшего отношения к машинному коду. И, конечно же, не транслятор в чистом виде — ведь оттранслированный байт-код нельзя ни сохранить в файле, ни использовать повторно. В то же время, главной фазой работы PHP является интерпретация внутреннего представления программы и ее исполнение. Именно эта фаза и занимает больше всего времени в серьезных сценариях. Итак, мы вынуждены заключить, что PHP является интерпретатором с встроенным блоком трансляции, оптимизирующим ход интерпретации.

Я уже предвижу, что множество читателей не согласятся с такой формулиров- кой. Конечно, слово "компилятор" звучит солиднее, чем какой-то там "интер- претирующий транслятор". Но все дело в том, что английское слово compiler переводится не только как "компилятор", но также и как "транслятор". Заду- майтесь над этим, если окончательно решили для себя считать PHP и Perl компиляторами.

108

Часть III. Основы языка PHP

Достоинства и недостатки интерпретатора

Если вы — бывший системщик или прикладной программист и не знакомы с языком Perl, довольно непросто будет привыкнуть к тому, что PHP, как и большинство языков для Web, является интерпретатором (правда, как мы уже говорили, с транслирующим оптимизатором).

Что ж, это так. Да, сценарии, написанные на PHP, работают в тысячи раз медленнее, чем Си-программы (но почти с такой же скоростью, как созданные на Perl — может быть, отстают максимум в несколько раз на особо критических участках), и к этому придется привыкнуть. Например, если мы напишем на Си пустой цикл с миллионом итераций примерно такого вида:

for(long i=0; i<1000000; i++);

то он будет работать всего долю секунды, в то время как аналогичный цикл на PHP:

for($i=0; $i<1000000; $i++);

проработает на процессоре Pentium 100 несколько секунд.

Приведенные оценки, особенно сравнения с Perl, касаются только PHP версии 4, но не версии 3. Последний отстает даже от Perl по быстродействию почти в 100 раз. Так что стоит задуматься, допустимо ли вообще применять PHP вер- сии 3 при написании нетривиальных программ.

Однако для сценариев, не содержащих в себе таких громадных циклов (а таких программ, как мы вскоре увидим, большинство), время работы будет отличаться очень несущественно. Ну, в самом деле, какая разница, работает ли сценарий 0,01 секунды или 0,1 секунды, если передача данных по каналам Интернета через модем будет длиться, например, 5 секунд?

Впрочем, тут все-таки есть стимул стараться по возможности ускорить сцена- рий: если на вашей машине размещены сотни виртуальных хостов, способных работать с PHP, и каждый из них весьма популярен у пользователей Интерне- та, то суммарный проигрыш в быстродействии может быть вполне ощутим. В этом случае придется просто отказаться от PHP и перейти на более быстрый (но и более сложный) язык например, Си или Java.

"А как же быть, — спросят некоторые, — если нам нужно написать сценарий для работы, скажем, с тысячами и десятками тысяч пользователей, адреса и телефоны которых хранятся в файле? Ведь, чтобы найти какого-то пользователя (особенно, если его имя задано не точно), придется просматривать их всех, а это как раз и будет цикл с огромным количеством итераций?" Да, это действительно так. Если нужно обраба-

Глава 6. Характеристика языка PHP

109

тывать очень большие массивы данных, лучше использовать Си или... базу данных. База данных — это набор очень большого числа записей с одинаковой структурой плюс программное обеспечение для быстрого поиска, добавления и удаления записей (чаще всего написанного как раз на Си). PHP поддерживает работу с очень большим числом разнообразных баз данных, поэтому написание сценариев с применением баз данных не должно вызвать особых проблем. Кстати, и выполняться такие скрипты будут быстрее, чем аналогичные им "самодельные", написанные на Си — ведь разработкой баз данных и эффективных алгоритмов работы с ними занималось множество людей. А в PHP останется лишь вызвать нужную функцию (например, поиск в базе данных) и сразу получить результат — многие базы данных даже умеют нужным образом его отсортировать и вообще выполнить всю "грязную работу"...

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

r Упрощается обнаружение ошибок во время выполнения программы. В случае сбоя интерпретатор сразу же выведет сообщение, что что-то не так.

r Можно не заботиться об освобождении выделенной памяти. Интерпретатор сам определит, когда та или иная переменная в программе уже не используется, и освободит память, выделенную для нее.

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

rНе нужно думать о типах переменных (как это, кстати, было сделано в приведенном цикле for). Мы еще вернемся к данному вопросу в дальнейшем.

Есть и другие достоинства. Вообще, использование интерпретатора способно дать сценариям ту мощь, которую пользователи Web от них и ожидают.

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

Пример PHP-программы

Традиционно, любая книга начинается с программы "Hello world!". Что ж, не буду отходить от этих канонов и приведу сразу два примера такой программы. Вот первый из них:

<?

110

Часть III. Основы языка PHP

echo "Hello world!"; ?>

Запустим сценарий в браузере. Легко убедиться, что он действительно работает, да к тому же еще и безотказно.

Это замечание предназначено для тех, кто еще совершенно не знаком с син- таксисом языка PHP. Итак, возможно, вы немного смущены словами "запустим сценарий в браузере". Дело в том, что PHP-сценарий по своей природе не- сколько отличается от обычных CGI-сценариев, которые мы рассматривали в первой части этой книги. Но не торопитесь. Следующий пример поставит все точки над "i".

Для тех, кто еще не сталкивался с синтаксисом PHP, более интересен пример второй программы. Вот как он выглядит:

<body> Hello world! </body>

Что — думаете, произошла ошибка и редактор вместо примера кода на PHP случайно вставил в текст пример HTML-страницы? А вот и нет. Да-да, вы не ошиблись — тут действительно нет вообще никаких операторов PHP, и содержимое файла с "программой" состоит целиком из статического текста.

Что же происходит? Выходит, обычный HTML-текст также правильно обрабатывается PHP? Да, это так. Но рассмотрим чуть более сложный пример (листинг 6.1).

Листинг 6.1. Простой сценарий на PHP

<html><body> <h1>Здравствуйте!</h1> <?

//Вычисляем текущую дату в формате "день.месяц год" $dat=date("d.m y");

//Вычисляем текущее время

$tm=date("h:i:s");

# Выводим их

echo "Текущая дата: $dat года<br>\n"; echo "Текущее время: $tm<br>\n";

# Выводим цифры

echo "А вот квадраты и кубы первых 5 натуральных чисел:<br>\n"; for($i=1; $i<=5; $i++)

{echo "<li>$i в квадрате = ".($i*$i); echo ", $i в кубе = ".($i*$i*$i)."\n";