Изменение параметров PHP для отдельной директории

Для одного проекта на Битриксе понадобилось изменить параметр mbstring.func_overload для библиотеки PHPExcel. 

Варианты с htaccess и ini_set не срабатывали, потому что директива mbstring.func_overload может меняться только в php.ini или конфиге апача. Причем комманда php_value для нее не работала!

Единственный способом стала комманда php_admin_value.

Итоговый код:


<Directory /var/www/path/to/dir>
php_admin_value mbstring.func_overload 0
</Directory>
Читать далее »

Обновил платформу на Yii Booster 2 и Yii 1.1.14

Обновил платформу для разработки. Теперь у меня стоит YiiBooster 2 и Yii 1.1.14. 

YiiBooster 2 кстати не всегда корректно работает с Yii версии 1.1.13 и младше, у меня виджет TbExtendedGrid отказывался запускаться с этой конфигурацией. 

Читать далее »

Использование TDD при построении простого приложения

TDD is a “test-first” technique to develop and design software. It is almost always used in agile teams, being one of the core tools of agile software development. TDD was first defined and introduced to the professional community by Kent Beck in 2002. Since then, it has become an accepted – and recommended – technique in everyday programming.

TDD has three core rules:

  1. You are not allowed to write any production code, if there is not a failing test to warrant it.
  2. You are not allowed to write more of a unit test than is strictly necessary to make it fail. Not compiling / running is failing.
  3. You are not allowed to write more production code than is strictly necessary to make the failing test pass.
Читать далее »

Многопоточность на PHP. Подборка статей.

Несколько полезных статей:

Иногда появляется необходимость выполнять несколько действий одновременно, например, проверять изменения в одной таблице БД и вносить модификации в другую. Причем если одна из операций (например, проверка изменений), занимает много времени, очевидно, что последовательное выполнение не обеспечит балансировки ресурсов.

Для решения такого рода задач, в программировании используется многопоточность - каждая операция помещается в отдельный поток с выделенным объемом ресурсов и работает внутри него. При таком подходе, все задачи будут выполнятся отдельно и независимо.

Хотя PHP и не поддерживает многопоточность, есть несколько методов её эмуляции, о них и пойдет речь ниже.

http://www.phphighload.com/2012/07/php.html

Про PCNTL - расширение PHP для поддержки многопоточности:

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

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

Проблема на лицо - нужно чтобы 3 отдельных процесса выполнялись одновременно, не отбирая ресурсов один в одного.

http://www.phphighload.com/2012/07/pcntl.html

Про многопроцессорных демонов на Хабре:

Как из одного процесса сделать два? Программистам под Windows (в том числе и мне) больше знакома система, когда мы пишем функцию, которая будет main() для дочернего потока. В *nix все не так, потому я немного расскажу об этой системе многопроцессовости. *nixоиды могут смело пропустить эту часть, если они и так все знают.

Итак. Есть такая функия pcntl_fork. Как ни странно, аргументов она не берет. Что же делать?

После pcntl_fork у скрипта начинается шизофрения: код вроде бы один и тот же, но выполняется двумя параллельными процессами. Впрочем, если просто вставить в скрипт pcntl_fork, ничего наглядного ты не увидишь, разве что конфликты доступа к ресурсам.

http://habrahabr.ru/post/40432/

Читать далее »

Hip-Hop PHP

Компиляция PHP приложений - HipHop-php

 PHP - интерпретируемый язык программирования, при каждом запросе происходит анализ и "выполнение" исходного кода. Такой подход, конечно, очень удобен на стадии разработки проекта, но вносит лишний шаг в процесс выполнения продакшен кода. Таким образом интерпритация, на первый взгляд сильная сторона PHP, стоит лишнего процесорного времени и ресурсов.

Ниже речь пойдет о компиляторах, позволяющих компилировать php код в C++, а его в исполняемый. Таким образом PHP приложения выполняются непосредсвенно процессором, минуя интерпритатор.

