<rmcreative>

RSS

Все заметки с тегом «PHP»

Можно уточнить:

  1. PHP и юникод в стрэктрейсе

    12 марта 2012

    Какое-то время назад creocoder наткнулся на ????? вместо значения параметра в логах ошибок Yii. После анализа проблемы стало ясно, что нашёлся баг в PHP.

    Exception::getTraceAsString и Exception::__toString не работают с юникодом в значениях параметров при построении stacktrace. В результате для

    <?php
    function test($arg){
        throw new Exception();
    }
     
    try {
        test('тест');
    }
    catch(Exception $e) {
        echo $e->getTraceAsString();
        echo (string)$e;
    }

    получаем

    d:\web\usr\local\php54>php.exe d:\src\exception_wrong_trace\test.php
    #0 D:\src\exception_wrong_trace\test.php(7): test('????')
    #1 {main}exception 'Exception' in D:\src\exception_wrong_trace\test.php:3
    Stack trace:
    #0 D:\src\exception_wrong_trace\test.php(7): test('????')
    #1 {main}
    

    Обойти можно собрав строку руками на основе массива, полученного через Exception::getTrace.

    В Yii пока решили это не фиксить. Заслал баг на php.net.

    3 комментария
  2. PHP 5.4, работаем с Yii без вебсервера

    6 марта 2012

    В PHP 5.4 появилась возможность работать без какого-то стороннего сервера. Сегодня попробовал с Yii. Работает на ура.

    1. Заходим в вебрут (туда, где у нас index.php).
    2. Запускаем:
    путь/до/php -S localhost:8080
    
    1. Всё. Заходим на http://localhost:8080/ и наслаждаемся.

    Самое приятное, что не требуется прописывать вообще ничего потому как по умолчанию у встроенного в PHP веб-сервера все запросы идут на index.php.

    11 комментариев
  3. PHP 5.4

    2 марта 2012

    Релизнулся первый стабильный PHP 5.4. Исправлено более сотни ошибок, добавлены новые возможности, среди которых traits, короткий синтаксис для массивов и другие. Также:

    • Уменьшено потребление памяти, ускорено выполнение кода.
    • Улучшена работа с юникодом.
    • Встроенный вебсервер.
    • Убрали кучку устаревших возможностей (register_globals, magic quotes, safe mode, allow_call_time_pass_reference, возможность использовать break/continue с переменной).

    Вроде как, под nix-ами с 5.4 уже работает APC, так что можно попробовать на не сильно критичных боевых проектах.

    3 комментария
  4. Yii 1.1.10

    13 февраля 2012

    Вышел релиз 1.1.10 PHP фреймворка Yii. В данной версии, в основном, исправлены ошибки в CActiveForm, CJuiDatePicker и невозможность запуска с yiilite.php.

    17 комментариев
  5. Скорость eval и анонимных функций

    11 февраля 2012

    Всё ещё используете eval там, где его можно не использовать? Вот ещё одна причина посмотреть в сторону PHP 5.3 и анонимных функций:

    $count = 50;
    $start = microtime(true);
    $y = 0;
    for($i = 0; $i < $count; $i++)
    {
        eval('++$y;');
    }
     
    printf("#1, result is %d, done in %f\n", $y, microtime(true) - $start);
     
    $start = microtime(true);
    $y = 0;
    for($i = 0; $i < $count; $i++)
    {
        $f = function() use (&$y)
        {
            return ++$y;
        };
        $f();
    }
     
    printf("#2, result is %d, done in %f\n", $y, microtime(true) - $start);

    На выходе получаем:

    d:\src>php callback_performance.php
    #1, result is 50, done in 0.000415
    #2, result is 50, done in 0.000270
     
    d:\src>php callback_performance.php
    #1, result is 50, done in 0.000413
    #2, result is 50, done in 0.000261
     
    d:\src>php callback_performance.php
    #1, result is 50, done in 0.000412
    #2, result is 50, done in 0.000273

    Кроме того, что анонимные функции удобней, они ещё и быстрее.

    12 комментариев
  6. Сдал Zend PHP 5.3 Certification

    8 февраля 2012

    Zend PHP 5.3 Certified Engineer

    Давно хотел пройти сертификацию Zend. Гайд был изучен, отложены деньги на ваучер, но как-то в течении нескольких лет не доходили руки. Вчера было соответствующее настроение. Позвонил в центр Pearson VUE, который оказался прямо в родном университете, и договорился на утро. Пришёл. Сдал.

    Зачем?

    Читаем

    25 комментариев
  7. Yii 1.1.9

    1 января 2012

    Вышла стабильная версия Yii 1.1.9. В данном релизе около 60 улучшений и исправленных ошибок.

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

    Русскоязычная документация, как обычно, находится в полностью актуальном состоянии. Кроме того, поправлены все найденные на момент релиза опечатки. Спасибо всем, кто использует Orphus на yiiframework.ru.

    Рассмотрим наиболее интересные изменения.

    Более удобный способ определения through в отношениях ActiveRecord

    Опция though была добавлена в версии 1.1.7, но синтаксис был не слишком удобен, так что было решено сделать его более явным. В текущей версии используется следующий синтаксис:

    'comments'=>array(self::HAS_MANY,'Comment',array('key1'=>'key2'),'through'=>'posts'),

    В приведённом выше array('key1'=>'key2'):

    • key1 является ключом, определённым в отношении, котрое указано в through (в нашем случае это posts).
    • key2 является ключом, определённым в модели, на которую указывает отношение (в нашем случае это Comment).

    through можно использовать как для HAS_ONE, так и для HAS_MANY.

    Подробнее данная возможность описана в разделе Реляционная Active Record полного руководства.

    Поддержка групп условий в Model::relations()

    Теперь можно использовать группы условий при определении отношений модели:

    'recentApprovedComments'=>array(self::BELONGS_TO, 'Post', 'post_id', 
        'scopes' => array('approved', 'recent')),

    При использовании лишь одной группы условий её можно указать как строку.

    Возможность сделать JOIN между моделями по заданным ключам

    В данной версии стало возможым создание отношений по заданной паре PK->FK не опираясь на схему данных. Это означает, что можно, например, задать следующее отношение для модели Day:

    'jobs'=>array(self::HAS_MANY, 'Job', array('date' => 'target_date')),

    В данном случае Day может содержать несколько Jobов. При этом они не связаны привычным образом. Мы задали ключ в виде array('fk'=>'pk'), то есть на выходе мы получим SQL вроде

    SELECT * FROM day t
    JOIN job ON t.date = job.target_date
    

    Возможность перекрыть классы ядра при помощи Yii::$classMap

    Начиная с 1.1.5 в Yii была возможность заранее импортировать классы и использовать их без явного импорта или include. Теперь используя тот же самый подход можно перекрыть классы ядра.

    8 комментариев
  8. PhpStorm 3.0

    30 ноября 2011

    Вчера релизнулся PhpStorm третьей версии. Про пару EAP я уже писал. С тех пор вышло семь промежуточных билдов:

    Прогресс очень радует, как и планы на будущее.

    Анонс и обсуждение на хабре

    Анонс в блоге

    13 комментариев
  9. PHP 5.4 beta 2

    21 октября 2011

    Вышла вторая бета PHP 5.4. RC немного отложили, что, хоть и не является хорошим знаком, но ничего плохого также не означает.

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

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

    Большинство изменений — улучшение уже существующего синтаксиса. Да, всё это замечательно, но только ради этого менять стабильное и проведенное на сырое и не обкатанное не стоит. Трэйты — штука действительно занятная, но, сдаётся мне, толку от них будет не сильно много. Заменить те же mixin или behavior они не могут по причине отсутствия состояния. Возможно, будет и вред т.к. фактически трейты поощряют, хоть и умный, но копи-пейст.

    Ещё одним аргументом остаться на 5.3 на какое-то время является отсутствие APC под 5.4. Вероятность, что его доделают до релиза, покачто мала.

    5 комментариев
  10. Современный брутфорс и безопасный логин

    2 октября 2011

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

    Что же теперь делать?

    1. Можно и нужно сделать лимит на количество попыток ввода пароля. По достижении лимита можно, например, просить ввести капчу. Однако, если произойдёт «утечка» базы данных, что, конечно, бывает не так часто, но бывает, ограничение не поможет.
    2. Хорошим решением будет в дополнение сделать вычисление хеша более ресурсоёмкой операцией. Пользователь не заметит, а вот для взломщика перебор станет, если не невозможным, то, как минимум, финансово невыгодным. Реализуется, например, при помощи bcrypt. Выглядеть это может примерно как здесь.
    27 комментариев