Подготовка
Я выбрал CentOS 6, как операционную систему для машины, на которой я буду разворачивать веб сервер. В качестве веб сервера я выбрал apache2, так как я с ним больше знаком. В качестве СУБД было выбрано MySql, так как таблицы мы будем использовать небольшие, поэтому я считаю, что это самый оптимальный выбор. Я не буду описывать установку CentOS, apache, MySql, так как такие посты уже есть на хабре.
Меняем конфиг MySql /etc/my.cnf:
[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock user=mysql default-character-set=latin1 init-connect='SET NAMES latin1' character-set-server=latin1 init-connect='SET NAMES latin1' collation-server=latin1_general_cs skip-character-set-client-handshake #character_set_system=utf8 # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid [mysql] default-character-set=latin1 [client] default-character-set=latin1
Я использовал кодировку latin1, так как с другими кодировками я не смог добиться правильного отображения русских символов.
Установим пароль для root на MySql:
mysqladmin -u root password sqlpass
password — пароль системный
sqlpass — пароль который будет установлен на в ход в MySql
Заходим в консоль MySql:
mysql -u root -p'sqlpass'
Создаем дазу данных:
CREATE DATABASE `otkritiya`;
Создаем таблицы:
use otkritiya CREATE TABLE `ot` ( `id` int(11) NOT NULL AUTO_INCREMENT, `zakazchik` varchar(100) DEFAULT NULL, `brend` varchar(100) DEFAULT NULL, `gorod` varchar(100) DEFAULT NULL, `adress` varchar(300) DEFAULT NULL, `ticket` varchar(50) NULL, `type` varchar(100) DEFAULT NULL, `data` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`) ); CREATE TABLE `ololo` ( `raz` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL, `dva` varchar(50) CHARACTER SET latin1 DEFAULT NULL, `tri` varchar(50) CHARACTER SET latin1 DEFAULT NULL, `qw` varchar(50) CHARACTER SET latin1 DEFAULT NULL, `qe` varchar(50) CHARACTER SET latin1 DEFAULT NULL, `qr` varchar(50) CHARACTER SET latin1 DEFAULT NULL, `qt` varchar(300) COLLATE utf8_unicode_ci DEFAULT NULL, `qy` varchar(50) CHARACTER SET latin1 DEFAULT NULL, `qa` varchar(50) CHARACTER SET latin1 DEFAULT NULL, `qs` varchar(50) CHARACTER SET latin1 DEFAULT NULL, `sa` varchar(50) CHARACTER SET latin1 DEFAULT NULL, `qf` varchar(50) CHARACTER SET latin1 DEFAULT NULL, `qg` varchar(50) CHARACTER SET latin1 DEFAULT NULL, `qu` varchar(50) CHARACTER SET latin1 DEFAULT NULL, `qi` varchar(50) CHARACTER SET latin1 DEFAULT NULL, `qj` varchar(50) CHARACTER SET latin1 DEFAULT NULL, `qo` varchar(50) CHARACTER SET latin1 DEFAULT NULL, `qp` varchar(50) CHARACTER SET latin1 DEFAULT NULL, `qd` varchar(50) CHARACTER SET latin1 DEFAULT NULL, `qh` varchar(50) CHARACTER SET latin1 DEFAULT NULL, `qk` varchar(50) CHARACTER SET latin1 DEFAULT NULL, `ql` varchar(50) CHARACTER SET latin1 DEFAULT NULL, `qz` varchar(50) CHARACTER SET latin1 DEFAULT NULL, `qx` varchar(50) CHARACTER SET latin1 DEFAULT NULL, `qc` varchar(50) CHARACTER SET latin1 DEFAULT NULL, `qv` varchar(50) CHARACTER SET latin1 DEFAULT NULL, `qb` varchar(50) CHARACTER SET latin1 DEFAULT NULL, `nv` varchar(50) CHARACTER SET latin1 DEFAULT NULL, `qn` varchar(50) CHARACTER SET latin1 DEFAULT NULL, `qm` varchar(50) CHARACTER SET latin1 DEFAULT NULL, `we` varchar(50) CHARACTER SET latin1 DEFAULT NULL, `wr` varchar(50) CHARACTER SET latin1 DEFAULT NULL, `wt` varchar(50) CHARACTER SET latin1 DEFAULT NULL, `wy` varchar(50) CHARACTER SET latin1 DEFAULT NULL, `wu` varchar(50) CHARACTER SET latin1 DEFAULT NULL, `wi` varchar(50) CHARACTER SET latin1 DEFAULT NULL, `wo` varchar(50) CHARACTER SET latin1 DEFAULT NULL, `wp` varchar(50) CHARACTER SET latin1 DEFAULT NULL, `wa` varchar(50) CHARACTER SET latin1 DEFAULT NULL, `ws` varchar(50) CHARACTER SET latin1 DEFAULT NULL, `f` char(50) CHARACTER SET latin1 DEFAULT NULL, `e` char(50) CHARACTER SET latin1 DEFAULT NULL, `c` char(50) CHARACTER SET latin1 DEFAULT NULL, `d` char(50) CHARACTER SET latin1 DEFAULT NULL );
В таблицу ololo будут загружаться данные из Google docs. Количество столбцов таблицы MySql должно быть равно количеству столбцов таблицы Google docs. В таблицу ot будут добавляться данные из таблицы ololo, которые нам необходимо отображать на сайте.
Начнем
Синхронизация с Google docs.
Так как я плохо знаю php я решил задачу синхронизации Google docs и MySql при помощи bash скрипта и демона crond
Создадим папку:
mkdir /home/google
Выкачиваем файл в формате txt с Google docs в папку /home/googl с именем test.txt (что бы скачать файл с Google docs нужно в конце ссылки после слова sharing добавить output=txt):
wget --no-check-certificate --output-document=/home/google/test.txt 'https://docs.google.com/spreadsheet/ccc?key=0Aq38OdEhOxztdG81eXcjJO9TMEttS182aXl2VWc&usp=sharing&output=txt'
Переносим файл в папку нашей базы данных:
cp /home/google/test.txt /var/lib/mysql/otkritiya/
Меняем права на этот файл:
chmod 777 /var/lib/mysql/otkritiya/test.txt
Без этого у меня не получалось выгрузить данные из файла в таблицу Mysql.
Выгружаем данные из файла в таблицу:
mysql -u root -p'sqlpass' -e "LOAD DATA INFILE 'test.txt' INTO TABLE otkritiya.ololo IGNORE 2 LINES;"
Так как в начале моего файла есть две строки, которые мне не нужны в базе я использую «IGNORE 2 LINES»
Теперь добавляем в таблицу ot необходимые данные из таблицы ololo:
mysql -u root -p'sqlpass' -e "use otkritiya; insert into ot (zakazchik , brend , gorod , adress , ticket , type , data) select ololo.dva , ololo.tri , ololo.qe , ololo.qt , ololo.qy , ololo.qa , STR_TO_DATE(ololo.wo , '%d.%m.%Y') from ololo where ololo.qy <> '' and ololo.qy not in (select ot.ticket from ot where ot.ticket is not null);"
Подробно по поводу последней команды: используем конструкцию select insert для вставки данных из одной таблицы в другую, функция STR_TO_DATE(ololo.wo, ‘%d.%m.%Y’) преобразует текст в формате дд.мм.гггг в дату в формате гггг-мм-дд, условия для select два: 1) ololo.qy <> » — поле с номером заявки не пустое и 2) ololo.qy not in (select ot.ticket from ot where ot.ticket is not null) — в этом условие мы проверяем, что номер заявки из таблицы ololo не совпадает c номером заявки в таблице ot, чтобы избежать дублирования строк.
В итоге мы получили всю необходимую информацию из Google docs в таблицы ot.
Автоматизируем данный процесс, так как документ Google docs постоянно дополняется.
Мой bash скрипт:
wget --no-check-certificate --output-document=/home/google/test.txt 'https://docs.google.com/spreadsheet/ccc?key=0Aq38OdEhOxztdG81eXczMjJObE9TMEttS182aXl2VWc&usp=sharing&output=txt' rm -rf /var/lib/mysql/otkritiya/test.txt cp /home/google/test.txt /var/lib/mysql/otkritiya/ chmod 777 /var/lib/mysql/otkritiya/test.txt mysql -u root -p'sqlpass' -e "truncate table otkritiya.ololo;" mysql -u root -p'sqlpass' -e "truncate table otkritiya.ot;" mysql -u root -p'sqlpass' -e "LOAD DATA INFILE 'test.txt' INTO TABLE otkritiya.ololo IGNORE 2 LINES;" mysql -u root -p'sqlpass' -e "use otkritiya; insert into ot (zakazchik , brend , gorod , adress , ticket , type , data) select ololo.dva , ololo.tri , ololo.qe , ololo.qt , ololo.qy , ololo.qa , STR_TO_DATE(ololo.wo , '%d.%m.%Y') from ololo where ololo.qy <> '' and ololo.qy not in (select ot.ticket from ot where ot.ticket is not null);" rm -rf /home/google/test.txt rm -rf /var/lib/mysql/otkritiya/test.txt
В моем скрипте постоянно обнуляется не только таблица ololo, но и таблица ot, так как в моем случае возможен вариант не только дополнения информации в таблицы Google docs, но и изменения существующей (mysql -u root -p’sqlpass’ -e «truncate table otkritiya.ot;» mysql -u root -p’sqlpass’ -e «truncate table otkritiya.ololo;»).
Создаем саму веб страницу.
Вот пример моей страницы index.php:
<head> <meta http-equiv="refresh" content="300"> <title>Счетчик Открытий</title> <style style="text/css"> #top_header{ width:1600px; margin:0 auto; height:300px; } #central_header{ margin:0 auto; height:800px; text-align:center; } .letter { color: #FFFFFF; } .count_down{ padding: 3px; font-family:Georgia, "Times New Roman", Times, serif; font-size:24px; border-bottom: 2px solid red; font-weight:900; color:#CD0000; } .count_down sup{ font-family:"Lucida Grande", "Lucida Sans Unicode", Verdana, Arial, Helvetica, sans-serif; font-size:11px; color:#CD0000; font-weight:900; } .text { color:#000000; text-align: center; } </style> <script type="text/javascript" src="js/jquery-1.3.2.min.js"></script> <script type="text/javascript" src="js/countdown.js"></script> <script type="text/javascript" src="js/countdown2.js"></script> </head> <body> <div class="text"> <h1>Открытия\Реконструкции ТТ</h1> </div> <?php $nom = 0; $zak = 0; $bre = 0; $gor = 0; $adr = 0; $tic = 0; $typ = 0; $otk = 0; include 'bebebe.php'; ?> <div id="central_header"> <div id="count_down_container"></div> <script type="text/javascript"> var target_date=new cdtime("count_down_container", " <?php include 'ololo.php'; ?> 10:0:00") target_date.displaycountdown("days", displayCountDown) </script> <p><span class="letter">L</span></p> <?php $nom = 0; $zak = 0; $bre = 0; $gor = 0; $adr = 0; $tic = 0; $typ = 0; $otk = 0; include 'bebebe2.php'; ?> <div id="central_header"> <div id="count_down_container2"></div> <script type="text/javascript"> var target_date=new cdtime("count_down_container2", " <?php include 'ololo2.php'; ?> 10:0:00") target_date.displaycountdown("days", displayCountDown) </script>
Было необходимо, чтобы счетчик считал в режиме реального времени, а не после обновления страницы, поэтому пришлось использовать java скрипт (я не знаком с java скриптами, поэтому тот что я использую здесь, я подсмотрел на каком то сайте). Скрипту для работы необходимо передавать: день, месяц, год, время. День, месяц и год передаются скрипту из таблицы ot с помощью php скрипта ololo.php, а время задано вручную, так как оно не меняется 10:0:00. Мне было необходимо на одной странице использовать несколько счетчиков и я не нашел более хорошего способа для этого, кроме как добавить для каждого счетчика свой отдельный div.
Пример моего php скрипта для передачи данных java скрипту:
<?php $host='localhost'; $database='otkritiya'; $user='root'; $pswd='sqlpass'; $dbh = mysql_connect($host, $user, $pswd); mysql_select_db($database); $query = "SELECT DAYOFMONTH(data) , MONTH(data) , YEAR(data) FROM `ot` WHERE TO_DAYS(NOW()) - TO_DAYS(data) <= 2 order by data asc limit 0,1"; $res = mysql_query($query); while($row = mysql_fetch_array($res)) { $ol = $row['DAYOFMONTH(data)']; $lo = $row['MONTH(data)']; $ye = $row['YEAR(data)']; }; echo "$lo $ol, $ye" ?>
С помощью функций DAYOFMONTH, MONTH, YEAR мы получаем номер дня, месяца и года. Условие TO_DAYS(NOW()) — TO_DAYS(data) <= 2 нужно, чтобы получать только те строки, где дата не старше, чем два дня назад. Сортировка order by data asc нужна чтобы сортироваться по дата от меньшего к большему.Limit 0,1 выдает только одну первую строку (в следующих файлах первая цифра будет меняться что бы брать из этого же запроса только вторую строчку например 1,1 и т.д.).
Пример моего php скрипта, показывающего строку с данными (bebebe.php):
<head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /> <style style="text/css"> .color { color: #8B8378; front-family: 'Times New Roman', Times, serif; font-style: italic; font-size: 14pt; font-weight: normal; text-align: center; } .shir { color: #000000; front-family: 'Times New Roman', Times, serif; font-size: 14pt; font-weight: 900; text-align: center; } </style> </head> <body> <div class="shir"> <?php $host='localhost'; $database='otkritiya'; $user='root'; $pswd='sqlpass'; $dbh = mysql_connect($host, $user, $pswd); mysql_query('SET NAMES latin1'); mysql_select_db($database); $query = "select * from ot where TO_DAYS(NOW()) - TO_DAYS(data) <= 2 order by data asc limit 0,1"; $res = mysql_query($query); while($row = mysql_fetch_array($res)) { $nom = $row['id']; $zak = $row['zakazchik']; $bre = $row['brend']; $gor = $row['gorod']; $adr = $row['adress']; $tic = $row['ticket']; $typ = $row['type']; $otk = $row['data']; }; echo '<span class="color">№: </span>'; echo "$nom |"; echo '<span class="color">Заказчик: </span>'; echo "$zak |"; echo '<span class="color">Бренд: </span>'; echo "$bre |"; echo '<span class="color">Город: </span>'; echo "$gor |"; echo '<span class="color">Адрес: </span>'; echo "$adr |"; echo '<span class="color">№ Заявки: </span>'; echo "<a href='http://componysite.com/task.jsp?id=".$tic."'>".$tic."</a> |"; echo '<span class="color">Тип работ: </span>'; echo "$typ |"; echo '<span class="color">Открытие: </span>'; echo "$otk"; ?> </div> </body> </html>
echo "<a href='http://componysite.com/task.jsp?id=".$tic."'>".$tic."</a> |";
— делаем номер заявки ссылской на корпоративную информационную систему.На выходе я получил страницу со счетчиком и строкой данных, но счетчиков и строк данных мне надо вывести на страницу 45 штук для этого необходимо сделать 45 копий файлов ololo.php, bebebe.php и countdown.js с несколькими изменениями, этот процесс я автоматизировал при помощи скриптов:
Копирование:
#!/bin/bash for i in 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 do cp ololo.php ololo$i.php cp bebebe.php bebebe$i.php cp js/countdown.js js/countdown$i.js done
Замена значения limit:
#!/bin/bash for i in 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 do a=$(($i - 1)) b=$(($i + 100)) sed "s/0,1/$a,1/g" bebebe.php > bebebe$b.php && mv bebebe$b.php bebebe$i.php done
Теперь можно зайти на веб страницу ваш_ip/ и посмотреть результат.
ссылка на оригинал статьи http://habrahabr.ru/post/213213/
Добавить комментарий