Сначала перечисляю сущности.
sуstems – некие системы.
preferences – некоторые настройки, сокращенно pref

pref имеет разные типы, например настройки кеша (cache) и тамаута (timeout). Таким образом pref можно записывать в одну таблицу с полями id, value, type или в две разные таблицы – prefcache и preftimeout с той же структурой. Идем дальше.

Поля таблицы system – id, name. Осуществляется связь многие ко многим через таблицу prefs_systems с полями: id_system, id_pref, type (можно вынести сюда в случае отдельных таблиц prefcache и preftimeout.

И вот зачем две таблицы pref, я хочу на каждую делать свой ORM, т.е. есть базовый ORM_Pref extends ORM и от него наследуются ORM_Prefcache и ORM_Preftimeot. Каждый работает со своей таблицей, а общие настройки в базовом классе.

В этом случае в каждой ORM прописываются связи $_has_many. В случае ORM pref все очевидно, по одной записи связей $_has_many к ORM_System. В случае с описанием ORM_System получается такая конструкция (додумался пока писал).

Вопросы:

  1. Нормально ли я придумал структуру?
  2. Могу ли я базовый класс ORM_Pref объявить абстрактным (т.к. у него нет привязанной таблицы и его не надо создавать) ?
  3. Можно ли как-то улучшить мою структуру? Если все выше правильно, то при добавления нового типа настроек я должен буду прописать связь в ORM_System, это не удобно.

UPD. 02.04.2014

Спустя полтора года мой пост выше кажется мне уже простым вопросом новичка. Решил добавить сюда еще решение по ORM

Получение свойства ORM сразу с UNCOMPRESS.

Проблема: Можно ли как-то через ORM извлекать данные, которые были записаны через COMPRESS () в mysql в BLOB?

В кохановском ОРМ такого нет. Приходится писать функции в ORM типа

Задачу решает, но было бы приятнее просто указать в каких-то правилах как извлекать столбец, как фильтры после извлечения, только эти во время.

Решение нашел коллега. В нужной ORM модели надо переопределить

В данном случае поля request и result сжаты, извлекаются под псевдонимами с распаковкой и будут доступны $model->requestUncompress, например.

memcached

Понадобилась настройка memcached (memcache) на 2 сервера. Задача оказалась не такой тривиальной. С доступом на localhost, где демон слушает по умолчанию, проблем не было. Однако на удаленный сервер достучаться не получалось. Сервера оба debian.
Возможно этот пост актуален только для меня и проблем может не возникать.
Домашняя страница проекта на code.google.

Для начала установка. Тут все просто:

Взято с мануала по memcached на php.net. Хотя при установке туда не заглядывал.
После установки можно проверить слушается ли теперь порт 11211.

Так же можно проверить настройки конфига.

После изменений конфига делаем:

Примеры выше взяты с Хабра.

В коде php используется очень просто. В данном случае у меня создается класс CACHE с singlton, приведен кусок.

И тут то и выяснилось, что на второй сервер обращения не доходят. Элементарная подмена в конфиге адреса прослушивания ничего не дала (-l *.*.*.*).
Диагностику помогут провести следующие ф-ии:

1. Показать есть ли процесс memcached

Тут мы видим, что процесс есть и запущен на нужном адресе. Памяти выделено 1000мб, пользователь nobody. 127.0.0.1 тут оказался лишним, memcached не поддерживает несколько ip.
2. Показать слушаемые порты

Точно слушает.
3. Включить вывод ошибок в php. :) Ошибок не было.
4. Догадка о закрытом порте. Если не установлено, то ставим nmap. Проверяем localhost или ip.

Можно еще так проверить. Если нет соединения, то закрыт.

Выдаст список открытых портов. В моем списке 11211 не оказалось. “Вот в чем собака зарыта”. :)
5. Смотрим iptables.

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

Если без перенаправления, то в консоли выведутся правила. Через эту команду можно организовать сохранение настроек, т.к. после перезагрузки они сбросятся.

Далее порт 11211 надо открыть, но только для одного IP адреса.
Тут мне пригодились следующие ф-ии:
1. Показать нумерованный список правил и удалить правило по номеру

2. закрыть все входящие, для которых нет правил на открытие

Еще примеры:
открыть все исходящие порты
iptables -P OUTPUT ACCEPT
открыть порт 80 для всех входящих соединений
iptables -A INPUT –dport 80 -j ACCEPT
открыть 22 и 5432 порты только для конкретного IP
iptables -A INPUT -m multiport –dports 22,5432 -s IP_ADDRESS -j ACCEPT

Так же не забудьте открыть другие нужные порты для нужных ИП.

Более подробная настройка iptables в этом посте, с примерами скриптов.

Еще можно подкрутить сессии в php.ini на использование с memcached.

Для мониторинга была установлена утилита phpmemcachedadmin. В ней можно создать стек ваших серверов с memcached и смотреть статистику в приятном интерфейсе.