Проверим все ли так хорошо на практике.

Как работает интерпритатор

Интерпритация PHP кода проходит в два этапа:

  1. Парсинг кода и генерация опкодов (Zend opcodes) - инструкций, понятных интерпритатору.
  2. Выполнение опкодов.

 

Тогда как первая фаза хорошо поддается оптимизации (использование кеша опкодов), вторая довольно закрытая - интерпретатор всегда является посредником между набором команд и процессором, выполняющим их. Без интерпритатора, процессору не понять, чего делать с опкодами.

Чтобы избавиться от звена-интерпритатора придумали компиляторы, наиболее популярный и свежий из них HipHop от Facebook. Пощупаем его поближе.

http://www.phphighload.com/2012/06/php.html

Все хочется попробовать на практике это детище Facebook.

Читать далее »

Создание API-ориентированного веб-приложения.

Планируете начать работу над новым веб-приложением? В этом уроке мы рассмотрим, как создать API-ориентированное веб-приложение, и объясним, почему это необходимо в современном мульти-платформенном мире .

Введение

API?

Для тех, кто не знаком с термином, API является сокращением от Application Programming Interface(Интерфейс прикладного программирования). Согласно Википедии :

Интерфейс программирования приложений (англ. application programming interface) — набор готовых классов, процедур, функций, структур и констант, предоставляемых приложением (библиотекой, сервисом) для использования во внешних программных продуктах. Используется программистами для написания всевозможных приложений.

API

Визуализация API
Изображение предоставлено http://blog.zoho.com

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

Читать далее »

Пара классов из SPL для облегчения жизни

SPL расшифровывается как Standard PHP Library. Это набор классов и интерфейсов для решения стандартных задач на PHP. В основном она состоит из различного рода итераторов. Библиотека доступна по умолчанию, начиная с PHP 5.

Приведу несколько примеров, начнем с класса Traversable. Этот интерфейс показывает что к данному объекту применим foreach. Этот базовый интерфейс нельзя реализовать напрямую, а через интерфейсы IteratorAggregate или Iterator.  

Iterator

Iterator - класс для перебора внутренних параметров. Объявление итератора:

Iterator extends Traversable {
/* Методы */
abstract public mixed current ( void ) // Возвращает объект на который указывает итератор
abstract public scalar key ( void ) // Возвращает текущую позицию итератора
abstract public void next ( void ) // Переход к следующему элементу
abstract public void rewind ( void ) // Возврат к началу
abstract public boolean valid ( void ) // Проверка на доступность объекта, на который указывает итератор
}

Каждый из этих методов должен быть реализовать в классе - потомке, реализуя функционал итератора. Приведу пример:

class myIterator implements Iterator {
    private $position = 0; // Текущая позиция
    // Перечень элементов, именно по нему будет бегать итератор
    private $array = array( 
        "firstelement",
        "secondelement",
        "lastelement",
    );  

    // Конструктор, кэп
    public function __construct() {
        $this->position = 0;
    }
    
    function rewind() {
        var_dump(__METHOD__);
        $this->position = 0;
    }

    function current() {
        var_dump(__METHOD__);
        return $this->array[$this->position];
    }

    function key() {
        var_dump(__METHOD__);
        return $this->position;
    }

    function next() {
        var_dump(__METHOD__);
        ++$this->position;
    }

    function valid() {
        var_dump(__METHOD__);
        return isset($this->array[$this->position]);
    }
}

$it = new myIterator;

foreach($it as $key => $value) {
    var_dump($key, $value);
    echo "\n";
}

Как видно из кода, сначала объявляется класс, в которой существует массив, по которому и будет бегать наш итератор. Потом мы пробегаемся по каждому элементу при помощи foreach. В результате выполнения этого кода, будет выведено следующее:

string(18) "myIterator::rewind"
string(17) "myIterator::valid"
string(19) "myIterator::current"
string(15) "myIterator::key"
int(0)
string(12) "firstelement"

