Tips And Tricks

MySQL меняем storage engine в нескольких таблицах на InnoDB

Posted in Development, MySQL, Tips And Tricks on November 17th, 2009 by Yaroslav Vorozhko – 3 Comments

Задача изменить storage engine для всех таблиц mysql в одной базе данных.

Это решение работает для тех таблиц, которые имеют одинаковый префикс, например для таблиц wordpress и других CMS поддерживающих префиксы.

Коротко, задача решается получением списка всех таблиц в один файл, с помощью замены строк строятся правильные SQL команды и последнее - надо выполнить команды.

1)Получаем список таблиц в файл:

CODE:
  1. mysql -u username -ppassword -D dbname -e "show tables"> outputfile.txt

2)Открываем файл outputfile.txt например в vim и делаем следующие замены:

  • Префикс меняем на ALTER TABLE prefix_ - для vim: %s/prefix_/ALTER TABLE prefix_/g
  • Перенос строки меняем на ENGINE=InnoDB плюс перенос строки - для vim: %s/\n/ ENGINE=InnoDB;\r/g

3)Выполняем скрипт, но прежде делаем бэкап базы:

CODE:
  1. mysqldump -u username -ppassword -D dbname> dbname.sql
  2. mysql -u username -ppassword -D dbname <outputfile.txt

Может кто нибудь подскажет как сделать то же самое для таблиц без одинакового префикса?

Ответы на вопросы в интервью по веб разработке

Posted in Development, Self Development, Tips And Tricks on August 25th, 2009 by Yaroslav Vorozhko – 3 Comments

Антон Шевчук написал хороший список вопросов для интервью по приему на работу веб разработчиков. Я хочу предложить вам краткие комментарии и советы по каждому из вопросов, надеюсь это поможет вам лучше ориентироваться в мире веб разработки и поможет пройти интервью.

- С какими PHP библиотеками, фреймворками знакомы?
Соискатель должен знать о существовании таких фреймворков как Zend Framework, CakePHP, CodeIgniter или Symfony, и желательно иметь опыт работы с одним из них (список можно расширить – это не так принципиально).

За 4 с лишним лет работы PHP разработчиком я познакомился с тремя из перечисленных фреймворков, и активно использую Zend Framework.
Знание различных фреймворков дает вам понимание и идеи как писать код. Этим путем обязан пройти каждый разработчик. Изучайте и участвуйте в развитии Open Source проектов - это даст вам большой опыт, по сравнении с тем, который вы способны сами получить в аналитическом мышлении. Отвечая на этот вопрос будет уместно рассказать о своих способностях к проектированию и архитектурному мышлению.

- С какими API приходилось работать?
Интересуют Google API, AMF PHP, различные payment gateway, Facebook API, Twitter API и т.д.

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

- Есть ли опыт работы с различными CMS?
Опыт работы не как web-мастера, а как программиста…

Думаю компания использует некоторые CMS в своих проектах. Расскажите подробно про ту CMS с которой вы знакомы или пусть даже про свою само-писанную с которой довелось работать.

- Работал с PHP 4? Назови различия с 5-ой версией.
- Что нового в PHP 5.3?
- Типы данных в PHP?
Этот вопрос на добивание, он часто ставит в тупик, если человек отвечает что их восемь, а потом начинает их перечислять, значит он готовился к собеседованию :)

Все ответы есть в PHP мануале, просто RTFM.

- Что такое сериализация?
- Что самое сложное разрабатывали на PHP?
Этот вопрос может расставить все точки над “i”, но не стоит его задавать в самом начале – это пугает…

Второй вопрос очень хорош, и может быть даже решающим. Я бы рассказал здесь про проектирование, архитектуру и применение OOP в своем последнем проекте или в своем самом интересном проекте. Также, добавил бы про высокую оптимизацию приложения и работу с большими массивами данных. А, если вы работали с какими то «экзотическими», но мега-полезными библиотеками, такими как Sphinx Search, Lucene или может с чем то уникальным в вашей компании, то об этом также стоит рассказать.

- Какие шаблоны проектирования знаешь? Расскажи в чем соль каждого?
- Что есть MVC? Какую роль выполняет каждый из составляющих элементов?

Шаблоны проектирования или design patterns являються не чем иным, как распространенными методами решения типичных задач. Кто внимательно читал книгу «Банды четырех» или «Архитектура корпоративных программных приложений» Фаулера, тот ответит на этот вопрос даже с неким удовольствием.

- С какими web-серверами работал? Apache? Nginx? IIS?
- Можешь описать как можно подробнее, что происходит между тем, как пользователь ввёл в адресной строке http://google.com и тем, как браузер показал страницу?
– Системы контроля версий? SVN? CVS? Git? Что есть branch/trunk/tags?
– Багтрекинг системы?

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

