июня 26, 2007 by admin
Заинтересовала разница в скорости между require(include)/require_once(include_once). Разницы не заметил. Может что-то с тестом?
2.94671392441 [include]
2.9369969368 [include_once]
3.1668279171 [require]
2.69922208786 [require_once]
Система: Apache/2.2.3 (Ubuntu) PHP/5.2.1 Server
Собственно сам тест:
<?php
error_reporting(E_ALL);
define(’REP_CNT’,300);
function get_rnd_php_str()
{
return ’$i=’.rand().’; $i++; $i=”‘.md5(rand()).’”;’;
}
function prepare_file($base_dir, $str_cnt = 100)
{
$filename = $base_dir . ’/' .md5(rand());
$handle = fopen($filename,’w+’);
fwrite($handle, ”<?php\n”);
for($i = 0; $i < $str_cnt; $i++) {
fwrite($handle, get_rnd_php_str());
}
fclose($handle);
return $filename;
}
function refresh_file($old_name)
{
$new_name = dirname($old_name) . ’/' .md5(rand());
rename($old_name,$new_name);
$handle = fopen($new_name,’a+’);
fwrite($handle, get_rnd_php_str());
fclose($handle);
return $new_name;
}
$t1 = microtime(1);
$file = prepare_file(’/tmp’);
$cnt = REP_CNT;
while($cnt–) {
require_once($file);
$file = refresh_file($file);
}
unlink($file);
$t2 = microtime(1);
$file = prepare_file(’/tmp’);
$cnt = REP_CNT;
while($cnt–) {
require($file);
$file = refresh_file($file);
}
unlink($file);
$t3 = microtime(1);
$file = prepare_file(’/tmp’);
$cnt = REP_CNT;
while($cnt–) {
include_once($file);
$file = refresh_file($file);
}
unlink($file);
$t4 = microtime(1);
$file = prepare_file(’/tmp’);
$cnt = REP_CNT;
while($cnt–) {
include($file);
$file = refresh_file($file);
}
unlink($file);
$t5 = microtime(1);
echo ($t5 - $t4) . ’ [include]<br />’;
echo ($t4 - $t3) . ’ [include_once]<br />’;
echo ($t3 - $t2) . ’ [require]<br />’;
echo ($t2 - $t1) . ’ [require_once]<br />’;
echo ’<br />’;
highlight_file(__FILE__);
Posted in Без рубрики | No Comments »
июня 26, 2007 by admin
В статье на Хабре, прочитал комментарий, в котором говорилось о глупости require’ов и include’ов в php. Решил проверить:
<?php$handle = fopen(’/tmp/bar.php’,'w+’);
fwrite($handle, “<?php\n”);
$repeat_string = ‘$i = 1; $i++; $i = \’aaa\’;’ . “\n”;for($i = 0; $i < 100000; $i++) { fwrite($handle, $repeat_string);}
$t1 = microtime(1);require_once(’/tmp/bar.php’);
$t2 = microtime(1);echo $t2 - $t1; echo ‘<br />’;require_once(’../../tmp/bar.php’);
echo microtime(1) - $t2;
Вывод:
0.7537569999690.00010085105896
В общем комментарий оказался ошибочным. Если уж в самом PHP есть функция realpath(), то не воспользоваться ей было бы глупо.
PS: Даже по символическим ссылкам находит :) Люблю поганца, не смотря на все косяки
Posted in Без рубрики | No Comments »
июня 26, 2007 by admin
Наткнулся на интересную статью “Turning a Zend_Log log file into a RSS feed“, в котоорой рассказывается, как с помощью Zend Framework публиковать логи в RSS. Технология следующая: логи формируются с помощью семейства классов Zend_Log в формате XML, а по запросу к определенному контроллеру/экшну лог преобразуется в RSS, через XSLT процессор.
Posted in Без рубрики | No Comments »
июня 25, 2007 by admin
В свободное время разрабатываю небольшую системку, на связке Zend FW + Doctrine + ExtJs, главными чертами которой является обилие grid’ов, деревьев, drag’n'drop’ов и прочих ExtJs-прелестей.
Раньше заводил контроллеры и экшны на каждый чих. Надоело. Стал думать, как минимальным количеством кода моделей обеспечить связь с клиентской частью и не потерять систему прав.
Поел. Покурил. Хотел было выпить, но ничего не нашел. С криком “J.F.D.I”, поел еще раз. Потом устал есть, и начал ваять.
Задал маски роутинга для AJAX-запросов в конфиге:
;выборка коллекции объектовroutes.ajax.route = “ajax/:name/all”routes.ajax.defaults.controller = “ajax”routes.ajax.defaults.action = “getAll”routes.ajax.reqs.name = “\w+”
;выборка объекта по idroutes.ajax.route = “ajax/:name/:id”routes.ajax.defaults.controller = “ajax”routes.ajax.defaults.action = “getOne”routes.ajax.reqs.name = “\w+”routes.ajax.reqs.id = “\d+”
;запуск метода для объекта без параметровroutes.ajax.route = “ajax/:name/:id/:method”routes.ajax.defaults.controller = “ajax”routes.ajax.defaults.action = “run”routes.ajax.reqs.name = “\w+”routes.ajax.reqs.id = “\d+”routes.ajax.reqs.method = “\w+”
;запуск метода для объекта с параметрамиroutes.ajax.route = “ajax/:name/:id/:method/:vars”routes.ajax.defaults.controller = “ajax”routes.ajax.defaults.action = “run”routes.ajax.reqs.name = “\w+”routes.ajax.reqs.id = “\d+”routes.ajax.reqs.method = “\w+”
В каждой запрашиваемой модели (на основе Doctrine) сделал маску прав на действия:
class Book extends Doctrine_Record{ … public function setActionRules() { $this->allow(’create’,'user’); $this->allow(’delete’,'owner’); $this->allow(’setAuthor’,'onwer’); … $this->allow(’getAuthor’,'guest’); … }…}
Соответственно, в контроллере инициализирую объект(объекты) и проверяю права доступа к методам. Кода получается пока немного, но еще не все способы доступа реализовал.
PS: Столкнулся с проблемой, когда нужно совершить несколько действий над объектом. Типичный пример - изменение значения. То, как это реализовано в данный момент ну ооочень не нравится.
Буду опять думать. Как же я это дело не люблю :-[
Posted in Без рубрики | No Comments »
июня 25, 2007 by admin
Сегодня весь день бился с запуском тестов через Selenium Remote Control и концу дня я его одолел, хотя весь день он одолевал меня. Все просто:
1. Ставим ies4Linux
Все тут. Даже расписывать нечего, все просто и понятно. Порадовало наличие репозиториев для ubuntu и debian.
2. Качаем ночной билд Selenium RC
Именно ночной (у меня snapshot 0.9.1 от 19 марта 2007), т.к. стабильная версия 0.9.0 не работает корректно с осликом в линуксе. Видимо проблема с инъекцией настроек прокси, через который и работает вся эта конструкция.
3. Запускаем сервер
Тут тоже маленький хак, т.к. если указать в качестве браузера “*iexplore”, эксплорер он не находит. Решается через ручное указание браузера: “*custom /usr/bin/iexplore”.
Тесткейс SeleniumTest прошел, как…как…как…ну в общем отлично прошел, даже вернул что-то.
P.S.: Забавно, но на эти три маленьких пункта я убил почти весь день :(
Posted in Без рубрики | No Comments »
июня 22, 2007 by admin
Установил IE на linux по инструкции.
Не по своей воле, просто хочется запустить Continuos Integration Server на платформе как можно более близкой к боевому серверу. А ослик нужен для запуска регрессионных тестов.
Posted in Без рубрики | No Comments »
июня 21, 2007 by admin
Нашел фотографию своего рабочего стола. Ужас:

Posted in Без рубрики | No Comments »
июня 18, 2007 by admin
Voyachek празднует днюху. Пришлось верстать открытку на скорость.
Posted in Без рубрики | No Comments »
июня 15, 2007 by admin
Вести за день:
Речитатив про компенсаторы
БИТовцы порадовали репчиной на сайте ХимМаша. Не часто можно встретить такой качественный речитатив в рекламе. А рифмовка молибдена, титана и конпенстаторов вообще отвал.
ExtJs
Очередной раз убеждаюсь, что ExtJs рулит. Несмотря на то, что не трогал его месяца 3 склепал за неполный день рыбу и на ее основе, grid для админки, на “неродном” бекенде. Интересно за сколько склепаю второй grid.
Правда с затыком столкнулся.

Внизу есть filter, который на сервере обрабатывается по аналогии с where условием в sql-запросе. Значение этого фильтра надо передавать в запросе к данным всегда, т.к. от них, например, зависит количество элементов.
Не придумал ничего лучше, чем повесить обработчик на запрос на забор данных с сервера, в котором напрямую для соединения добавляю значение поля.
ds.on(’beforeload’, function() {
ds.proxy.conn.extraParams = {’where’: getWhere()};
});
Некрасиво, ибо, ИМХО, слишком глубоко вниз залез, но ничего лучше не нашел.
AdSence и ХабраЭффект
Настроил адсенс. Хочется вывести блог хотя бы на окупаемость shared-хостинга. Посмотрим что из этого выйдет.
ХабраЭффект сработал, после публикации топика, от hedin’а, за два дня на сайт пришло 180 новых пользователей.
PS: 00:20, а я до сих пор на работе…
Posted in Без рубрики | No Comments »
июня 6, 2007 by admin
То ли мне спам-боты надоели, толи просто решил сделать что-то большое и чистое. В итоге размышлений родились мысли. Первая, о том, что хочется есть, а вторая, что думать надо усердней. Стал думать усердней, и набросал несколько вариантов защиты:
Защита от ботов, ориентированных на CMS, и названия полей
Тут все относительно просто. Достаточно выделиться из серой массы, и количество ботов снижается почти до нуля. Пример: на странице регистрации можно присваивать id-шникам input’ов случайные значения, подписи к ним выводить с помощью JavaScript, и между некоторыми вставлять поддельные input’ы. Дополнительно можно проверять время заполнения формы, и нажатие клавиш.
Защита от ботов, которых пишут “под вас”
Вот несколько способов пришедших на ум.
Различение формы предметов, и их цвета
Найти на картинке, покрытой мелкими треугольниками, овалами, и прочими линиями квадрат, и указать его цвет.
Плюсы:
- простота реализации
- простота прохождения людьми
Минусы:
- узкий словарь (основных цветов и форм мало, чтобы предотвратить брутфорс)
Разбор сложных образов
Указать пол человека, изображенного на фотографии.
Плюсы:
- вряд ли боты в скором времени станут такими умными
- простота реализации самого механизма выбора
Минусы:
- тяжело составить такой словарь
Если придумаете, то, пожалуйста, скажите мне . Только гугловский поиск по медиа-контенту не предлагайте, так как он не очень релевантный.
Конструирование сложных образов из кусков
Собирание пазла.
Плюсы:
- очень широкий словарь (результатом конструирования может быть что угодно).
- тяжесть брутфорса (6 кусков - 720 вариантов)
- возможность увеличить защиту от брутфорса, если пересылать изменения (куда какой кусок положили) на каждом шаге, а не результат
Минусы:
- пока не придумал ничего, кроме необходимости реализации самого механизма конструирования
Заключение:
Вывод простой - серебрянной пули, как всегда, не получилось, но идея с пазлом мне нравится.
Posted in Без рубрики | No Comments »