string(16) "myIterator::next"
string(17) "myIterator::valid"
string(19) "myIterator::current"
string(15) "myIterator::key"
int(1)
string(13) "secondelement"

string(16) "myIterator::next"
string(17) "myIterator::valid"
string(19) "myIterator::current"
string(15) "myIterator::key"
int(2)
string(11) "lastelement"

string(16) "myIterator::next"
string(17) "myIterator::valid"

По этому коду можно проследить порядок работы итератора. 

ArrayAccess

Этот класс предоставляет возможность обращаться к объекту как к массиву, что в некоторых случаях может сильно облегчить код, а также ввести в когнитивный диссонанс человека, не знакомого с этим интерфейсом.

ArrayAccess {
/* Методы */
abstract public boolean offsetExists ( mixed $offset ) // Существует ли объект с данным ключом.
abstract public mixed offsetGet ( mixed $offset ) // Получение объекта
abstract public void offsetSet ( mixed $offset , mixed $value ) // Присвоение
abstract public void offsetUnset ( mixed $offset ) // Удаление
}

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

Пример:

class obj implements arrayaccess {
    private $container = array();
    public function __construct() {
        $this->container = array(
            "one"   => 1,
            "two"   => 2,
            "three" => 3,
        );
    }
    public function offsetSet($offset, $value) {
        if (is_null($offset)) {
            $this->container[] = $value;
        } else {
            $this->container[$offset] = $value;
        }
    }
    public function offsetExists($offset) {
        return isset($this->container[$offset]);
    }
    public function offsetUnset($offset) {
        unset($this->container[$offset]);
    }
    public function offsetGet($offset) {
        return isset($this->container[$offset]) ? $this->container[$offset] : null;
    }
}

$obj = new obj;

var_dump(isset($obj["two"]));
var_dump($obj["two"]);
unset($obj["two"]);
var_dump(isset($obj["two"]));
$obj["two"] = "A value";
var_dump($obj["two"]);
$obj[] = 'Append 1';
$obj[] = 'Append 2';
$obj[] = 'Append 3';
print_r($obj);

В результате получили:

bool(true)
int(2)
bool(false)
string(7) "A value"
obj Object
(
    [container:obj:private] => Array
        (
            [one] => 1
            [three] => 3
            [two] => A value
            [0] => Append 1
            [1] => Append 2
            [2] => Append 3
        )
)

При правильном использовании поможет вам сделать ваш код лаконичнее и красивее. 

Читать далее »

Немного о документировании кода. Стандарт Docblock.

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

Одной из преград к документированию кода для меня было то, что я не знал как это правильно делать. Но тут меня выручил замечательный стандарт Docblock. В нем описывается как надо правильно писать комментарии к коду, чтобы он был не только легко читаем человеком, но и понимался различными IDE для формирования всплывающих подсказок. 

Читать далее »

Компоненты Битрикса. Шаг 0.

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

В компонентах Битрикса реализовано разделение логики и представления. Логика реализуется в самом компоненте, а представление через шаблоны. Зачем нужно такое разделение? Чтобы удобнее было разделять данные разных типов и не мешать все в одну кучу. Плюс к тому если, например, одному человеку понадобиться подредактировать какую-то часть шаблона, а другому надо подправить PHP код, то в результате получиться дикий ад. Плюс к тому, разделение PHP, HTML и JavaScript делает код более читаемым и удобным.

Структура папок коспонента Битрикс

Код компонентов лежит в папке /bitrix/components/. Подпапки будут являться пространствами имен. Например в пространстве имен bitrix лежат системные компоненты. Менять их не рекомендуется. Лучше создайте свою папку типа mycompany. Каждая папка в ней будет названием для компонентов битрикса. Теперь рассмотрим структуру папка компонента битрикса. 

Структура компонента Битрикс

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

Читать далее »
Scroll To Top