О блоге

@nger-блог - место, где Вы можете почитать про меня и события в моей жизни, а также найти интересные материалы, собранные из разных уголков Всемирной Сети

Rss -каналы

Схема работы с Subversion из-под Windows

В предыдущей заметке я уже писал, что решил перенести выполнение скриптов на виртуальную машину ака Linux сервер. Мотив тогда был немного прозаичнее, чем просто желание покрутить на линуксе код – у меня начались глюки с веб-сервером под виндой. Видимо, стояла не-thread-safe сборка php и скрипты при параллельной загрузке начали валиться, видеть память друг друга и т.д.

Однако, поюзав некоторое время систему “пишу на Windows, выполняю на Linux” я решил откатиться к менее радикальной – “пишу и тестирую на Windows, окончательно проверяю на Linux”.

Суть схемы “пишу и тестирую на Windows, окончательно проверяю на Linux”

Всю разработку я веду под Microsoft Visual Studio с расширениями VS.PHP и VisualSVN. Также, на Windows-хост-машине установлен Tortoise SVN. Для тестирования давно поднят Денвер(мне нравится его система работы с виртуальными серверами, а вернее простой скриптик, добавляющий в hosts инфу о них), в одном из виртуальных серверов которого сделана рабочая копия репозитория с Linux-сервера. Также, стандартный денверовский MySQL выключен, вместо него поставлен MySQL Server 5.0. Однако, он сейчас не используется – главным SQL-сервером стал тот же MySQL 5.0, только на Linux-виртуальной машине. Также, на Linux поднят svn-сервер, FTP-сервер и настроен httpd.

Организация работы.

Имея уже настроенные 2 сервера – тестировочный и почти продакшн, мы можем, во-первых, удобно тестировать проект под разными средами, а во-вторых(дело вкуса), писать под удобным(для кого как, но для меня удобным) Visual Studio, при этом быстро проверяя как себя ведёт код не только под Windows, но и под Linux.

Всю писанину я провожу под Windows. Написав какой-то код, я отлаживаю его на локальном тестировочном сервере. Затем, если всё в порядке – делаю Commit изменений и они вносятся в репозиторий на Linux-SVN-сервере. Затем, SVN, юзая hook post-commit делает chekout(проверку и обновление) рабочей копии в папке /var/www/html на Linux-сервере. То есть при commit’е я сразу вижу обновлённый код в папке Apache под Linux’ом. Далее я уже перехожу к тестированию кода под Linux.

Профилирование и отладка

Заниматься профилированием под Windows, я считаю, не очень выгодно и очень неудобно. А вот отлаживать на Windows вполне себе можно. Начиная с обычных var_dump’ов и заканчивая продвинутой отладкой с breakpoint’ами(правда до этого я ещё не успел дойти).

Гораздо интереснее дела обстоят под Linux. Там также есть xDebug, но ещё есть удобный инструмент профилирования – kCacheGrind. И если его аналог под Windows, WinCacheGrind, глючен и убог, то kCacheGrind очень юзабельный продукт. Естественно, бесплатный. То есть, я занимаюсь основной отладкой под Windows, а профилированием – под основной средой выполнения, то есть Linux.

При внесении правок под Linux, можно не волноваться за Windows-сторону: после изменения кода нужно сделать commit со стороны рабочей копии под Linux-Apache-сервером и на Windows-стороне сделать Update. Тогда обе копии будут идентичны.

Думаю, я разъяснил преимущества, с моей точки зрения, Windows-конструирования и Linux-выполнения. Кто-то предпочитает полностью сидеть в Linux, я же пока к этому не готов. Новички в PHP вообще редко задумываются о Linux-использовании, ведь чтобы поставить Linux, PHP, SVN, MySQL и т.д. это нужно много(мы говорим о новичках) времени и сил. Я же пока остановился на вышеизложенном варианте. Спасибо за внимание.

Комментарии | опубликовано: 2008-07-05 11:54

Отладочный php-сервер на локальной машине - Windows или Linux?

Да, вот такой вот немного странный вопрос - а на чём, собственно, отлаживать скрипты PHP? С одной стороны - Windows более привычна, особенно начинающим, под неё много софта, который можно применить в веб-разработке(например, Visual Studio), да и IE под Linux, мягко говоря, другой. С другой стороны - писать лучше на той платформе, на которой скрипты будут использоваться. Так что же выбрать?

Я решил совместить - писать скрипты под Windows, а сам сервер крутить на Linux. Как? Очень просто. Виртуальная машина. Всё-таки Windows у меня уже несколько лет, поэтому переходить на Linux в ближайшее время не собираюсь, следовательно, мой выбор очевиден - поставить VM на Windows и уже на VM - Linux.

