<rmcreative>

RSS

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

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

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

    29 октября 2010

    И ещё одна приятность, попавшая в SVN. Теперь можно передавать параметрам действий массивы.

    class MyController extedns CController {
      // параметр объявлен как массив
      function actionArray(array $tests){
        foreach($tests as $test){
          echo $test;
        }
      }
     
      // параметр не объявлен как массив
      function actionScalar($test){
        echo $test;
      }
    }
    • Если в $_GET передан не массив, в $test будет только один элемент.
    • Если параметр не объявлен как массив, а передан массив, получим HTTP ошибку 400 (Bad request).

    Напомню, что передать PHP массив через адресную строку можно так:

    /my/array/?tests[]=0&tests[]=2&tests[]=4&tests[]=1
    
    8 комментариев
  2. PhpStorm 98.191

    20 октября 2010

    И ещё один приятно удивляющий билд любимой IDE.

    • Добавили поддержку Zend Toolbar (ищите в меню Run).
    • Настройки дебаггера теперь располагаются в Settings → Debugger → PHP.
    • Добавили подсветку точек выхода из метода. Очень и очень приятно, когда у метода несколько return.
    • Обрамление выделенного текста теперь настраивается и по умолчанию выключено. Включить можно в Editor → Smart Keys.
    • Диалог настройки стиля кода показывает изменения.
    • IDE начала подсвечивать deprecated-функции.
    • Обновлено дополнение кода. Обязательно после запуска сделать File → Invalidate Caches.

    В данной версии добавили автообновление. Почти как в Firefox и Opera. Предложить IDE должна сама, но если не предложит, можно попробовать Help → Check for update. У меня обновление накатилось с большим трудом, так что, если вам не интересно его протестировать, обновляйтесь по-старинке.

    UPD: Вышел 98.240

    11 комментариев
  3. Что будет с CodeIgniter?

    15 октября 2010

    Вторая версия фреймворка CodeIgniter, отличающегося отличной документацией, так толком и не была анонсирована.

    Из EllisLab в сентябре ушёл один из основных разработчиков CodeIgniter, Дерек Аллард. А буквально сутки назад CI лишился Джеми Румбелоу, активно продвигавшего фреймворк и занимавшего важную должность Community Chieftain.

    В репозитарии, тем временем, код правится довольно вяло, хотя работать есть над чем.

    Надеюсь, всё завертится также бодро, как и раньше, как только EllisLab отойдёт от EECI.

    24 комментария
  4. PhpStorm 98.145

    13 октября 2010

    У JetBrains вышел, на этот раз, очень приятный билд PhpStorm.

    • Вроде как нормально заработал Zend Debugger. На всякий случай стоит проверить, стоит ли галочка на Debug → Advanced → Debug all pages.
    • Улучшили дополнения внутри класса и дополнение индексов массивов.
    • Ура! Теперь если выделить текст и нажать ', ", {, ( или [, то текст будет обрамлён соответствующими символами. Работает пока только для PHP-кода.
    • Починили модульные тесты при установленном PHP Unit 3.5.

    В очередной раз напоминаю, что EAP — это тестовые билды, которые, хоть и работают по большей части без нареканий, могут содержать ошибки, о которых можно и нужно сообщать в трекер проекта.

    3 комментария
  5. PhpStorm 98.91

    5 октября 2010

    Свежий билд PhpStorm принёс много интересных нововведений:

    • Дополнение кода вызывается автоматически (можно настроить через Editor → Code Completion).
    • Поддержка Zend debugger (пока не успел проверить).
    • Дополнение ключей массивов. Работает, например, с $_SERVER. Очень приятно.
    • Настройка скобок для Smarty.
    • Сворачивание блоков <?php. Полезно в шаблонах.

    Ну и особо интересные исправления:

    • В CSS больше не считается ошибкой употребление всяких -webkit-gradient и ::-moz-focus-inner.
    • Починили вывод ошибок при запуске PhpUnit.
    • Куча исправлений надоедливых мелочей вроде генерации @return для __construct.
    • Много оптимизаций производительности (я лично изменений не заметил, но у меня и так бегало всё быстро).

    Данный билд, как и все предыдущие, несовместим с PhpUnit 3.5, так что если используете PhpUnit из IDE, пока не стоит его обновлять.

    UPD: вышел багфикс-билд 98.108, исправляющий проблемы с производительностью и другие мелкие проблемы.

    4 комментария
  6. PhpStorm 96.1224

    20 сентября 2010

    Недавний билд PhpStorm 2 очень порадовал. Наконец, помимо большого количества нововведений второй ветки мы получили неплохую стабильность дополнения кода.

    Так как с момента старта EAP 2.0 я пропустил несколько билдов, приведу их список:

    Интересующимся стоит взглянуть на изменения в них. Некоторые очень интересны.

    Ну и ссылки по 1124:

    UPD: вышел багфиксовый 98.21.

    9 комментариев
  7. Обновление 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 комментарий
  8. Утечки памяти в 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 комментариев
  9. True FastCGI для PHP - миграция и тесты

    9 сентября 2010

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

    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 комментариев