Tips And Tricks

Список полезных классов и библиотек для 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'");

ZF FAQ: Минимальный bootstrap.php

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

Сегодня открываю в своем блоге раздел Zend Framework FAQ. Куда соотвественно буду писать различные вопросы-ответы по теме программирования в Zend Framework.

Итак, вопрос:

Каким должен быть минимальный bootstrap.php?

Ответ:

Создайте файл application/Bootstrap.php

и его содержимое как минимум должно быть таким:

PHP:
  1. class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
  2. {
  3. }

Класс Bootstrap появился с версией 1.8. Поэтому при переходе с 1.7 на 1.8 учтитывайте это.

Отчет DOU от LinkAider.com

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

Привет!

В интернете появился новый сервис анализа сайтов - LinkAider.com. В основном он будет полезен SEO и веб-мастерам.

Решил на нем проверить сайт developers.org.ua, было проверено 10,000 страниц и 948,485 ссылок. Каждая страница запрашивалась не чаще, чем 1 раз в 2 секунды, вложенность кравла не ограничена и кравлер учитывал правила robots.txt.

Резултаты проверки DOU.

Что интересного в отчете:

1. Было найдено 1,288 битых ссылок на 713 страницах, это 0.001% от общего количества проверенных ссылок, что очень хорошо.

2. Среднее количество ссылок на странице 94,85, но есть страницы на которых 500 и более ссылок, отчет.

3. Также есть страницы размер которых выше 500Кб, отчет.

4. Заголовок (мета тег Title) "Средние зарплаты - сообщество программистов" повторяется на 2,182 страницах (это 20% от просмотренных страниц!) и "developers.org.ua › Log In" повторяется на 1,708 страницах.

Битые ссылки, чаще всего это 404 ошибка, всегда являлась проблемой для любого сайта. Такие страницы могут говорить о проблеме в коде этой страницы или о банальной опечатке при наборе ссылки.
Большое количество ссылок на странице, может сигнализировать о наличии спам ссылок на опасные(вирусные) или запрещенные сайты.
Страницы размером свыше 1Мб, могут быть не доступны для некоторого сегмента пользователей и такие страницы создают избыточную нагрузку на сервер.
Повторение заголовков плохо сказывается на SEO сайта, что уменьшает ее вес в поисковиках, таких как Google

Регистрируйтесь и высказывайте свое мнение по сервису, регистрация бесплатно.

Все мнения будут учтены.

С уважением, Web developer LinkAider.com

Del.icio.us : , , ,
Technorati : , , ,