Для начала я скачал виртуальную машину. Microsoft VirtualPC почему-то отказался запускать Linux на виртуалке, VMWare оказался неподъёмным для моего GPRS-канала, а вот VirtualBox подошёл прекрасно - и весит немного, и линукс запустил без ошибок, и бегает шустро. Уже на него я поставил Fedora Core 6(более свежей версии, к сожалению, не нашлось). Стоит отметить, что сначала я приобрёл Mandriva Linux Powerpack 2008 64 bit, однако не учёл одну деталь - Windows XP у меня 32-битная. Поэтому от мандривы пришлось отказаться.

Затем, настроил сеть, поставил PHP, MySQL, некоторые расширения, которые использую в своём проекте, а также SVN и графический клиент под него. Помогла мне в этом эта статья, хоть и написана она для 7 версии, на 6 порядок действий был аналогичен. Затем я восстановил рабочую копию своего проекта на VM и (внимание!) назначил права на файлы - в линуксе апач обязательно требует аттрибута x(eXecutable, исполняемый) для скриптов, пользователям Windows будет немного непривычно.

После этого настал черёд тестов. В среднем, время выполнения уменьшилось с 75(для форума)/100(для сайта) миллисекунд до 29(форум)/22(сайт) миллисекунд. И это с использованием памяти в 70 мегабайт вместо 20(Apache)+96(MySQL)+64(Memcached) = 180 мегабайт на винде. То есть памяти занимает меньше, а работает в 3 раза быстрее даже на виртуальной машине. Загрузка процессора 0%(если выйти из Gnome), загрузка памяти, как я уже сказал, 70 Мб.

Надеюсь, кому-нибудь эта статья окажется полезной - тем, кто хочет попробовать поднять сервер под линуксом(а это задача из непростых для новичка), либо же тех, кому не нравятся текстовые редакторы/среды разработки под линукс. Не очень очевидное совместительство оказалось крайне выгодным сотрудничеством - каждая часть делает то, что у неё лучше получается.

Комментарии | опубликовано: 2008-06-29 20:04

Пара слов о рыбалке

Нет, не о той рыбалке, что на озере, рано утром, под пиво\водку и ухой вечером, а о сборе "рыбы", то есть текстов, нужных лишь для того, чтобы заполнить ими что-то. Дизайнеры, верстальщики используют рыбу для заполнения каких-то блоков информации, когда необходимый контент от заказчика ещё не пришёл. Программисты используют рыбу для проверки БД, скриптов и программ эмулируя действия пользователя, якобы он передаёт какие-то тексты программе. В общем, удел рыбных текстов - тестирование чего-либо, имеющего дело с текстовой информацией.
Создать рыбу можно разными способами:
  • Взять любое художественное произведение и выдрать оттуда главы, которые и будут текстами рыбы
  • Взять любой достаточно большой текст и сгенерировать множество текстов, используя цепи Маркова
  • Взять где-то базу уже нагенерированых текстов
Эти способы пришли мне в голову, особо эту тему я нигде не встречал, поэтому руководствуюсь лишь своим опытом. Вначале для тестирования скриптов я использовал лишь простой генератор записей "добавить строку тест тест тест", однако это не отражает реальных ситуаций - такие записи без проблем кешируются и вообще не очень пригодны для тестирования в условиях, приближённых к боевым.
После этого, используя готовый класс для генерации текстов используя цепи Маркова, я нагенерировал около 1000 текстов, однако, толи класс содержал ошибку(которую мне не очень хотелось искать, а беглый осмотр кода не дал результата), толи звёзды не так встали, но из 900-кб текста Сильмариллиона он выдрал только 3 слова и все тексты содержали только 3 различных слова. Затем я этот же текст разобрал на главы, коих насчиталось около 20. Затраты явно не оправдались. Поэтому я начал искать другой способ генерации рыбы, и тут мне на глаза попался сервис Яндекс.Рефераты. Он создаёт совершенно несвязный текст по заданой тематике, но для тестирования - само то. Далее был написан простенький парсер, который берёт записи по случайным темам. Его код привожу ниже:
<?php

