require_once против require

июня 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__);

Статьи по теме: require_once против require

Posted in Без рубрики | No Comments »

Умеет ли PHP находить файлы

июня 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 »

Публикация лога в RSS

июня 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 »

Как подружить ExtJs с серверной частью

июня 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 »

Есть предел извращениям? Часть Вторая. Или как запустить selenium remote control с Internet Explorer на Linux

июня 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/06/07

июня 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, а я до сих пор на работе…

Статьи по теме: Заметки на полях 15/06/07

Posted in Без рубрики | No Comments »

Враг не пройдет. Как остановить спам боты.

июня 6, 2007 by admin

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

Защита от ботов, ориентированных на CMS, и названия полей

Тут все относительно просто. Достаточно выделиться из серой массы, и количество ботов снижается почти до нуля. Пример: на странице регистрации можно присваивать id-шникам input’ов случайные значения, подписи к ним выводить с помощью JavaScript, и между некоторыми вставлять поддельные input’ы. Дополнительно можно проверять время заполнения формы, и нажатие клавиш.

Защита от ботов, которых пишут “под вас”

Вот несколько способов пришедших на ум.

Различение формы предметов, и их цвета

Найти на картинке, покрытой мелкими треугольниками, овалами, и прочими линиями квадрат, и указать его цвет.

Плюсы:
  • простота реализации
  • простота прохождения людьми
Минусы:
  • узкий словарь (основных цветов и форм мало, чтобы предотвратить брутфорс)
Разбор сложных образов

Указать пол человека, изображенного на фотографии.

Плюсы:
  • вряд ли боты в скором времени станут такими умными
  • простота реализации самого механизма выбора
Минусы:
  • тяжело составить такой словарь

Если придумаете, то, пожалуйста, скажите мне . Только гугловский поиск по медиа-контенту не предлагайте, так как он не очень релевантный.

Конструирование сложных образов из кусков

Собирание пазла.

Плюсы:
  • очень широкий словарь (результатом конструирования может быть что угодно).
  • тяжесть брутфорса (6 кусков - 720 вариантов)
  • возможность увеличить защиту от брутфорса, если пересылать изменения (куда какой кусок положили) на каждом шаге, а не результат
Минусы:
  • пока не придумал ничего, кроме необходимости реализации самого механизма конструирования

Заключение:

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

Posted in Без рубрики | No Comments »