Главная arrow Программирование arrow HTML arrow Разработка программного обеспечения средствами Open Source Thursday, May 25 2017  
ГлавнаяКонтактыАдминистрированиеПрограммированиеСсылки
UK-flag-ico.png English Version
GERMAN-flag-ico.png Die deutsche Version
map.gif карта сайта
нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

Поделиться:

Разработка программного обеспечения средствами Open Source Версия для печати
Написал microsin   
24.09.2009

Статья Мартина Стрейчера, технического директора 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 <command>". 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 - сервера.
ubuntu-web-prg-XKBerror01.JPG

3. Открыл для тренировки статью "Разработка программного обеспечения средствами Open Source" http://www.ibm.com/developerworks/ru/edu/wa-openstack/.

4. Кроме 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
ubuntu-web-prg-lighty.jpg
 

5. Ставим MySQL 5, тоже всего одной командой apt:
# apt-get install mysql-server-5.0
Процедура будет идти несколько дольше (так как пакет требует для себя около 112 мбайт).
ubuntu-web-prg-mysql5.jpg

Правда, по окончании установки почему-то не запустился мастер и не запросил установки пароля для "MySQL root". Пришлось искать в Интернете, как это делать (http://www.cyberciti.biz/faq/mysql-change-root-password/). Когда делаем это первый раз, то так:
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

6. Установка языка программирования 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 прокрутите текст вниз и найдите такую строку:
; cgi.fix_pathinfo = 0
Измените ее на следующую строку:
cgi.fix_pathinfo = 1  

Для сохранения изменений выберите 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-приложения. 

7. Ваше первое (а также второе) PHP-приложение

Как было сказано ранее, PHP очень популярен среди языков программирования для Web за счет своей простоты и удобства встраивания в обычный HTML-код (Hypertext Markup Language, язык гипертекстовой разметки). HTML-теги выглядят как <head> и </div>, а PHP-код встраивается в него внутри тегов <? ?>.

Первая PHP-программа

Итак, самая простая PHP-программа может выглядеть примерно так, как показано в листинге 4.


Листинг 4. Пример простой PHP-программы
<html>
<head> <title> Hello, World!</title> </head>
  <body>
<h1>
  <? echo 'Hello, World! ?>
</h1>
  </body>
</html>

Для запуска этой программы откройте редактор gedit командой sudo gedit /var/www/hello.php и напечатайте приведенный код. Сохраните файл, перейдите к FireFox и введите в адресной строке http://127.0.0.1/hello.php. Вы должны увидеть страницу, сходную с изображенной на рисунке 4. Если это так, то lighttpd и PHP работают правильно.
Рисунок 4. Результат работы PHP-программы "Hello, World!", выданный lighttpd
ubuntu-web-prg-hello.jpg

Вторая PHP-программа

А теперь перейдем к написанию более сложного примера, в котором мы соберем воедино все компоненты LAMP, а база данных MySQL будет хранить некую информацию. Предлагаю создать программу, отображающую всех сотрудников Superheroes, Inc. – аутсорсинговой компании, предоставляющей услуги супергероев. Для этого необходимо проделать следующие шаги:

  1. Спроектировать и создать базу данных, содержащую таблицу со списком сотрудников.
  2. Наполнить таблицу некоей информацией.
  3. Написать PHP-код, соединяющийся с базой данных и выводящий список на Web-странице.

Создание и наполнение базы данных

Приведенный в листинге 5 фрагмент кода, представляющий собой SQL-скрипт, делает следующее:

  1. Создает базу данных с именем superheroes.
  2. Создает таблицу с именем members внутри базы данных superheroes.
  3. Добавляет в таблицу members четыре записи.
  4. Создает в 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.
</title>
</head>
<body>
<?
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>Сверхъестественные способности</th>
<th>Город</th> </tr>
<?
while ($row = mysql_fetch_assoc($result))
{
?> <tr> <td>
<?
echo $row{'name'};
?>
</td> <td>
<?
echo $row{'superpower'};
?>
</td> <td>
<?
echo $row{'city'}; ?></td> </tr><? }
?>
</table>
<?
   mysql_close( $connection );
?>
</body>
</html>

Наберите этот код в редакторе gedit (или скопируйте и вставьте из браузера) и сохраните в файл под именем /var/www/superhero.php. Запустите Firefox и откройте страницу с адресом http://127.0.0.1/superhero.php. Через мгновение – быстрее, чем пролетит пуля – появится страница появится страница, показанная на рисунке 5.


Рисунок 5. Список доступных контрактников-супергероев
ubuntu-web-prg-superhero.jpg

Анализ используемого PHP-кода

Давайте проанализируем наш PHP-код. Для него обычный HTML-текст является как бы контейнером, а PHP-код встраивается в него с помощью тегов <? ?>. Таким образом возможно сочетать HTML- и PHP-код, что мы и сделали для отображения таблицы героев. Приложение соединяется с локальным MySQL-сервером, выбирает базу данных, выполняет запрос и выводит результат. А теперь то же самое, но подробнее:

  1. Функция mysql_connect() устанавливает соединение с MySQL-сервером, находящимся на локальной машине (локальную машину принято называть localhost), используя авторизационные данные hero.
  2. Функция mysql_select_db() делает базу данных superheroes текущей, поэтому все последующие операции чтения, записи, изменения и удаления будут применены к этой базе данных (до тех пор, пока другая база данных не будет выбрана функцией mysql_select_db()).
  3. Функция mysql_query() запрашивает информацию у базы данных. Наш запрос охватывает все столбцы и все строки таблицы, отсортированные по полю имени. mysql_query() возвращает набор результатов (result set) – своего рода указатель на список всех подходящих строк.
  4. Цикл далее интерпретирует строки набора результатов как ассоциативный массив: индексами массива являются имена – в нашем случае это имена интересующих столбцов. (Вспомните, что в обычных массивах для индекса используется целое число). Например, $row{'name'} означает содержимое поля name текущей строки.
  5. После того как весь результат выведен в HTML-таблицу, соединение с базой данных закрывается функцией mysql_close(). На этом PHP-программа завершается.

Вот и все! Конечно, нашей программе еще очень далеко до Web-страниц Twitter или Mint.com (см. ссылки в разделе Ресурсы), однако мы все же продемонстрировали, что запустить Web-приложение легко и просто (и дешево). Не забывайте, что в Ubuntu доступны мириады программ – достаточно одной команды Aptitude.

Последнее обновление ( 27.09.2009 )
 

Добавить комментарий

:D:lol::-);-)8):-|:-*:oops::sad::cry::o:-?:-x:eek::zzz:P:roll::sigh:

Защитный код
Обновить

< Пред.   След. >

Top of Page
 
microsin © 2017