Немного мучаю по БД:
- С какими БД работал? Что такое транзакции, хранимые процедуры, тригеры?
- Коль работал с MySQL то сможешь назвать различия между версиями 4.1, 5.0, 5.1?
- Каковы различия между MyISAM и InnoDB?

Все это есть в мануале MySQL, и как минимум теоретически знания по дополнительным возможностям MySQL у разработчика должны быть.
Типов storage engine не так уже и много и знать про характеристики основных двух надо обязательно.
Если вы имеете более 3 лет опыта работы в веб разработке на php, python, perl, то скорее всего вы начинали с mysql 3.23 и по мере эволюции MySQL представляете различия и возможности новых версий. Поэтому этот вопрос не должен вас сбить с ног.

И для полноты знаний web-разработчика естественно не хватает вопросов о HTML, CSS, Javascript:
- Ваша субъективная оценка своих знаний по CSS по пятибальной шкале?
- Приходилось ли верстать сайт?
- Почему CSS это каскадные таблицы стилей?
- Что здесь написано? Напишите HTML код к которому будет применен данный стиль.

PHP:
  1. #my p.sel:first-line, .main li li a:hover + span
  2. {
  3. color:#f00; /* Что это за цвет? */
  4. }

Уметь читать, понимать и писать CSS это разные вещи. Если вы обладаете первыми двумя навыками, этого достаточно, умеет верстать отлично.

- Ваша субъективная оценка своих знаний по Javascript’у?
- Что самое сложное разрабатывали с использованием Javascript’a?
- С какими Javascript фреймворками работали? Какие плагины использовали? Писали ли плагины, виджеты?
Интересуют jQuery/UI, Prototype/Aculo, MooTools/MochaUI, Dojo Toolkit, ExtJs.
- Каким образом можно реализовать наследование в Javascripte?
- Что такое AJAX и как он работает?
- Что такое JSON? С JSONP сталкивались?

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

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

Список книг обязательных к прочтению, которые помогут вам в веб разработке:

Список полезных классов и библиотек для PHP разработчиков

Posted in Development, PHP, Tips And Tricks on August 12th, 2009 by Yaroslav Vorozhko – Be the first to comment

Saud Khan из w3avenue собрал хороший список полезных библиотек и классов для PHP разработчиков.

Особенно полезным список будет для начинающих.

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

Список включает в себя следующие разделы:

  • Базы данных
  • Разработка
  • Документация
  • Email
  • Формы
  • HTML/CSS
  • Image/Media/File
  • Javascript/Ajax
  • Microformats
  • RSS & Atom Feeds
  • Безопасность
  • Тестирование и отладка
  • Веб сервисы

В общем хорошая подборка практически на все нужды разработки.

Не поленитесь изучить! ;-)

Zend Mail как вложить изображение в письмо

Posted in Tips And Tricks, ZendFramework on August 11th, 2009 by Yaroslav Vorozhko – Be the first to comment

Есть два варианта добавить картинку в почтовое html сообщение.
1. Использовать удаленный сервер для загрузки сообщения.
2. Вложить сообщение в письмо и ссылаться на него в html документе.
Первый способ очень простой и не требует программирования:

PHP:
  1. <img src="http://somededicateserver.com/images/logo.gif" />

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

PHP:
  1. $html = $this->_request->getParam('html','');//в html у нас храниться исходный HTML код сообщения
  2. $mail = new Zend_Mail('UTF-8');
  3. //убедитесь, что файл существует и доступен для чтения
  4. $filename = '/path/htdocs/img/logo.gif';
  5. if (is_readable($filename)) {
  6.   $mail->setType(Zend_Mime::MULTIPART_RELATED);   
  7.   $at = $mail->createAttachment(file_get_contents($filename))
  8.   $at->type = 'image/gif'
  9.   $at->disposition = Zend_Mime::DISPOSITION_INLINE
  10.   $at->encoding = Zend_Mime::ENCODING_BASE64
  11.   $at->id = 'cid_' . md5_file($filename);
  12.   $html = str_replace('file://attached_image''cid:' . $at->id$html);   
  13. }
  14. $mail->setBodyHtml($html, 'UTF-8', Zend_Mime::ENCODING_8BIT);

