Статья Мартина Стрейчера, технического директора McClatchy Interactive наглядно показывает, как на Ubuntu быстро запустить WEB-сервер и начать программировать на PHP.
1. Скачал iso-образ, поставил на VMware Workstation 6.5.3 build-185404. При создании виртуальной машины мастер VMWare запросил имя и пароль для нового пользователя (не root). Запустил форматировать виртуальный диск и забыл про виртуалку, занявшись другими делами. Через полчаса с удивлением обнаружил, что готовая Ubuntu уже загрузилась и выдала промт для логина. Залогинился и получил рабочий стол с каки-то бешеным разрешением экрана. Подрегулировал его на привычные 1024x768 и стал оглядываться по сторонам.
2. Первая непривычная засада оказалась с тем, что я не знал, как залогиниться под root. Оказалось, что вчистую залогиниться под root теперь невозможно. Однако можно получить права root, если ввести команду sudo, а в ответ на запрос пароля ввести свой собственный. Подсказку по этому нововведению дает приглашение консоли: "To run a command as administrator (user "root"), use "sudo ". See "man sudo_root" for details.". Короче, чтобы запустить любую команду/программу с правами root, вводят эту команду с префиксом sudo, а если хотят получить интерактивный root shell, то вводят sudo -i. По умолчанию только пользователь, который инсталлировал Ubuntu (то есть тот аккаунт, за которым я сейчас работаю), имеет права получать административные права через sudo, но можно создавать специальным образом других пользователей с такими же привилегиями (описано как). Там же (man sudo_root) написано, как вс е вернуть на круги своя (но это не рекомендуется). Таким образом, первый пользователь теперь "заменяет" рута, но с требованием вводить свой пароль. Какой в этом смысл, не очень понятно. Получить консоль root можно так (в ответ на запрос пароля вводим собственный):
$ sudo su -
# whoami
root
Чтобы выйти из режима суперпользователя, нажмите Ctrl+D.
Свой любимый Midnight Commander тоже поставил командой apt-get install mc, тока он у меня в черно-белой консоли Ubuntu оказался нефункционален. В putty на хостовой машине результат был лучше, но надо было еще разобраться с кракозябрами в псевдографике бордюров. Поставил также пакет ssh, но уже с помощью System -> Administration -> Synaptic Package Manager.
При попытке установить русскую раскладку (System -> Preferences -> Keyboard) получил ошибку X - сервера.
3. Кроме Apache существуют и другие Web-серверы для Linux, например, lighttpd (произносится как "лайти") — маленький и быстрый сервер, который проще в настройке, чем Apache. Устанавливаем lighttpd под Ubuntu (должно быть подключение к Интернету):
# apt-get install lighttpd
Как ни странно, больше ничего делать не надо - все само поставится и сервер сразу заработает. Запустив Firefox с адресом http://127.0.0.1/, увидим страничку, свидетельствующую о том, что lighttpd работает. На хостовой машине этот сервер тоже доступен по адресу http://192.168.58.128/:
user>nmap 192.168.58.128
...
Interesting ports on 192.168.58.128:
Not shown: 1031 closed ports
PORT STATE SERVICE
80/tcp open http
MAC Address: 00:0C:29:F8:04:AA (Unknown)
Nmap done: 1 IP address (1 host up) scanned in 2.34 seconds
4. Ставим MySQL 5, тоже всего одной командой apt:
# apt-get install mysql-server-5.0
Процедура будет идти несколько дольше (так как пакет требует для себя около 112 мегабайт).
Правда, по окончании установки почему-то не запустился мастер и не запросил установки пароля для "MySQL root". Пришлось искать в Интернете, как это делать см. [1]. Когда делаем это первый раз, то так:
$ mysqladmin -u root password NEWPASSWORD
Если надо поменять уже установленный пароль, то так:
$ mysqladmin -u root -p'oldpassword' password newpass
например:
$ mysqladmin -u root -p'abc' password '123456'
Запуск утилиты MySQL и вывод списка баз данных:
$ mysql -u root -p
Enter your password: s0m3p@ssWoRD
mysql> show databases \G
Database: information_schema
Database: mysql
2 rows in set (0.01 sec)
mysql> quit
5. Установка языка программирования PHP 5. Так как lighttpd использует для выполнения Web-приложений FastCGI (Fast Common Gateway Interface – быстрый обобщенный интерфейс шлюзов), важно установить правильную разновидность PHP, которая доступна в apt как php5-cgi. Чтобы PHP мог работать с MySQL, также необходимо установить соответствующий модуль php5-mysql:
# apt-get install php5-cgi php5-mysql php5-gd
Настройка взаимодействия Web-сервера и языка программирования. Теперь, прежде чем можно будет создавать PHP-приложение, требуется только одно действие – правильно настроить взаимодействие lighttpd и PHP. Нажмите Control-D для выхода из режима суперпользователя, а затем введите следующую команду:
$ sudo gedit /etc/php5/cgi/php.ini
Запустится простой текстовой редактор gedit, похожий на Блокнот из Windows или Text Editor из Mac, и в режиме суперпользователя откроется для редактирования файл /etc/php5/cgi/php.ini. Так как этот файл является системным, то для его изменения необходимы права root. В окне gedit прокрутите текст вниз и найдите такую строку:
Измените ее на следующую строку:
Для сохранения изменений выберите File > Save или нажмите Control-S. Для выхода нажмите Control-Q. Далее выполните команду:
$ sudo gedit /etc/lighttpd/lighttpd.conf
Найдите строку, начинающуюся с server.modules=, и добавьте через запятую mod_fastcgi к списку опций в скобках. mod_fastcgi наделяет lighttpd поддержкой PHP в режиме FastCGi. Запросы, поступающие от браузера, принимаются lighttpd, который преобразует их в запросы FastCGI и перенаправляет PHP-модулю. Когда PHP-приложение отсылает ответ, происходит обратный процесс. Обновленный список должен выглядеть как в листинге 2, за исключением, быть может, наличия других модулей.
Листинг 2. Обновленный список в параметре server.modules
server.modules = (
"mod_fastcgi",
"mod_access",
"mod_alias",
"mod_accesslog",
"mod_compress"
)
Теперь перейдите к концу файла и добавьте следующий параметр, приведенный в листинге 3.
Листинг 3. Параметр, заставляющий lighttpd использовать FastCGI-разновидность PHP и правильный сокет.
fastcgi.server = (
".php" => ((
"bin-path" => "/usr/bin/php-cgi",
"socket" => "/tmp/php.socket"
)))
Приведенный параметр указывает lighttpd местоположение запускаемого файла PHP и файла сетевого соединения (сокета), через которое Web-сервер будет обмениваться данными с PHP. Сохраните редактируемый файл и выйдите из редактора. После изменения настроек lighttpd необходимо перезапустить, что делается командой sudo /etc/init.d/lighttpd restart.
$ sudo /etc/init.d/lighttpd restart
Stopping web server lighttpd [OK]
Starting web server lighttpd [OK]
Теперь вы можете приступить к написанию своего первого (и второго) PHP-приложения.
6. Ваше первое (а также второе) PHP-приложение
Как было сказано ранее, PHP очень популярен среди языков программирования для Web за счет своей простоты и удобства встраивания в обычный HTML-код (Hypertext Markup Language, язык гипертекстовой разметки). HTML-теги выглядят как и , а PHP-код встраивается в него внутри тегов < ?php ?>.
[Первая PHP-программа]
Итак, самая простая PHP-программа может выглядеть примерно так, как показано в листинге 4.
Листинг 4. Пример простой PHP-программы
< html>
< head>< title>Hello, World!
< body>
< h1>< ?php echo 'Hello, World! ?>
Для запуска этой программы откройте редактор gedit командой sudo gedit /var/www/hello.php и напечатайте приведенный код. Сохраните файл, перейдите к FireFox и введите в адресной строке http://127.0.0.1/hello.php . Вы должны увидеть страницу, сходную с изображенной на рисунке 4. Если это так, то lighttpd и PHP работают правильно.
Рисунок 4. Результат работы PHP-программы "Hello, World!", выданный lighttpd
[Вторая PHP-программа]
А теперь перейдем к написанию более сложного примера, в котором мы соберем воедино все компоненты LAMP, а база данных MySQL будет хранить некую информацию. Предлагаю создать программу, отображающую всех сотрудников Superheroes, Inc. – аутсорсинговой компании, предоставляющей услуги супергероев. Для этого необходимо проделать следующие шаги:
- Спроектировать и создать базу данных, содержащую таблицу со списком сотрудников.
- Наполнить таблицу некоей информацией.
- Написать PHP-код, соединяющийся с базой данных и выводящий список на Web-странице.
Создание и наполнение базы данных
Приведенный в листинге 5 фрагмент кода, представляющий собой SQL-скрипт, делает следующее:
- Создает базу данных с именем superheroes.
- Создает таблицу с именем members внутри базы данных superheroes.
- Добавляет в таблицу members четыре записи.
- Создает в MySQL пользователя hero и наделяет его правами на чтение и изменение нашей базы данных.
Листинг 5. SQL-скрипт для создания и наполнения базы данных superheroes
DROP DATABASE IF EXISTS `superheroes`;
CREATE DATABASE `superheroes`;
USE `superheroes`;
DROP TABLE IF EXISTS `members`;
CREATE TABLE `members` (
`id` int(11) NOT NULL,
`name` varchar(128) NOT NULL,
`city` varchar(128) NOT NULL,
`superpower` varchar(128) NOT NULL,
`initiated` date NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`),
KEY `name` (`name`)
) ENGINE=MyISAM;
INSERT INTO `members`
(`id`, `name`, `city`, `superpower`, `initiated`)
VALUES
(1,'Бэтмен','Готэм-сити','Детективные способности','1939-05-01'),
(2,'Человек-паук','Нью-Йорк','Паутины','1962-08-01'),
(3,'Красный дьявол','Нью-Йорк, Hell\'s Kitchen','Радиолокация','1964-04-01'),
(4,'Супермен','Метрополис','Сила','1938-06-01');
GRANT ALL ON `superheroes`.*
TO 'hero'@'localhost' IDENTIFIED BY 'shizzle';
Как правило, во избежание неразберихи для каждого Web-приложения создают свою базу данных MySQL и используют уникальную учетную запись для доступа. Также никогда не используйте в приложении учетную запись root MySQL, так как неправильное поведение программы может привести к потере всех данных. На практике обычно создают в MySQL другого суперпользователя, а пользователя root удаляют.
Как и раньше, создайте с помощью gedit файл, вставьте в него приведенный фрагмент кода и сохраните под именем superheroes.sql. Далее используйте утилиту командной строки mysql для запуска скрипта. Так как пользователь hero еще не создан, придется выполнить скрипт от MySQL-пользователя root:
$ mysql -uroot -p < superheroes.sql
Enter password:
Введите ваш пароль для MySQL-пользователя root и нажмите Enter. Чтобы увидеть результат, соединитесь с базой данной уже от имени hero и выведите содержимое таблицы, которое показано в листинге 6.
Листинг 6. База данных Superheroes
$ mysql -uhero -pshizzle superheroes
mysql> select * from members;
-----+----------------+----------------+-------------------------+-------------
| id | name | city | superpower | initiated |
-----+----------------+----------------+-------------------------+-------------
| 1 | Бэтмен | Готэм-сити | Детективные способности | 1939-05-01 |
| 2 | Человек-паук | Нью-Йорк | Паутины | 1962-08-01 |
| 3 | Красный дьявол | Нью-Йорк, | Радиолокация | 1964-04-01 |
| | | Hell's Kitchen | | |
| 4 | Супермен | Метрополис | Сила | 1938-06-01 |
-----+-----------------+---------------+-------------------------+-------------
4 rows in set (0.00 sec)
Отлично! База данных готова.
Создание Web-страницы
В листинге 7 приведен PHP-код, используемый в нашей Web-странице.
Листинг 7. PHP-код для создания страницы Superheroes, Inc.
< html>
< head>
< title>
Сотрудники Superheroes, Inc.
< body>
< ?php
if ( ! ( $connection = mysql_connect("localhost", "hero", "shizzle" ) ) )
{
die( 'Возникла ошибка. Проверьте сетевые настройки.' );
}
if ( !mysql_select_db( "superheroes", $connection ) )
{
die( 'Возникла ошибка. Проверьте базу данных и права доступа.' );
}
$query = "select * from members order by name";
if ( ! ( $result = mysql_query( $query, $connection ) ) )
{
die( 'Возникла ошибка. ' . mysql_error() );
}
?>
< table>< tr>< th>Имя< th>Сверхъестественные способности
< th>Город
< ?php
while ($row = mysql_fetch_assoc($result))
{
?> < tr>< td>
< ?php
echo $row{'name'};
?>
< td>
< ?php
echo $row{'superpower'};
?>
< td>
< ?php
echo $row{'city'}; ?>
< ?php
mysql_close( $connection );
?>
Наберите этот код в редакторе gedit (или скопируйте и вставьте из браузера) и сохраните в файл под именем /var/www/superhero.php. Запустите Firefox и откройте страницу с адресом http://127.0.0.1/superhero.php . Через мгновение – быстрее, чем пролетит пуля – появится страница появится страница, показанная на рисунке 5.
Рисунок 5. Список доступных контрактников-супергероев
Анализ используемого PHP-кода
Давайте проанализируем наш PHP-код. Для него обычный HTML-текст является как бы контейнером, а PHP-код встраивается в него с помощью тегов < ?php ?>. Таким образом возможно сочетать HTML- и PHP-код, что мы и сделали для отображения таблицы героев. Приложение соединяется с локальным MySQL-сервером, выбирает базу данных, выполняет запрос и выводит результат. А теперь то же самое, но подробнее:
- Функция
mysql_connect() устанавливает соединение с MySQL-сервером, находящимся на локальной машине (локальную машину принято называть localhost), используя авторизационные данные hero.
- Функция
mysql_select_db() делает базу данных superheroes текущей, поэтому все последующие операции чтения, записи, изменения и удаления будут применены к этой базе данных (до тех пор, пока другая база данных не будет выбрана функцией mysql_select_db() ).
- Функция
mysql_query() запрашивает информацию у базы данных. Наш запрос охватывает все столбцы и все строки таблицы, отсортированные по полю имени. mysql_query() возвращает набор результатов (result set) – своего рода указатель на список всех подходящих строк.
- Цикл далее интерпретирует строки набора результатов как ассоциативный массив: индексами массива являются имена – в нашем случае это имена интересующих столбцов. (Вспомните, что в обычных массивах для индекса используется целое число). Например,
$row{'name'} означает содержимое поля name текущей строки.
- После того как весь результат выведен в HTML-таблицу, соединение с базой данных закрывается функцией
mysql_close() . На этом PHP-программа завершается.
Вот и все! Конечно, нашей программе еще очень далеко до Web-страниц Twitter или Mint.com, однако мы все же продемонстрировали, что запустить Web-приложение легко и просто (и дешево). Не забывайте, что в Ubuntu доступны мириады программ – достаточно одной команды Aptitude.
[Ссылки]
1. MySQL Change root Password site:cyberciti.biz. |