среда, 16 января 2019 г.

Работа с MySQL. Деревья

Работа с MySQL. Деревья

Автор: Дмитрий Лебедев
Построение дерева в MySQL без рекурсии.
Необходимость вывода данных структурированных в форме деревьев возникает при написании собственного форума или каталога сайтов. Готовых каталогов и форумов в сети можно найти предостаточно, однако иногда чужое в готовом не годится, а переделывать написанное другим займёт гораздо больше времени, чем написать своё.
Структуру данных лучше взять общепринятую - в записи сообщения или рубрики форума содержится идентификатор родителя. Для организации вывода дерева напрашивается рекурсивная функция. Именно так сделано в Phorum'е. Файл include/multi-threads.php содержит функцию thread, которая строит вызывается для каждого корневого сообщения и рекурсивно вызывает себя для ответов на них:
<?php function thread ($seed 0) {
...

    if(@
is_array($messages[$seed]["replies"])) {
        
$count count($messages[$seed]["replies"]);
        for(
$x 1;$ <= $count$x++) {
            
$key key($messages[$seed]["replies"]);
            
thread ($key);
            
next ($messages[$seed]["replies"]);
        }
    }
?>
Но вызов рекурсивной функции при выводе вызывает у меня сомнения: повторять построение дерева сообщений при каждом выводе нерационально. Структура дерева меняется только при добавлении, изменении и удалении сообщений. Данную процедуру лучше было бы вызывать при таких действиях, хранить структуру в таблице и при выводе дерева не делать никаких вычислений.
Для построения дерева достаточно знать последовательность вывода рубрик и их уровень в дереве. Добавим два поля с этими данными в таблицу: level (TINYINT(4). 127 уровней - хватит?) и sortorder (VARCHAR(128)).
---------
id parent
---------
 3      0
 5      0
 7      0
10      3
11      7
12      5
13      3
16     10
21     16
26     11
30      3
47      7
60     10
73     13
75     47
---------
o- 3
|
+-o- 10
| |
| +-o- 16
| | |
| | +-o- 21
| |
| +-o- 60
|
+-o- 13
| |
| +-o- 73
|
+-o- 30

o- 5
|
+-o- 12

o- 7
|
+-o- 11
| |
| +-o- 26
|
+-o- 47
  |
  +-o- 75
Всё, что нам нужно для построения дерева - это идентификатор рубрики и её родителя. Допустим, мы имеем в каталоге несколько рубрик такого содержания:
Структура дерева, подобие которой мы хотим получить такова:
Правда, данный алгоритм позволит нарисовать дерево, но без веток виде линий, как сделано на этом рисунке. Структура дерева будет нарисована при помощи отступов слева.
Вернёмся ещё раз к таблице id-parent. Это рубрики, уже отсортированные по некоторому признаку, по которому мы хотим сортировать элементы одинакового уровня. Например, по убыванию числа сайтов. Кроме id и родительской рубрики мы знаем и номер каждой из них в данном списке. Выровняем эти номера до нужной длины, добавив слева нули. После этого для каждой рубрики сделаем текстовую строку с номерами всех её родителей от самого корня:
При сортировке по полю sortorder мы получим именно то, что нам нужно:
------------------------------
id sort parent sortorder level
------------------------------
 3    1      0 01            0
 5    2      0 02            0
 7    3      0 03            0
10    4      3 0104          1
11    5      7 0305          1
12    6      5 0206          1
13    7      3 0107          1
16    8     10 010408        2
21    9     16 01040809      3
26   10     11 030510        2
30   11      3 0111          1
47   12      7 0312          1
60   13     10 010413        2
73   14     13 010714        2
75   15     47 031215        2
------------------------------
------------------------------
id sort parent sortorder level
------------------------------
 3    1      0 01            0
10    4      3 0104          1
16    8     10 010408        2
21    9     16 01040809      3
60   13     10 010413        2
13    7      3 0107          1
73   14     13 010714        2
30   11      3 0111          1
 5    2      0 02            0
12    6      5 0206          1
 7    3      0 03            0
11    5      7 0305          1
26   10     11 030510        2
47   12      7 0312          1
75   15     47 031215        2
------------------------------
Отступ слева делается, учитывая поле level.
Важно так же отметить, что нам не нужно ничего сортировать в самом скрипте. Для формирования полей sortorder и level нужно заблокировать таблицу от записи (чтобы не произошло изменения структуры веток), выбрать из базы идентификатор рубрики и её родителя, отсортировав по нужному признаку, и записать их в простой двухмерный массив. Затем обработать массив последовательно от первого до последнего уровня и записать поля sortorder и level в таблицу.
Для формирования sortorder не нужно рекурсии (хотя можно, и, вероятно, она работать будет даже быстрее). Достаточно пройтись по массиву одним и тем же циклом. В нём, если рубрика не обработана, для неё формируется поле sortorder из поля sort и родительского sortorder. Если родительская рубрика ещё не обработана, поднимается флаг $unprocessed_rows_exist и цикл запускается ещё раз.
<?php
mysql_query
("LOCK TABLES dir WRITE");
$result mysql_query("SELECT id, IFNULL(parent,0) as parent FROM dir
    ORDER BY sites DESC, title"
);

while (
$row mysql_fetch_array($result)) {
    
$count++;
    
$data["parent"][$row["id"]] = $row["parent"];
    
$data["sort"][$row["id"]] = $count;
}
reset($data);
$unprocessed_rows_exist true;
while(
$unprocessed_rows_exist) {
    
$unprocessed_rows_exist false;
    while (list(
$i$v) = each($data["parent"])) {
        if((
$data["parent"][$i] == || !isset($data["sort"][$data["parent"][$i]]))
                && !isset(
$data["sortorder"][$i])) {
            
$data["sortorder"][$i] = str_pad($data["sort"][$i], $max"0"STR_PAD_LEFT);
            
$data["level"][$i] = 0;
        }
        elseif(!isset(
$data["sortorder"][$i]) &&
                isset(
$data["sortorder"][$data["parent"][$i]])) {
            
$data["sortorder"][$i] = $data["sortorder"][$data["parent"][$i]].
                
str_pad($data["sort"][$i], $max"0"STR_PAD_LEFT);
            
$data["level"][$i] = $data["level"][$data["parent"][$i]] + 1;
        }
        elseif(!isset(
$data["sortorder"][$i]) && isset($data["sort"][$data["parent"][$i]])) {
            
$unprocessed_rows_exist true;
        }
    }
reset($data); ?>
Отмечу, что данный алгоритм не зацикливается при наличии строк с битым полем parent и не пропускает их, а делает корневыми. Рекурсивный алгоритм их просто пропустит.
После выполнения этого цикла мы имеем массивы "id => level" и "id => sortorder". Отправляем в базу всего один запрос, пользуясь внутренними функциями MySQL ELT и FIND_IN_SET:
<?php mysql_query("UPDATE dir SET 
                  sortorder=ELT(FIND_IN_SET(id,'". implode(",", 
                  array_keys($data["sortorder"])). "'),". implode(",", 
                  $data["sortorder"]). "), level=ELT(FIND_IN_SET(id,'". 
                  implode(",", array_keys($data["level"])). "'),". implode(",", 
                  $data["level"]). ") WHERE id IN (". implode(",", 
                  array_keys($data["sortorder"])). ")"); ?>
Конечно же, в отличие от дерева рубрик каталога, в большом форуме много сообщений. Передёргивать их всех при добавлении одного нового нет смысла.
В форумах чаще всего используется сортировка по дате написания сообщения. Поэтому поле sortorder можно смело делать из своего и родительского timestamp'а, выровненного функцией str_pad до 11-значной длины.

вторник, 15 января 2019 г.

Работа с MySQL. На дорожку

Работа с MySQL. На дорожку


Во избежание путаницы полей (если встречаются поля с одинаковыми названиями) используйте в запросах оператор AS: "SELECT table1.id as id1, table2.id as id2". Это поможет избежать ошибок в запросе (например, если не указана таблица, а поле с таким названием есть в нескольких запрашиваемых таблицах, mysql выдаёт ошибку), а так же вы избежите недоразумений при работе с полученными данными (echo $row["id1"] писать гораздо проще, чем $row[$x]).
  • Во избежание путаницы полей (если встречаются поля с одинаковыми названиями) используйте в запросах оператор AS: "SELECT table1.id as id1, table2.id as id2". Это поможет избежать ошибок в запросе (например, если не указана таблица, а поле с таким названием есть в нескольких запрашиваемых таблицах, mysql выдаёт ошибку), а так же вы избежите недоразумений при работе с полученными данными (echo $row["id1"] писать гораздо проще, чем $row[$x]).
  • Данные типа DATE, TIME, DATETIME и TIMESTAMP можно форматировать с помощью функции date_format (см. руководство по mysql). Используйте его, и не форматируйте данные через php - это не просто "самодеятельность", а ещё и растрата системных ресурсов.
  • По возможности минимально используйте LEFT JOIN для объединения таблиц. Это весьма трудоёмкая операция для базы данных.
  • Там, где можно, используйте идентификаторы - выборка данных при указании ключевого поля происходит быстрее, чем при указании обычного.
  • Вместо "WHERE id=1 OR id=3 OR id=232" можно использовать встроенную функцию IN: "WHERE id IN (1,3,232)".
  • Если нужен текстовый поиск, осторожней со знаком "%". Во всяком случае, запросы типа somefield LIKE '%a%' лучше не делать - опять же слишком трудоёмкая операция. По крайней мере, надо фильтровать слова и отрезать те, которые короче 3 символов.
  • Используйте минимум необходимых полей в запросе. "SELECT * FROM sometable" выполняется медленнее, чем "SELECT id FROM sometable", тем более если в таблице много данных. Для подсчёта количества строк в таблице вообще (или подпадающих под некоторое условие) достаточно одного поля.
  • Разбивайте данные на страницы, используя оператор LIMIT. Это экономит время выполнения запроса и уменьшает объем страницы, которую получает пользователь.
Даже если вам не грозит "падение" от наплыва посетителей, лучше взять себе в привычку, чтобы потом не было проблем с адаптацией к новым задачам. Теперь о безопасности работы
  • Старайтесь не допускать внесения в базу данных символа одинарной кавычки ("'"), поскольку это служебный символ запросов БД. Перед внесением в базу поле можно обработать функцией str_replace: $somefield = str_replace("'", "'", $somefield);
К тому же это лишний барьер на пути взломщиков вашего сайта. Пример "взлома" простой:
mysql_query ("ОБНОВЛЕНИЕ пользователей УСТАНОВИТЕ пароль = ПАРОЛЬ ('$ passwd') ГДЕ login = '$ login'");
Если кавычку не обработать на входе, злоумышленник может в качестве логина сунуть строку "vasya_pupkin' OR login LIKE'%". В базу данных залетит запрос: mysql_query("UPDATE users SET password=PASSWORD('$passwd') WHERE login='vasya_pupkin' OR login LIKE '%'"); То есть все пароли будут одинаковые. Это только один пример. Итак,
  • Обрабатывайте данные, получаемые из адресной строки или из формы, и приводите их к нужному типу во избежание ошибок и "взломов" сайта. (ещё пример: если требуется идентификатор, то есть целое число, надо обработать его с помощью intval: $id = intval($id)).
Запросы на вставку строки (INSERT)
Поле идентификатора вставлять не нужно. На это есть свойство поля AUTO_INCREMENT.
Забавно читать, как в форуме пишут:
- Как мне быть с генератором случайных чисел?! неправильно работает!
- А зачем тебе?
- Да в базе id использовать...
В общем, не надо самодеятельности.
  • Если в поле формата DATE, TIME, DATETIME или TIMESTAMP надо вставить текущее время, используйте встроенную в mysql функцию NOW: "INSERT INTO vote (ip, date) VALUES ($REMOTE_ADDR, NOW())"
  • Хранимые в базе пароли лучше прикрыть функцией php md5: "INSERT INTO user (login, pass) VALUES ('$login', ". md5($pass). ")" "SELECT * FROM user WHERE login='$login' AND pass=". md5($pass)
Советы, кажется, уже исчерпаны. Напоследок. С недавних пор я стал думать, что при написании скриптов, работающих с БД, надо ориентироваться не только на глупого и шаловливого посетителя, но и на криворукого администратора. Даже если мы внимательно будем следить за текстом, который вставляем в текстовое поле (одинарные кавычки не писать, делать их автозамену в Word-е, белое не носить), вероятность попадания служебных символов в запрос ненулевая.

Задания для самостоятельной работы

Задания для самостоятельной работы

Задание 1. В отношении R5 отметить студентов — претендентов на отчисление. Считаем, что в отношении R1 находятся окончательные результаты сессии, и поэтому отчислению подлежат все студенты, которые не сдали или не сдавали два и более из положенных экзаменов в сессию. Для того чтобы зафиксировать этот факт, нам потребуется добавить еще один столбец в отношение R5, назовем его результат_сессии, и там могут быть два допустимых значения: переведен на следующий курс или отчислен. Запрос писать по универсальному алгоритму.
Задание 2. В отношении R5 отметить студентов, переведенных на следующий курс.
Задание 3. Провести отчисление студентов по результатам текущей сессии. Обратите внимание, что это уже другая операция по сравнению с заданиями 1 и 2.
к оглавлению

Знаете ли Вы, в чем ложность понятия "физический вакуум"?
Физический вакуум - понятие релятивистской квантовой физики, под ним там понимают низшее (основное) энергетическое состояние квантованного поля, обладающее нулевыми импульсом, моментом импульса и другими квантовыми числами. Физическим вакуумом релятивистские теоретики называют полностью лишённое вещества пространство, заполненное неизмеряемым, а значит, лишь воображаемым полем. Такое состояние по мнению релятивистов не является абсолютной пустотой, но пространством, заполненным некими фантомными (виртуальными) частицами. Релятивистская квантовая теория поля утверждает, что, в согласии с принципом неопределённости Гейзенберга, в физическом вакууме постоянно рождаются и исчезают виртуальные, то есть кажущиеся (кому кажущиеся?), частицы: происходят так называемые нулевые колебания полей. Виртуальные частицы физического вакуума, а следовательно, он сам, по определению не имеют системы отсчета, так как в противном случае нарушался бы принцип относительности Эйнштейна, на котором основывается теория относительности (то есть стала бы возможной абсолютная система измерения с отсчетом от частиц физического вакуума, что в свою очередь однозначно опровергло бы принцип относительности, на котором постороена СТО). Таким образом, физический вакуум и его частицы не есть элементы физического мира, но лишь элементы теории относительности, которые существуют не в реальном мире, но лишь в релятивистских формулах, нарушая при этом принцип причинности (возникают и исчезают беспричинно), принцип объективности (виртуальные частицы можно считать в зависимсоти от желания теоретика либо существующими, либо не существующими), принцип фактической измеримости (не наблюдаемы, не имеют своей ИСО).
Когда тот или иной физик использует понятие "физический вакуум", он либо не понимает абсурдности этого термина, либо лукавит, являясь скрытым или явным приверженцем релятивистской идеологии.
Понять абсурдность этого понятия легче всего обратившись к истокам его возникновения. Рождено оно было Полем Дираком в 1930-х, когда стало ясно, что отрицание эфира в чистом виде, как это делал великий математик, но посредственный физик Анри Пуанкаре, уже нельзя. Слишком много фактов противоречит этому.
Для защиты релятивизма Поль Дирак ввел афизическое и алогичное понятие отрицательной энергии, а затем и существование "моря" двух компенсирующих друг друга энергий в вакууме - положительной и отрицательной, а также "моря" компенсирующих друг друга частиц - виртуальных (то есть кажущихся) электронов и позитронов в вакууме.
Однако такая постановка является внутренне противоречивой (виртуальные частицы ненаблюдаемы и их по произволу можно считать в одном случае отсутствующими, а в другом - присутствующими) и противоречащей релятивизму (то есть отрицанию эфира, так как при наличии таких частиц в вакууме релятивизм уже просто невозможен). Подробнее читайте в FAQ по эфирной физике.

понедельник, 14 января 2019 г.

Оптимизация запросов в MySQL

Оптимизация запросов в MySQL

Автор: Соколов Сергей
Оптимизация – это изменение системы с целью повышения ее быстродействия.
Оптимизацию работы с БД можно разделить на 3 типа:
  • оптимизация запросов
  • оптимизация структуры
  • оптимизация сервера.
Рассмотрим подробнее оптимизацию запросов.
Оптимизация запросов - наиболее простой и приводящий к наиболее высоким результатам тип оптимизации.
SELECT
Запросами, которые чаще всего поддаются оптимизации, являются запросы на выборку.
Для того чтобы посмотреть как будет выполняться запрос на выборку используется оператор EXPLAIN:
http://www.mysql.com/doc/ru/EXPLAIN.html
С его помощью мы можем посмотреть, в каком порядке будут связываться таблицы и какие индексы при этом будут использоваться.
Основная ошибка начинающих - это отсутствие индексов на нужных полях или создание оных на ненужных полях. Если вы делаете простую выборку наподобие:
SELECT * FROM table WHERE field1 = 123
То вам нужно проставить индекс на поле field1, если вы используете в выборке условие по двум полям:
SELECT * FROM table WHERE field1 = 123 AND field2 = 234
То вам нужно создать составной индекс на поля field1, field2.
Если вы используете соединение 2 или более таблиц:
SELECT *
FROM a, b
WHERE a.b_id = b.id

Или в более общем виде:
SELECT *
FROM a
[LEFT] JOIN b ON b.id = a.b_id
[LEFT] JOIN с ON с.id = b.c_id

То вам следует создать индексы по полям, по которым будут присоединятся таблицы. В данном случае это поля b.id и c.id. Однако это утверждение верно только в том случае, если выборка будет происходить в том порядке, в котором они перечислены в запросе. Если, к примеру, оптимизатор MySQL будет выбирать записи из таблиц в следующем порядке: c,b,a, то нужно будет проставить индексы по полям: b.c_id и a.b_id. При связывании с помощью LEFT JOIN таблица, которая идет в запросе слева, всегда будет просматриваться первой.
Про синтаксис создания индексов можно прочитать в документации:
Более подробно про использовании индексов можно прочитать здесь:
Иногда бывает такая ситуация, что нам постоянно приходится делать выборки из одной и той же части некоторой очень большой таблицы, например, во многих запросах происходит соединение с частью таблицы:
[LEFT] JOIN b ON b.id = a.b_id AND b.field1 = 123 AND b.field2 = 234
В таких случаях может быть разумным вынести эту часть в отдельную временную таблицу:
CREATE TEMPORARY TABLE tmp_b TYPE=HEAP SELECT * FROM b WHERE b.field1 = 123 AND b.field2 = 234
И работать уже с ней ( про временные таблицы читайте в документации http://www.mysql.com/doc/ru/CREATE_TABLE.html).
Также если мы несколько раз рассчитываем агрегатную функцию для одних и тех же данных, то для ускорения следует сделать такой расчет отдельно и положить его результат во временную таблицу.
Также бывают тормоза, когда люди пытаются в одном запросе «поймать сразу 2-х зайцев», например, на форуме phpclub’а автор следующего запроса спрашивал, почему он тормозит:
SELECT f_m. *, MAX( f_m_v_w.date ) AS last_visited, COUNT( DISTINCT f_b.id ) AS books_num,
IF ( f_m.region != 999, f_r.name, f_m.region_other ) AS region_name
FROM fair_members f_m
LEFT JOIN fair_members_visits_week f_m_v_w ON f_m_v_w.member_id = f_m.id
LEFT JOIN fair_regions AS f_r ON f_m.region = f_r.id
LEFT JOIN fair_books AS f_b ON f_b.pub_id = f_m.id
GROUP BY f_m.id
Автор запроса пытается в одном запросе посчитать максимальное значение атрибута из одной таблицы и кол-во записей в другой таблице. В результате к запросу приходится присоединять 2 разные таблицы, которые сильно замедляют выборку. Для увеличения быстродействия такой выборки необходимо вынести подсчет MAX’а или COUNT’а в отдельный запрос.
Для подсчета кол-ва строк используйте функцию COUNT(*), c указанием "звездочки" в качестве аргумента.
Почему COUNT(*) обычно быстрее COUNT(id), поясню на примере:
Есть таблица message: id | user_id | text
с индексом PRIMARY(id), INDEX(user_id)
Нам надо подсчитать сообщения пользователя с заданым $user_id
Сравним 2 запроса:
SELECT COUNT(*) FROM message WHERE user_id = $user_id
и
SELECT COUNT(id) FROM message WHERE user_id = $user_id
Для выполнения первого запроса нам достаточно просто пробежаться по индексу user_id и подсчитать кол-во записей, удовлетворяющих условию - такая операция достаточно быстрая, т.к., во-первых, индексы у нас упорядочены и ,во-вторых, часто находятся в буфере.
Для выполнения второго запроса мы сначала проходим по индексу, для отбора записей удовлетворяющих условию, после чего если запись попадает под условие, то вытаскиваем ее (запись скорее всего будет на диске) чтобы получить значение id и только потом инкриментим счетчик.
В итоге получаем, что при большом кол-ве записей скорость первого запроса будет выше в разы.
UPDATE, INSERT
Скорость вставок и обновлений в базе зависит от размера вставляемой (обновляемой) записи и от времени вставки индексов. Время вставки индексов в свою очередь зависит от количества вставляемых индексов и размера таблицы. Эту зависимость можно выразить формулой:
[Время вставки индексов] = [кол-во индексов] * LOG2( [Размер таблицы] )
При операциях обновления под [кол-во индексов] понимаются только те индексы, в которых присутствуют обновляемые поля.
Условия в запросах на обновления оптимизируются так же, как и в случае с выборками.
При частом изменении некоторой большой таблицы с большим количеством индексов имеет смысл производить вставки в другую небольшую вспомогательную таблицу с тем же набором полей (но с отсутствием индексов) и периодически перекидывать данные из нее в основную таблицу, очищая вспомогательную. При этом следует учесть, что данные будут выводиться с запозданием, что не всегда может быть возможным.
«Чтобы удалить все строки в таблице, нужно использовать команду TRUNCATE TABLE table_name.» © документация MySQL.
Ответы на многие вопросы по оптимизации запросов можно найти в мануале: http://www.mysql.com/doc/ru/Query_Speed.html

MySQL Administrator - рулить СУБД легко

MySQL Administrator - рулить СУБД легко

Автор: Александр Лозовюк
Сервер баз данных MySQL уже давно пользуется заслуженной популярностью у разработчиков веб-приложений. Потом, когда вышли последние версии сред разработки фирмы Borland - Delphi 6/7, Kylix 2/3 и другие, где появились компоненты для работы с MySQL, ее начали применять и в традиционных, desktop или клиент-серверных  разработках.
MySQL ориентирована в первую очередь на управление с помощью командной стороки или файлов конфигурации, и все настройки и операции приходилось исполнять через консоль или telnet, если сервер был установлен на удаленном компьютере. Потом в поставку начали входить две графические утилиты: MySqlManager и WinMySQLAdmin.
MySQL Administrator
MySqlManager - это простейшая графическая утилита для работы с таблицами БД. Все базы, таблицы и поля отображаются в виде древовидного списка, но нет никаких средств удобного просмотра содержимого таблиц или изменения свойств полей. Для всех операций предусмотрено только интерактивное окно работы с SQL запросами (причем оно, видимо, "живет" своей жизнью: в контекстном меню для каждой БД есть команда "SQL query", которая вызывает окно запроса, но всегда в теле SQL надо прописывать базу и таблицу, к которой обращаемся). Для сколь либо серьезной работы эта утилита совершенно непригодна.
WinMySQLAdmin относится к другому классу утилит – это средство для  администрирования сервера. Программа отображает сведения о работе сервера, время работы, переменные среды, список доступных баз данных и таблиц (без возможности редактирования или просмотра), а также позволяет перезапускать сервер. На отдельную вкладку вынесены настройки производительнсти и редактирования конфигурационного файла my.ini: в дистрибутив входит несколько сборок сервера и можно выбрать наиболее быстродействующую (mysqld-opt, mysqld-nt, mysqld-max, mysqld -max-nt).  Программа при закрытии главного окна скрывается в systray, а наиболее частые операции с сервером (перезагрузка/запуск/остановка) можно выполнить через контекстное меню. Иконка в виде светофора показывает текущее состояние сервера – красный (остановлен),зеленый (работает) или желтый (процесс загрузки/остановки).
Еще есть утилита MySQL Control Center (текущая версия 0.9.4 beta), которая не входит в поставку СУБД. Она предназначена как раз для администрирования – управления пользователями и правами доступа, а также позволяет сделать ряд глобальных операций над сервером, вроде просмотра переменных, текущих подключений и статистики по каждой базе. Но следует отметить, что MDI-интерфейс не удобен для повседневной работы, да и функциональности недостаточно.
Этих утилит не хватало для полноценной работы с сервером, поэтому пользователи чаще всего использовали средства других разработчиков. Так, для администрирования и работы с БД через Web наиболее популярным инструментом стал набор PHP скриптов PHPMyAdmin. Но это довольно узкое решение, так как для работы необходм веб-сервер с поддержкой PHP и не все операции по администрированию именно сервера, а не отдельных баз данных, можно делать через веб-интерфейс.
Вряд ли я ошибусь, когда скажу, что пользователи MySQL с нетерпением ждали, когда же компания выпустит собственную утилиту для полноценного администрирования СУБД. Недавно такая программа была анонсирована, а сейчас вышел первый релиз. Итак, встречайте - MySQL Administrator!
MySQL Administrator
Утилита предназначена для администрирования сервера, а также может выполнять операции резервного копирования и востановления информации (как над отдельными, так и над всеми базами, причем есть встроеный планировщик заданий). Кроме СУБД MySQL поддерживается Oracle или другие БД через ODBC (не проверялось, но понятно, что в таком случае будут отключены все возможности, специфические именно для MySQL, да и программа разрабатывалась главным образом для MySQL, а все остальное – как бесплатный довесок).
Основные функции утилиты сгруппированы в 11 пунктов графического меню в стиле MS Windows 2003. К слову, утилита распространяется  на правах OpenSorce GPL и доступна для платформы Win32 и Linux как в бинарном виде, так и в исходных кодах. Текущая версия 1.0.1 alpha работает довольно стабильно, хотя есть некоторые недочеты в интерфейсной части и часть функций не реализована (только интерфейсная часть).
Далее мы остановимся на каждом разделе меню и опишем главные функции программы.

Информация о сервере

Первый пункт  стандартен – Server Information. Здесь можно посмотреть на какой платформе запущен сервер, хост/порт, текущий аккаунт пользователя, IP, операционную систему, процессор и размер доступной памяти. Тут же показывается текущий статус сервера – работает или остановлен.
MySQL Administrator

Сервисный контроль

Позволяет запустить или перезапустить сервер, просмотреть лог загрузки. Вторая вкладка позволяет настроить основные параметры – пути к файлу конфигурации, директории с бинарными файлами и настроить сервер для поддержки специфических расширений (например, таблиц формата InnoDB с поддержкой транзакций или использования для работы именованных каналов). Оказалось, что в разных  версиях сервера (mysqld-opt, mysqld-nt, mysqld-max, mysqld-max-nt), кроме различий в производительности, еще и по-разному реализована поддержка расширений (таблицы InnoDB поддерживаются в mysqld-opt, но не поддерживаются в стандартном mysqld).
MySQL Administrator

Переменные запуска

Этот раздел позволяет  настроить множество тонких опций, влияющих на производительность сервера. Кроме базовых настроек (поддержка сетевых соединений, настройка портов, пути к служебным каталогам, настройка работы с памятью), отдельно можно настроить опции для различных типов таблиц (MyISAM, InnoDB). Для увеличения производительности есть настройки кеширования, для работы с несколькими серверами есть настройки репликации. Вкладка Advancedпозволяет очень тонко настроить работу сервера, а некоторые опции я даже не нашел как настроить традиционным путем при помощи командной строки. На отдельных вкладках сгруппированы настройки безопасности и сетевые возможности. Как некоторый недочет - очень небольшое количество настроек безопасности, а ведь при серьезной  работе в коммерческих приложениях безопасности уделяется повышенное внимание.
MySQL Administrator

Соединения с сервером

В этом меню можно просмотреть все текущие подключения клиентов к серверу и при необходимости завершить любое из них.
MySQL Administrator

Администрирование пользователей

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

Здоровье

Меню Health чисто информационное и позволяет отслеживать производительность сервера в реальном времени, расход памяти и сетевой траффик, а также показывает статистику по типам запросов и эффективность задействования ключей. Эти возможности можно использовать, чтобы наблюдать изменения в работе сервера при изменении настроек, тестировать их влияние на производительность и таким образом постепенно настроить сервер на максимум для конкретного круга задач.

Журналы сервера

Показывает стандартные логи сервера – общий лог и записи об ошибках.
Вот самое интересное и полезное  - это реализованные функции резервирования и востановления БД. Реализован удобный планировщик, и теперь можно делать раздельное резервирование отдельных БД и таблиц – одни БД один раз в сутки, другие в конце недели и т.д. Опции резервирования также гибко настраиваются – для этого есть вкладка Advanced Options. Пока для резервирования доступен лишь один формат  - простой текстовый файл с SQL запросами, без сжатия и т.д. Но будем надеяться, что в следующих версиях будет хоть какой-то алгоритм сжатия.
К сожалению, вся вкладка Schedule пока неактивна – видимо, разработчики еще не до конца протестировали эту возможность. Все-таки, этот релиз обозначен как альфа. В любом случае, путь, по которому пошли разработчики не может не радовать – наконец СУБД MySQL обзаводится мощными средствами конфигурирования и настройки и теперь ее можно применять и в корпоративных приложениях, а не только в Web-проектах. 
При востановлении из резервной копии также можно выбрать отдельные таблицы и базы данных, которые подлежат восстановлению.

Состояние репликации

Функция Replication Status скорее всего еще до конца не реализована, присутствует только вкладка Server Information. Для реализации и настройки репликации надо перейти на вкладку Replication раздела Startup variables, где можно детально настроить параметры репликации.

Каталоги

Последний раздел дает доступ к отдельным базам и таблицам, позволяет осуществлять операции оптимизации, проверки и востановления таблиц, а также показывает сведения об индексах и их параметрах, а также пользователей, которые имеют доступ к конкретной базе или таблице.
В целом, MySQL Administrator  способна обеспечить все потребности администратора или разработчика, как по управлению пользователями, так и по тонкой настройке производительности, анализе работы сервера, и может служить инструментом для резервирования и репликации баз данных. Для полноценного использования, думаю, еще надо подождать следующего релиза, где будут исправлены все недочеты и увеличена функциональность (в основном это касается функций резервирования).
 Распространение такого мощного средства на условиях OpenSource будет способствовать продвижению СУБД и теперь можно ожидать, что появятся вполне серьезные разработки корпоративного масшатаба, основанные на MySQL. Тем более, что уже появилась новая версия сервера – 5.0 alpha где, помимо всего прочего, обещают поддержку хранимых процедур. Остается ждать первого официального стабильного релиза (пока есть только alpha версия для разработчиков).

Ссылки

http://www.mysql.com/ - официальный сайт MySQL AB.
http://www.mysql.com/downloads/administrator.html - тут можно скачать последнюю версию MySQL Administrator. 
http://www.mysql.com/products/administrator/faq.html - список часто задаваемых вопросов по MySQL Administrator. 
http://www.mysql.com/products/mysqlcc/index.html - утилита MySQL Control Center.

воскресенье, 13 января 2019 г.

Азбука MySQL

Азбука MySQL

Причина возникновения названия MySQL остается неясной. С одной стороны, разработчики в процессе написания программ ко многим директориям и именам файлов традиционно добавляли префикс "my". С другой стороны, имя дочери одного из разработчиков - My. Какой из этих фактов стал причиной такого названия, остается загадкой даже для разработчиков.
Как только мы задумываемся об упорядоченном хранении информации, неизбежно приходим к мысли о создании базы данных. Создав ее, например, в Microsoft Access, мы облегченно вздыхаем и на какое-то время успокаиваемся. Но это "какое-то время" длится недолго - на горизонте уже маячит следующая, продиктованная жизненной необходимостью задача: нужно обеспечить доступ к данным через интернет с рабочих станций, на которых, вполне возможно, установлены различные ОС. И вот тут на помощь приходит быстрая и надежная СУБД MySQL.
Эта СУБД ведет свое начало от mSQL. Разработчики нуждались в более быстрой, надежной и гибкой СУБД. В результате был создан новый SQL-интерфейс при почти не измененном API-интерфейс mSQL. Этот API был выбран, чтобы облегчить перенос программ других разработчиков.

Вся мощь простоты

SQL - это язык структурированных запросов (Structured Query Language), международный стандарт языка для доступа к базам данных.
MySQL - это, если смотреть в общем, SQL-сервер; иначе говоря - программа, которая принимает запросы, написанные на SQL, и отсылает обратно определенные ответы. Ответами могут быть: данные, количество строк, задействованных в запросе, или просто строка (например, "Привет, Мир!").
СУБД MySQL предоставляет в ваше распоряжение подмножество языка SQL, соответствующее спецификации ANSI SQL 92.
Конечно, нам нужно как-то обеспечить доступ к MySQL. Это можно сделать или через клиент (как текстовый, так и графический), или через какой-то язык программирования.
Ядро, на котором сформирован MySQL, представляет собой набор подпрограмм, которые уже много лет использовались в высокотребовательном окружении. Это богатый и полезный функциональный набор, в то время как MySQL все еще находится в разработке.
Основные цели MySQL: быстродействие и ошибкоустойчивость. Эта СУБД прекрасно справляется с обработкой очень значительных массивов данных (большое количество пользователей сообщают о работе с тысячами и даже миллионами записей). В листах рассылок нередки сообщения об базах данных в несколько гигабайт. Кроме того, MySQL в запросах к большим таблицам превосходит многие другие системы. Она очень стабильна и превосходно работает даже в случаях, когда несколько сотен пользователей нуждаются в доступе к одним и тем же данным. Исходя из вышесказанного легко понять, почему MySQL пользуется такой популярностью у разработчиков веб-приложений. MySQL также очень масштабируема, работает на всем - от персональных компьютеров до больших многопроцессорных систем.
Одно из замечательных свойств MySQL заключается в том, что пользователь имеет доступ к MySQL-серверу независимо от операционной системы, языка программирования или клиента, которым пользуется. Находясь на UNIX-системе, пользователь может связываться с MySQL-сервером, работающим на OS/2- и Windows-платформах.
Для взаимодействия с MySQL-сервером можно использовать множество языков программирования. Можно написать программы на C, C++, Java, PHP, Perl, TCL, Python - и они будут работать.
В MySQL все организовано по схеме "ничего лишнего", поэтому и отсутствуют некоторые функции, которыми оснащены другие базы данных. MySQL не поддерживает вложенных запросов, тригерров; отсутствует также встроенная поддержка XML, OLAP и конструктов (constraits). Но зато есть новации (например, возможность кешировать запросы). Отсутствующие функции были принесены в жертву быстродействию, которое обеспечивает эта СУБД (хотя, если какие-то из этих функций все же понадобятся, можно использовать разработками сторонних производителей).

Как поставил, так и держится

Теперь, когда мы увидели, каким "навороченным" продуктом является MySQL, тем более хочется попробовать его в деле, поставить и пощупать все своими руками. Этим и займемся.
В связи с возрастающим интересом к Linux-платформам, рассмотрим установку и работу с MySQL именно на такой платформе. Чтобы инсталляция MySQL проходила без особых затруднений, будем следовать рекомендациям, выложенным на сайте MySQL.
  • Первое, что нам рекомендуют,- скачать стабильную (stable release) версию (на момент написания статьи - MySQL 3.23.49a).
  • Второй совет: не пытаться скомпилировать MySQL самостоятельно - устанавливать уже скомпилированную версию.
Приняв на вооружение эти рекомендации, запускаем на закачку файл "mysql-3.23.49a-pc-linux-gnu-i686.tar.gz" и спустя некоторое время получаем его. Перед началом установки создадим у себя группу и пользователя mysql:
Shell>groupadd mysql  Shell> useradd -g mysql mysql  
Далее распаковываем этот файл в каталог /usr/local:
Shell> tar -zxf gunzip mysql-3.23.49a-pc-linux-gnu-i686.tar.gz
Затем нужно сделать символическую ссылку mysql с каталога mysql-3.23.49a-pc-linux-gnu-i686:
Shell> ln -s mysql-3.23.49a-pc-linux-gnu-i686 mysql
Причина этих действий заключается в том, что в скриптах прописаны именно эти каталоги.
Теперь создадим каталог, в котором будут хранится базы. Для этого нужно всего лишь зайти в каталог mysql и запустить скрипт mysql_install_db, который находится в каталоге scripts:
Shell>cd /usr/local/mysql  Shell>scripts/mysql_install_db  
И последний штрих: с помощью команды safe_mysqld, которая находится в каталоге bin, запускаем сервер. Если очень хочется, чтобы запуск происходил при каждой загрузке системы, надо поместить запуск safe_mysql в один из файлов инициализации системы.
В качестве примера: дописываем в /etc/rc.d/rc.local строчку /usr/local/mysql/bin/safe_mysqld &. Но, если просто записать эту строку в rc.local, mysql не захочет запускаться при загрузке системы. И вот, пошаманив немного над файлом safe_mysqld, я обнаружил, что в некоторых местах нужно заменить libexec на bin и var на data. Вот строки (начиная с 87), которые подверглись изменениям:
MY_BASEDIR_VERSION=$MY_PWD # Where libexec, share and var are
ledir=$MY_BASEDIR_VERSION/bin # Where mysqld is
DATADIR=$MY_BASEDIR_VERSION/data
else
MY_BASEDIR_VERSION=/usr/local/mysql
DATADIR=/usr/local/mysql/data
ledir=/usr/local/mysql/bin
После того как мы все поставили, нужно изменить владельца и группу созданных каталогов.
Каталогу mysql и всем подкаталогам нужно назначить владельца root и группу mysql.
Shell>chown -R root:mysql /usr/local/mysql  
Каталогу баз данных назначаем владельца mysql и одноименную группу.
Shell>chown -R mysql:mysql /usr/local/mysql/data  
И последний штрих в настройке - пропишем путь к исполняемым программам mysql в profile:
PATH=$PATH:/usr/local/mysql/bin  
На сайте mysql можно скачать графические оболочки для работы с базами (mysqlgui и mycc). Только вот, установив эти оболочки, я пришел к выводу, что они не заменяют знание SQL и удобны только для отображения таблиц, находящихся в базе (кстати, для отображения мне больше понравился mycc - у него понятнее интерфейс, и с ним легче работать).
Для связи с базой данных предназначена программа mysql. Это командный интерпретатор, который передает введенные команды СУБД.

Что б такого сотворить

В качестве примера работы с этой системой управления базами данных создадим базу аудиодисков. Думаю, найдется немало любителей музыки, владеющих такой массой музыкальных дисков, что в ней можно запутаться. Кроме того, еще одна проблема возникает, когда даешь кому-то послушать диск. Диск слушают, а возвращать забывают (да и сам нередко забываешь, кому что дал). Вот и получается: что диск у тебя был, помнишь, а где он сейчас - без понятия.
Итак, мы поняли, что нужно сделать; приступим к исполнению.
Для начала создадим базу данных. Запускаем командный интерпретатор и набираем:
Mysql> create database audio_cd;  
Теперь самое время подумать, из чего же будет состоять наша база. Иначе говоря, какие таблицы она будет в себя включать.

Создадим таблицу дисков, которая будет включать в себя 3 поля:
  • уникальный номер диска;
  • название диска;
  • год выпуска диска.

Следующая таблица - это таблица песен:
  • уникальный номер песни
  • название песни
  • исполнитель
  • описание, или жанр

Третья таблица, которую мы создадим, это таблица друзей:
  • уникальный номер;
  • имя;
  • адрес;
  • телефон;
  • адрес электронной почты.
Естественно, что на диске может быть больше одной песни, и что одна песня может быть на разных компактах, поэтому это связь "многие ко многим". Но, вместе с тем, конкретный диск одновременно может находиться только у одного человека, и один человек может взять несколько дисков - поэтому это связь "многие к одному".
Для фиксации связей нам понадобятся две таблицы. В первой будет записано, какие песни на каких дисках находятся, во второй - у кого из друзей сейчас диск.
Теперь, когда мы разобрались с тем, какой должна быть структура нашей базы, можно набрать несколько команд, чтобы претворить задуманное в жизнь. Все команды будем выполнять в командном интерпретаторе mysql. Можно также набрать их в любом текстовом редакторе, записать в файл, а потом передать на командный вход интерпретатору - и он выполнит наши команды. Например, если мы сделаем текстовый файл db.txt, в котором запишем необходимые команды SQL, то выполнить этот файл можно с помощью команды:
Shell>mysql <DB.TXT pre ><>
Вот как выглядит этот файл:
use audio_cd;
create table cd (
   cd_id SMALLINT unsigned not null auto_increment PRIMARY KEY,
   name VARCHAR(100) not null default "",
   release_year YEAR
);
create table songs(
   song_id SMALLINT unsigned not null auto_increment,
   primary key (song_id),
   song_name VARCHAR(200) not null default "",
   autor_name VARCHAR(100) not null default "",
   description VARCHAR(255) not null default ""
);
create table songs_on_cd(
   cd_id SMALLINT unsigned not null REFERENCES cd,
   song_id SMALLINT unsigned not null REFERENCES songs
);
create table people(
   p_id SMALLINT unsigned not null auto_increment PRIMARY KEY,
   name VARCHAR(100) not null default "",
   addr VARCHAR(255) not null default "",
   phonnum char(6) not null default "000000",
   email varchar(50) not null default ""
);
create table take_disk(
   cd_id SMALLINT unsigned not null REFERENCES cd,
   p_id SMALLINT unsigned not null REFERENCES people
);
У нас есть база, нужно заполнить ее полезной информацией. Для начала добавим в нее несколько дисков с песнями. Для примера возьмем диски "Pink Floyd".
Итак, добавляем диск 1983 года - "The Final Cut":
Mysql>insert into cd values (NULL, 'The Final Cut', 1983);
Добавляем в этот альбом песни:
mysql> insert into songs values
   (NULL, "The post war dream", "Pink Floyd", ""),
   (NULL, "Your possible pasts", "Pink Floyd",""),
   (NULL, "One of the few", "Pink Floyd",""),
   (NULL, "The hero's return", "Pink Floyd",""),
   (NULL, "The gunner's dream", "Pink Floyd",""),
   (NULL, "Paranoyd eyes", "Pink Floyd",""),
   (NULL, "Get your filthy hands off my desert", "Pink Floyd",""),
   (NULL, "The fletcher memorial home", "Pink Floyd",""),
   (NULL, "Southampton dock", "Pink Floyd",""),
   (NULL, "The final cut", "Pink Floyd",""),
   (NULL, "Hot now john", "Pink Floyd",""),
   (NULL, "Two suns in the sunset", "Pink Floyd","");
Нужно присоединить эти песни к диску -для этого заполним таблицу songs_on_cd. Смотрим в соответствующих таблицах, под каким номером находятся песни, а под каким номером - диск. Это можно сделать с помощью команды select:
Mysql>select * from cd;  Mysql>select * from songs;  
Или просмотрев таблицы с помощью графической оболочки.

Из рисунка видно, что нужно добавить песни с номерами 1-12 к диску номер 1:
Mysql>insert into songs_on_cd values (1,1), (1,2), (1,3), (1,4), (1,5),
      (1,6), (1,7), (1,8), (1,9), (1,10), (1,11), (1,12); 
Аналогично добавляем альбом 1999 года "Red Hot Chili Peppers" "Californication".
Если возникнет необходимость посмотреть, какие песни на каком диске находятся, можно воспользоваться sql-командой select. Например, чтобы посмотреть, что находится на диске Californication (см. рис. 3), набираем следующую команду:
mysql> select songs.song_name as song, songs.autor_name as autor
from songs, songs_on_cd, cd
where songs.song_id=songs_on_cd.song_id and
cd.cd_id=songs_on_cd.cd_id and cd.name="Californication";

Если мы хотим на время отдать диск кому-то из друзей, то для начала нужно будет ввести координаты этого человека в базу, а потом зафиксировать передачу диска. Вот как это выглядит на языке sql:
Mysql>insert into people values
   (NULL, "Ivanov Ivan", "st. Lenina 53,34", "4523412", "ivan@mail.ru");
Передаем диск:
Mysql> insert into take_disk values (1,1);
И последний пример - посмотрим, у кого находится диск "The Final Cut" (см. рис. 4):
mysql> select people.name as "Name", people.addr as "Address",
people.phonnum as "Phone", people.email from people, cd, take_disk
where take_disk.cd_id=cd.cd_id and take_disk.p_id=people.p_id and
cd.name='The Final Cut';

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

Напутствие в дорогу

Mysql - быстрая и надежная система управления базами данных, хотя ее редко используют, набирая все команды вручную - так, как это сделали мы. Обычно она играет свою роль за кулисами, обслуживая разнообразнейшие веб-сайты. Мы также можем создать с помощью PHP или Perl собственный веб-сайт для учета музыкальных дисков. Но использование этих языков для доступа к mysql - это уже тема для отдельной статьи.

SQL-запросы для простых смертных

SQL-запросы для простых смертных

Скачать книгу SQL-запросы для простых смертных
Книги по SQL — SQL-запросы для простых смертных
SQL-запросы для простых смертных
За несколько последних лет из языка, известного только специалистам в области компьютеров, SQL превратился в широко используемый международный стандарт. Общее количество совместимых с SQL и поставляемых каждый год баз данных сейчас исчисляется миллионами. Если вы обращаетесь к корпоративной информации в Интернет или по внутренней сети, то вы, вероятно, пользуетесь SQL. Книга SQL-запросы для простых смертных поможет начинающим пользователям изучить основы SQL-запросов и станет необходимым справочным руководством для опытных и продвинутых пользователей.
SQL-запросы для простых смертных. Описание книги по SQL
Книга SQL-запросы для простых смертных является превосходным введением в запросы SQL и хорошо дополняет предыдущую книгу Проектирование базы данных для простых смертных, вышедшую в издательстве Addison-Wesley. Можно сказать, что это даже более хорошее введение, чем первая книга. Реальный программист (т.е. простой смертный) тратит больше времени на написание запросов SQL и меньше — на проектирование самой базы данных. Схемы составляют высокооплачиваемые администраторы баз данных, владеющие отдельными кабинетами и спортивными автомобилями. Большинство программистов занимаются тем, что пытаются заставить SQL работать в условиях жестко заданной схемы.
В силу своей профессии я настраиваю базы данных и преподаю расширенный SQL, поэтому могу подтвердить, что большинство текстов на SQL настолько же
привлекательны для чтения, как и египетские иероглифы. Как только программа начинает работать, программист, написавший ее, переходит к решению следующей задачи, никогда не оглядываясь на то, что было сделано. И когда с этой программой что-то не так, другой человек посылает отчаянные сообщения дискуссионным группам в Интернет, где Джон и Майк спасут его несколькими мудрыми словами и переписыванием кода. Они годами помогали людям решать их проблемы, связанные с SQL. Наконец настало время изложить все это в книге, которой может воспользоваться каждый!
Совсем нетрудно и не требуется иного времени, чтобы написать хорошую программу. Если вы понимаете, что делаете, то большинство проблем решается совсем просто. Прежде всего необходимо изучить основы. Данная книга предоставляет вам шанс изучить эти основы в понятной и хорошо написанной форме. Затем необходимо понять, когда и как приспособить простое решение к конкретной СУБД и конкретной реализации SQL. Когда основы будут надежно усвоены, обратитесь ко мне, и я научу вас действительно нетривиальным вещам.
https://sql-language.ru/knigi-po-sql/sql-zaprosy-dlya-prostyx-smertnyx.html

Скачать книгу SQL-запросы для простых смертных

Автор: Майкл Хернандес, Джон Вьескас.
Серия: Самоучитель
Издательство: Лори, 2003 г.
Страниц: 480
ISBN: 5-85582-178-1, 0-201-43336-2
Форматы: PDF

Знакомство с WinBinder

Знакомство с WinBinder

Автор: Притолюк Максим (f0rm4t)
Примечание автора: В этой статье только теория
Язык PHP очень функционален, огромную роль на себя берут подключаемые к интерпретатору библиотеки с различными функциями. Сегодня PHP благодаря подключаемым библиотекам может обрабатывать самые популярные форматы файлов, работать с известными протоколами и многое другое.

Не так давно на свет появилась еще одна не менее полезная библиотека - WinBinder. Она позволяет создавать GUI-приложения для Windows на языке PHP. Грубо говоря, WinBinder - библиотека и набор скриптов с необходимыми функциями.

Взять дистрибутив можно здесь: http://winbinder.org/download.php. Для начала лучше скачать набор, приготовленный разработчиками, а потом, при желании, подключить к нему другие библиотеки. Текущая версия - 0.46.0 (alpha). Обратите внимание, пока только альфа версия, но проект активно развивается.

При установке можно выбрать, какую версию PHP использовать - 4, 5 или 5.1. Если выбрать 5 или 5.1, то инсталлятор сам скачает библиотеки для этих версий, но только библиотеки. Я выбрал 4 и 5, в принципе можно обойтись только четверкой, но, помнется, в прошлых версиях была проблема невозможности работать с MySQL, которая решалась обновлением PHP до 5-ой версии.

В комплект входит интерпретатор PHP с библиотеками GD2, SQLite, FreeImage и WinBinder, документация на английском языке, несколько скриптов с различными функциями и большое количество примеров. Исполняемые файлы имеют расширение PHPW и представляют собой обычные текстовые файлы, которые можно просмотреть любым текстовым редактором. Рекомендую так же настроить любимый редактор на подсветку таких файлов, так же как и файлов PHP.

Если вы хотите использовать PHP 5-ой версии, то должны скачать архив с минимальным набором PHP 5 (php50_minimal.zip) с той же страницы что и сам WinBinder. Этот архив нужно распаковать в папку binaries\php50 и скопировать файл php.ini из папки php4 в php50 и убрать из него строки extension=php_gd2.dll и extension=php_sqlite.dll. Затем нужно ассоциировать файлы *.phpw с приложением php-win.exe в папке php50.

Надо заметить, что приложения, написанные с использованием библиотеки WinBinder, получаются очень маленькими, по сравнению с полноценными языками программирования, которые специально придуманы для системного программирования. Это объясняется тем, что это всего лишь скрипты, и они не могут работать без своего интерпретатора.

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

Смотрите продолжение: WinBinder. Создание форм