Внутри html сообщения у нас есть специальная строка (file://attached_image), ссылка на изображение:

PHP:
  1. <img src="file://attached_image" />

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

PHP:
  1. <img src="cid:cid_4b3fdb60e9422ce97926cc8d3b601188" />

Все, отправляем письмо и проверяем результат.

PHP скрипт анализа логов

Posted in PHP, Tips And Tricks on July 31st, 2009 by Yaroslav Vorozhko – Be the first to comment

Задача была написать скрипт анализа логов, включая:

  • обработку повторяющихся ошибок
  • подсчетом количества повторов ошибок
  • хранение времени появления первого и последнего повтора ошибки
  • отправка каждой ошибки на email
  • хранение последней позиции курсора файла в первой строке лога

Формат лога представлял собой следующее:

PHP:
  1. 2009-07-23T10:25:11+00:00  DEBUG (7): Resource 'demo' not found
  2. 2009-07-24T17:10:20+00:00  DEBUG (7): Resource 'photos' not found
  3. 2009-07-24T17:11:22+00:00  DEBUG (7): Resource 'photos' not found

Т.е. одна ошибка в одну строку.

После обработки их скриптом, мы получали email с сообщением следующего формата, одна строка это одно сообщение:

PHP:
  1. DEBUG (7): Resource 'photos' not found - 2 times, first time - 2009-07-24 17:10:20 GMT, last time - 2009-07-24 17:11:22 GMT
  2. DEBUG (7): Resource 'demo' not found - 1 time, 2009-07-23 10:25:11 GMT

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

Вот собственно и сам log_analyzer.php:

PHP:
  1. define('ERROR_LOG_PATH', BASE_PATH.'/logs/error.log');
  2.  
  3. $fp = fopen(ERROR_LOG_PATH, 'r+');
  4. $position = fgets($fp);
  5. $position = intval($position);
  6.  
  7. fseek($fp, $position);
  8.  
  9. $time = strtotime("-7 minutes");
  10. $grabLog = false;
  11. $sphinxErrors = $sphinxWarnings = array();
  12. $errors = array();
  13. while(!feof($fp)){
  14.     $line = fgets($fp);
  15.     if( preg_match("/^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[+-]\d{2}:\d{2})/",$line, $matches) === 1 ){
  16.         $datetime = $matches[1];
  17.     } else {
  18.          continue;
  19.     }
  20.     $errorLine = str_replace($datetime, '', $line);
  21.     $formattedTime = date("Y-m-d H:i:s T", strtotime($datetime));
  22.     if (!isset($errors[$errorLine])){               
  23.         $errors[$errorLine]['firsttime'] = $formattedTime;
  24.         $errors[$errorLine]['lasttime'] = $formattedTime;
  25.         $errors[$errorLine]['times'] = 1;
  26.     } else {
  27.         $errors[$errorLine]['lasttime'] = $formattedTime;
  28.         $errors[$errorLine]['times']++;
  29.     }
  30.    
  31. }
  32. $newPosition = ftell($fp);
  33.  
  34.  
  35. if ( !rewind($fp) ) {
  36.     echo 'not working';
  37. }
  38. fwrite($fp, $newPosition."        \n");
  39. fclose($fp);
  40.  
  41.  
  42. if (!empty($errors)){
  43.     foreach ($errors as $text => $error){
  44.         if ($error['times']> 1){
  45.             $body = sprintf("%s - %s times, first time - %s, last time - %s",
  46.                 $text, $error['times'], $error['firsttime'], $error['lasttime']);
  47.         } else {
  48.             $body = sprintf("%s - %s time, %s",
  49.                 $text, $error['times'], $error['firsttime']);
  50.         }
  51.         Mail_Notifications::notifyError($body);
  52.     }
  53. }

Скрипт я запускаю с помощью cron каждые 7 минут.

Комментарии

Как установить кодировку по умолчанию для Zend View ?

Posted in Tips And Tricks, ZendFramework on July 30th, 2009 by Yaroslav Vorozhko – 2 Comments

Как установить кодировку по умолчанию для Zend View ?

Первый способ, если вы используете Zend_Application:
В application.ini:
resources.view.encoding = "ISO-8859-1"

И второй вы можете вручную установить ее для объекта Zend_View:
$view = new Zend_View();
$view->setEncoding("ISO-8859-1");
$viewRenderer =
Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
$viewRenderer->setView($view);

ZF FAQ: установка кодировки при подключении к БД

Posted in Tips And Tricks, ZendFramework on July 28th, 2009 by Yaroslav Vorozhko – Be the first to comment

Привет!
Вопрос: Как установить кодировку utf8 при подключении к базе данных?

В версии Zend Framework 1.8, если вы используете Zend_Application, кодировка устанавливается через конфигурационный файл.

PHP:
  1. [production]
  2. resources.db.adapter = "pdo_mysql"
  3. resources.db.params.host = "localhost"
  4. resources.db.params.username = "YOURUSER"
  5. resources.db.params.password = "YOURPASS"
  6. resources.db.params.dbname = "YOURDB"
  7. resources.db.params.charset = utf8
  8. resources.db.isDefaultTableAdapter = true

В версии 1.7, кодировку можно установить при явном подключении к БД или при использовании конфигурационного файла, ниже приведен пример как установить кодировку явно.

PHP:
  1. $config = Zend_Registry::get('dbConfig');
  2.  
  3. $db = Zend_Db::factory($config->db->adapter, $config->db->config->toArray());
  4. Zend_Db_Table::setDefaultAdapter($db);
  5. Zend_Registry::getInstance()->set('db', $db);
  6.        
  7. $db->query("set names utf8");
  8. $db->query("set time_zone = '+0:00'");