function process_urls($urls)
{
  $errno = 0;
  $errstr = '';
  $texts = array();
  $ids = array();
  $eofs = array();
  $counter = 0;
  while (in_array(false, $ids) || (count($urls) != 0 && count($ids) == 0))
  {
    foreach ($urls as $id => $href)
    {
      if (!isset($ids[$id]) || $ids[$id] === false)
      {
        if ($counter != 0 && ceil($counter / 100) == $counter / 100)
          sleep(1);
        $counter ++;
        $href = parse_url($href);
        $ids[$id] = fsockopen('213.180.204.20', 80, $errno, $errstr, 5);
        if ($ids[$id])
        {
          $out = "GET ".$href['path']."?".$href['query']." HTTP/1.1\r\n";
          $out .= "Host: ".$href['host']."\r\n";
          $out .= "Connection: Close\r\n\r\n";
          fwrite($ids[$id], $out);
          $eofs[$id] = false;
          $texts[$id] = '';
        }
      }
    }
  }
  while (in_array(false, $eofs))
  {
    foreach ($eofs as $id => $eof)
    {
      if ($eof == false)
      {
        $texts[$id] .= fread($ids[$id], 4096);
        $eofs[$id] = feof($ids[$id]);
      }
    }
  }
  foreach ($ids as $id => $id_val)
    fclose($ids[$id]);

  foreach ($texts as $id => $href)
  {
    $text = $texts[$id];
    $text = str_replace(array("\n", "\r", '', $text);
    preg_match(
      '#<h1 style="color\:black\; margin\-left\:0\;">Тема\: \«([^»]+)»</h1>((<p>[^<]+>/p<+)</div></td>#Sim',
      $text, $matches);
    preg_match_all('#<p>([^<]+)</p>#Sim', $matches[2], $matches2);
    mysql_query(
      'INSERT DELAYED INTO data (title, textdata) VALUES ("'.mysql_escape_string($matches[1]).
      '", "'.mysql_escape_string(implode("\r\n", $matches2[1])).
      '"');
  }
}

set_time_limit(3600);

mysql_connect('localhost', 'root', 'root');
mysql_select_db('data');
mysql_query('CREATE TABLE IF NOT EXISTS `data` (
`title` VARCHAR( 255 ) NOT NULL ,
`textdata` TEXT NOT NULL
);');
mysql_query('TRUNCATE TABLE `data`');

$themes = array('astronomy', 'geology', 'gyroscope', 'literature', 'marketing', 'mathematics', 'music', 'polit',
'agrobiologia', 'law', 'psychology', 'geography', 'physics', 'philosophy', 'chemistry', 'estetica');
$urls = array();

for ($i = 0; $i <= 50000; $i++)
{
  $themes_copy = $themes;
  $use_themes = array();
  do
  {
    $rand_index = array_rand($themes_copy);
    $use_themes[] = $themes_copy[$rand_index];
    unset($themes_copy[$rand_index]);
  } while (count($themes_copy) && rand(0, 5));
  $urls[] = 'http://referats.yandex.ru/all.xml?mix='.implode('%2c', $use_themes).'&'.implode('=on&', $use_themes).'=on';
}

while (count($urls))
{
  process_urls(array_splice($urls, -10));
}
Собственно ради него и затевалось написание данной заметки. Достаточно шустро обрабатывает страницы и помещает тексты, пригодные для занесения, например, в раздел новостей на сайте, в БД. Использовать его нужно осторожно, естественно только для тестирования.
Мне интересно увидеть комментарии по поводу скрипта и вообще идеи создания рыбы, ведь действительно, идею почти никто не освещает.

Комментарии [4] | опубликовано: 2008-03-01 17:34

Invision Power Board 2.2 + Internet Explorer

На днях столкнулся с проблема невозможности логина юзеров IE на форуме с системой IPB 2.2.1. У меня на локалхосте всё было ок, но на хостинге чего-то глючило. Начал искать проблему. Перерыл файлы форума, понял что дело в авторизации. Нашёл функцию авторизации, начал идти по ней… Наткнулся на проверку юзерагента пользователя. Ботовским агентам выдавался статус гостя, даже если они пытались залогиниться. Потом начал в настройках искать список этих агентов. Оказался в самом очевидном месте – админпанели, в специальной ветке – Search Engine Spiders. Там последней строкой стоит некий бот Mozilla с сайта mozilla.org. Не знаю что за бот, но вот IE отдаёт юзерагентом строку ”...Mozilla/4.0…”, так что я со спокойной душой убил последнюю строку в списке ботов и смог залогиниться из-под IE. На локалхосте всё было ок потому, что я ещё при настройке форума удалил эту глупую строчку и благополучно об этом забыл.

Комментарии | опубликовано: 2007-03-21 21:27

Парсер логов Apache

Возникла необходимость проанализировать логи Apache, для чего написал этот небольшой скрипт: parser.zip. Преимущество – аскетизм и минимализм. Анализирует лог из файла log.log, который должен находиться в одной папке с парсером. Написал за полтора часа, так что могут быть баги. В случае обнаружения оных, прошу сообщить мне

Комментарии | опубликовано: 2006-07-13 03:34

<< Предыдущая страница