Получил задание доработать вывод шаблона с добавлением некоторого функционала.
Как решить знаю, не мог сначала разобраться в некоторых особенностях cms. Работаю с ней первый раз.

Что нужно сделать?
В каталоге добавить возле каждого товара инпут с кол-вом товара. Сначала там нули, и есть + – для увеличения, уменьшения количества. Внизу каталога будет кнопка “Купить выбранные”. По нажатию в корзину добавятся все, где кол-во выбрано 1 и более.
Далее мои рассуждения и решение.

Читать далее

Начну с того, что недавно ip почтового сервера получил бан на gmail, а я получил больную голову на 2 недели от клиентов. В итоге бесконечных переделок конфига Postfix, писем в поддержку гугла и так же после найденного спам листа, в который и попал ip – письма на gmail начали ходить. Но как так вообще произошло, ведь сервер защищен smtp авторизацией (tsl) ???
А виноваты были во всем сами пользователи хостинга…

Читать далее

Люблю развиваться и изучать что-то новое. Недавно был покорен PDO, и сделан на его основе драйвер бд (не окончательная версия) и его синглтон реализация. После я решил простую реализацию шаблонизатора типа

перевести на Smarty и использовать так же его возможности кеширования. Это отняло у меня день жизни.

Читать далее

Вопрос, который я задал в предыдущем посте продублировал на 5 форумов. Все форумы тематические, по PHP. Зачем я это сделал?

  1. Найти ответы.
  2. Проверить эти форумы на активность и юзабельность.

В итоге ответы нашел сам, в чужом коде. А о форумах выводы сделал.

Ответы были крайне просты. Надо было мне внимательнее читать документацию. Последний ид оказался свойством самого класса PDO.
http://ru.php.net/manual/ru/pdo.lastinsertid.php

А кол-во последних измененных строк получаются по методу стейтмента
http://ru.php.net/manual/ru/pdostatement.rowcount.php

Теперь о форумах:

http://www.php.ru/forum/ – не получил ответа. вообще никакого ответа, т.е. низкая активность?
http://phpclub.ru – сначала пытаются троллить, вместо диалога, потом наводками. в итоге ответ написал я сам. так же не понравился дизайн, добавление ответа через аякс.
хотя позже диалог завязался, подтянулись участники, меняю мнение.

Форум Школы Программирования – мертвый.

http://phpforum.ru – тут то и увидел код, натолкнувший на ответ. понравилось у них, особенно дизайн.
http://pyha.ru/forum/ – наверное зе бест. и дизайном и атмосферой. чего только стоит оценка  ответов – ХУЙНЯ, а форум новичков назван “для идиотов”

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

php pdo

Решил сделать драйвер БД через PDO. С mydql напрямую все просто и однозначно, но не с PDO.
Возникло пару вопросов.

Драйвер должен состоять всего из 4-х ф-й : select, insert, update, delete. Логика их работы не имеет значения. Вызов просто $this->db->select(); в чем и профит.

У PDO есть ф-я query() которая просто для select и возвращает стейтмент, который можно потом fetch(). А что если в селекте есть параметры? Их же надо экранировать. Использовать sprintf() в связке с mysql_real_escape_string() когда речь идет о PDO не кошерно.

Сначала я написал ф-ю

И завис. Как же быть с параметрами? Для экранирования в PDO используется ф-я prepare(), куда передается sql запрос с параметрами WHERE например ‘id = :id ‘. Далее делаем bindParam(‘:id’, $my_id); и выполняем execute().
Хорошо, можно переписать мою ф-ю иначе:

Но тогда надо помнить всегда про PDO, передавать sql в формате типа ‘:id’ и параметры array( “id” => $id);
Есть ли какое-то более элегантное решение?

И что делать с запросами Insert и Update где я хочу узнать кол-во измененных столбцов? execute() возвращает true или false.
Можно использовать exec() но снова – как тогда быть с параметрами?

Автор 27 Апрель 2011 | Дмитрий Андреев, собственно я спер у него.

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

Читать далее

Работаю над очередным проектом.

Это мой второй проект именно для работы. Первый был крупнее и как обычно “первый блин комом”. Там я не заморачивался над правилами программирования, а писал все в куче (php, хтмл, яваскрипт). Так же было очень мало опыта и многое изучал на лету. Сейчас немного подрос и решил писать по все правилам с OOP и MVC.

Так вот в процессе работы возник вопрос.. и я задал его в 4 сообщества контакте.

Читать далее

Два совпадения

– мои переживания по поводу смерти 24 летнего парня от рук хранителей правопорядка
– мое резюме случайно нашли на rosrabota и сделали предложение, от которого я не могу отказаться

Добавить сюда еще мое недовольство текущей работой. И вот я решил принять предложение и сменить работу.

Обо всем подробнее.

Читать далее