<rmcreative>

RSS
  1. Обновление Rolling Curl

    13 сентября 2010

    Обновился rolling-curl — PHP-класс для параллельного выполнения большого количества асинхронных HTTP-запросов при помощи curl, который я начал поддерживать в мае 2010.

    Пример использования можно посмотреть в анонсе библиотеки. Сегодня я остановлюсь на изменениях, сделанных в основном LionsAd, за что ему огромное спасибо.

    • Исправлена ошибка, не позволяющая перезаписать значения из конфигурации CURL по умолчанию.
    • Теперь используется curl_multi_select, что должно убрать излишнюю нагрузку на процессор.
    • В параметры обработчика теперь передаётся $request, содержащий соответствующий объект запроса.
    • Класс Request переименован в RollingCurlRequest.
    • Добавлен функционал для работы с группами запросов. Смотрите RollingCurlGroup и README.
    • Теперь можно настроить таймаут для curl_multi_select.
    • single_curl теперь возвращает true.
    • Улучшенный README с дополнениями.

    Пробуем и обновляемся

    21 комментарий
  2. Утечки памяти в PHP

    12 сентября 2010

    Утечки памяти обычно не беспокоят PHP-разработчиков. Типичное приложение обрабатывает один запрос и работает не больше секунды. После этого вся использованная им память освобождается. Даже если приложение кушает слишком много, максимум, разработчик упирается в memory_limit, выставленный хостером, что решить в общем случае довольно просто: как только переменная становится не нужна, очищаем память, занимаемую ей, при помощи unset.

    Однако, при выполнении ресурсоёмких задач (например, обработки большого количества данных) или запуске PHP как демона проблема утечек встаёт очень остро.

    В PHP 5.2 нет полноценного сборщика мусора. Вместо него используется подсчёт ссылок.

    Все значения переменных хранятся в памяти. И чтобы занимать как можно меньше места, переменные с одинаковыми значениями просто ссылаются на одну и ту же область памяти. При этом количество ссылок подсчитывается и, как только оно становится равно нулю, память освобождается.

    $a = 10; // выделяем область в памяти, одна ссылка
    $b = $a; // две ссылки
    unset($a); // одна ссылка
    $a = 10; // выделяем область в памяти, одна ссылка
    $b = $a; // две ссылки
    $b = 1; // выделяем вторую область в памяти под значение 1, одна ссылка на 1, одна ссылка на 10

    В PHP 5.2 причиной утечек являются циклические ссылки:

    class A {
      private $b;
     
      function __construct(){
        $this->b = new B($this);
      }
    }
     
    class B {
      private $a;
     
      function __construct($a){
        $this->a = $a;
      }
    }
     
    $i=1;
    while($i<=1000){
      $a = new A();
      // 1 ссылка на A ($a).
      // 1 ссылка на B (A::$b).
      // 2 ссылки на A (B::$a).
      unset($a);
      // 1 ссылка на A всё ещё осталась. Память освобождать рановато.
      echo $i."\t".memory_get_usage()."\n";
      $i++;
    }

    Исправляется это явным уничтожением ссылки на B при помощи unset:

    class A {
      private $b;
     
      function __construct(){
        $this->b = new B($this);
      }
     
      function __destruct(){
        unset($this->b);
      }
    }
     
    class B {
      private $a;
     
      function __construct($a){
        $this->a = $a;
      }
    }
     
    $i=1;
    while($i<=1000){
      $a = new A();
      // 1 ссылка на A ($a).
      // 1 ссылка на B (A::$b).
      // 2 ссылки на A (B::$a).
      unset($a);
      // 1 ссылка на A (минус одна в B::__destruct).
      // 0 ссылок на A (unset). Память можно освободить.
      echo $i."\t".memory_get_usage()."\n";
      $i++;
    }

    В PHP 5.3 более умный сборщик мусора, который умеет находить и подчищать последствия использования циклических ссылок. Однако, поиск таких ссылок занимает значительное время и зависит от количества «неподчищенных» ссылок. Плюс к этому работает сборщик не постоянно, а срабатывает только при наполнении буфера ссылок. То есть до его срабатывания какое-то количество памяти всё-таки успевает утекать.

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

    • memory_get_usage() — использованная скриптом память в байтах в момент вызова функции.
    • memory_get_usage(true) — использованная скриптом и менеджером памяти PHP память в байтах в момент вызова функции.
    • memory_get_peak_usage() — максимальное количество памяти в байтах, использованной скриптом с запуска скрипта до момента вызова функции.
    • memory_get_peak_usage(true) — максимальное количество памяти в байтах, использованной скриптом и менеджером памяти PHP с запуска скрипта до момента вызова функции.
    10 комментариев
  3. С какой буквы писать вы?

    9 сентября 2010

    Лебедев считает, что всегда с маленькой.

    Более авторитетные источники, уже ставшие классическими, показывают, что Лебедев не совсем прав.

    Точнее он-то прав, но прав только в контексте сайтов: тексты на них обращены к нам, ко всем пользователям Интернет в целом. Поэтому «вы» в случае сайтов действительно стоит писать с маленькой.

    А вот над остальными случаями стоит подумать.

    18 комментариев
  4. True FastCGI для PHP - миграция и тесты

    9 сентября 2010

    Илья Кантор делится опытом использования «честного» FastCGI в PHP на примере sandbox-а Symfony. Результат — рост скорости в 1,5—2 раза.

    2 комментария
  5. Yii 1.1.4

    5 сентября 2010

    Вышла стабильная версия Yii 1.1.4, включающая более 60 исправлений и улучшений.

    • JQuery UI обновлён до версии 1.8.4 и перемещён к остальным пакетам ядра. Теперь его можно подключать при помощи CClientScript::registerCoreScript.
    • При отсутствии директории assets или прав на неё теперь показывается ошибка.
    • В коде, получаемом при использовании CHtml, live() заменён на delegate().
    • Добавлены классы CSqlDataProvider и CArrayDataProvider. Примеры использования можно посмотреть в API.
    • Автоматическая привязка параметров действий контроллера к $_GET.
    • CUrlManager::addRules(), позволяющий добавлять правила роутинга на лету.
    • Yii::import() теперь выкидывает исключение при отсутствии файла.
    • CActiveRecord::count() теперь учитывает GROUP BY и HAVING.
    • CDbCriteria теперь можно использовать при запросе как параметр для отношений.
    • Улучшена опция together для отношений HAS_MANY и MANY_MANY, предназначенная для формирования одного SQL-запроса с JOIN.
    • Теперь можно получить и изменить критерий в beforeFind() AR-модели.
    • Улучшен код, генерируемый Gii. Добавлен PHPDoc для отношений, изменён код отображений.
    • Зависимости для CChainedCacheDependency можно передавать массивом в конструкторе.
    • CModel::onUnsafeAttribute теперь вызывается только при вызове CModel::setAttributes с параметром $safeOnly==true.

    Это лишь часть изменений. Остальные описаны в полном списке изменений на английском.

    Также, к нам присоединились два разработчика: Y!! и mdomba.

    12 комментариев
  6. CodeFest 2010

    5 сентября 2010

    23 сентября в Новосибирске состоится конференция CodeFest.

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

    Подробнее про конференцию можно почитать на codefest.ru.

    5 комментариев
  7. RMCreative 2

    3 сентября 2010

    Наконец, решился залить новую версию RMCreative.

    Она немного сыровата, так что найденные ошибки прошу писать мне на почту или, если они не очень страшные — прямо сюда.

    Дизайн, как и прошлую версию, делал fazeful. От макетов реализация отличается и, скорее всего, будет меняться и далее.

    Ну и, пожалуй, самое главное: должна работать подписка на комментарии.

    33 комментария
  8. РИФ 2010, доклад про фреймворки

    1 сентября 2010

    15 сентября на Воронежском РИФ расскажу про фреймворки. Доклад называется «PHP-фреймворк Yii. Выбираем PHP-фреймворк. Особенности разработки с фреймворками». Часть про Yii будет совсем небольшая.

    Регистрация заканчивается 14 сентября, так что если хотите посетить данное мероприятие — с регистрацией затягивать не стоит.

    UPD: тема изменилась на «Выбираем PHP-фреймворк. Особенности разработки с фреймворками».

    6 комментариев
  9. Мастер-классы Ильи Кантора по JavaScript

    1 сентября 2010

    Начиная с конца сентября и заканчивая серединой ноября Илья Кантор, автор javascript.ru и algolist.manual.ru, а также бывший участник основной команды фреймворка dojo toolkit, проведёт мастер-классы по темам:

    • Профессиональное javascript-программирование.

    • Сложный AJAX и COMET: тонкости Web 2.0.

    • Мастер-класс по клиентской оптимизации.

    • Секреты jQuery.

    Расписание:

    • 24-25 сентября, Ярославль (удобно москвичам, несколько часов езды).

    • 3-4 октября, Новосибирск.

    • 9-10 октября, Казань.

    • 16-17 октября, Минск.

    • 23-24 октября, Днепропетровск.

    • 30-31 октября, Одесса.

    • 13-14 ноября, Самара.

    Участие платное, но стоимость вполне доступная. Сейчас это 1300 рублей или 350 гривен за мастер-класс.

    Рекомендую как тем, кто хочет поднять свой уровень JavaScript, так и профессионалам.

    2 комментария
  10. Yii: параметры для действия контроллера

    30 августа 2010

    В стремительно приближающемся релизе Yii 1.1.4 будет довольно приятная возможность. Теперь можно будет использовать $_GET-параметры как параметры действия контроллера.

    Теперь вместо:

    class PostController extends CController
    {
        public function actionCreate()
        {
            if(isset($_GET['category']))
                $category=(int)$_GET['category'];
            else
                throw new CHttpException(404,'invalid request');
     
     
            if(isset($_GET['language']))
                $language=$_GET['language'];
            else
                $language='en';
     
     
            // ... действительно полезная часть кода ...
        }
    }

    можно будет так:

    class PostController extends CController
    {
        /**
         * Создание поста.
         * @param integer $category ID категории нового поста
         * @param string $language язык нового поста
         */
        public function actionCreate($category, $language='en')
        {
            // ... действительно полезная часть кода ...
        }
    }

    При этом, если в $_GET не оказалось указанного параметра и для параметра нет значения по умолчанию, будет выброшено исключение CHttpException.

    Если в PhpDoc метода присутствуют типы параметров (поддерживаются integer(int),boolean(bool),float(double) иstring`), происходит автоматическое приведение типа из $_GET к указанному.

    UPD: после пары дней внутренних и внешних обсуждений было решено выкинуть приведение типов.

    28 комментариев