Как бороться с segmentation fault в simple_html_dom

Standard

Иногда бывает что ваш скрипт выдает ошибку segmentation fault (ошибка сегментации) и завершает свою работу. Скорей всего ошибка в комбинации ваших расширений к пхп, попробуйте оставить только те расширения, к-ые необходимы для скрипта. Если все ок — найдите расширение, к-ое глючит и попробуйте обновить либо само расширение, либо библиотеку, к-ую оно использует.

Но к сожалению у меня эта ошибка возникала на нескольких компьютерах с разными версиями php и комбинацией расширений. Причина была в библиотеке для парсинга simple_html_dom, пробовал Nokogiri, Zend_Dom — все равно, лучше simple_html_dom ничего нету. При больших объемах обрабатываемого html кода, например внутри цикла, возникает segmentation fault. Возможное решение — разместите следующий код в конце итерации (если парсинг идет в цикле):

$simple_html_object->clear();
unset($simple_html_object);

Строка выше помогает бороться с потреблением памяти, но полностью ошибку segfault не решает. Причина кроется на 143 строке (в классе simple_html_dom_node):
// clean up memory due to php5 circular references memory leak...
function clear()
{
$this->dom = null;
$this->nodes = null;
$this->parent = null;
$this->children = null;
}

Данная функция вызывается деструктором simple_html_dom_node класса, и когда подходит его очередь для garbage collector`a происходит segfault (в некоторых случаях).
Есть открытый bug на sourceforge, люди советуют сделать так:
// clean up memory due to php5 circular references memory leak...
function clear()
{
unset($this->dom);
unset($this->nodes);
unset($this->parent);
unset($this->children);
}

Но мне и это не помогло, решил сделать быстро и тупо => закомментировать все строки внутри clear функции. В итоге потребление памяти увеличилось, к примеру раньше было стабильно 20 мегабайт, теперь — при парсинге около 1000 страниц потребление где-то 1 гагабайт, зато без segfault`а :)!

Doctrine 1.2 и Symfony 1.4 советы

Standard

Чтобы вставить несколько записей за раз, сделайте такую штуку:

но на всякий пожарный коллега здесь реализовал это через наследование Doctrine_Query. Возможно его реализация быстрее.
Как делать миграции:

  1. Измените schema.yml
  2. Запустите ./symfony doc:generate-migrations-diff
  3. ./symfony doc:migrate
  4. ./symfony doc:build —all-classes

Как предотвратить удаление записи в doctrine:

public function preDelete(Doctrine_Event $event){
$event->skipOperation();
}

Либо назначить свой Listener чтобы предотвратить удаление:

$userTable = Doctrine_Core::getTable('User');
$userTable->addRecordListener(new HydrationListener());

Как использовать passwd

Standard

Коротка заметка ( в будущем наполню):
1) Заходите в document root сайта и выполняете htpasswd -c .passwd someuser
где .passwd — файл к-ый будет создан и someuser — имя пользователя
2) В .htaccess вашего document root пропишите

AuthType Basic
AuthBasicProvider file
AuthUserFile /path/to/your/file/.passwd
Require user someuser

Проблемы с proftpd

Standard

Если у вас появилась такая строка «proftpd unable to determine ip address».

Это значит, следующее: ftp берет название вашего хоста из /etc/hostname и дальше пытается определить его ip-адрес, но не может. Скорей всего эта ошибка появится когда вы измените hostname на серваке. Решение — простое, добавьте в /etc/hosts строку:

127.0.0.1 YourHostname.

Как подключиться по openvpn в ubuntu

Standard

Только что пришлось подключаться через vpn,  в windows постоянно были какие-то косяки, и хаки с openvpn клиентом. Сел за ubuntu, и все завелось в пару команд.

Итак наши  действия:

  1. Устанавливаем openvpn: sudo apt-get install openvpn
  2. Подключаемся используя конфиг-файл: openvpn —config your_config_file

Вышел php 5.5 alpha 3

Standard

Раз уж я начал освещать каждый новый выход php 5.5, тогда продолжу.

Итак предыдущие обзоры:

В третей альфе, сделаны следующие изменения (нововведения):

  1. Добавлен метод Generator::throw()
  2. Новые cURL функции и опции, например: curl_escape(), curl_multi_setopt(), curl_multi_strerror(), curl_pause(), curl_reset()
  3. Поддержка атрибута Max-Age в setcookie функции
  4. Исправлено пару багов в mysqlnd и ядре

Весь список изменений здесь. Я очень часто использую curl, поэтому добавление новых функций в расширение только приветствую, жду не дождусь set, get операций над cookies.

Книги по javascript и jQuery

Standard

Продолжаю серию статей по книжной тематике, книги для других языков:

JavaScript: The Definitive Guide

Javascript the definitive guide

Это моя первая книга по JavaScript, описывает все с нуля, вполне простым языком. Как правило все начинают именно с нее. Написано очень подробно, даже очень — сначала описывается сам язык, потом его взаимодействие с бразуером, затем полный справочник по языку и api браузера. Замечу, что у Ильи Кантора — создателя сайта javascript.ru есть курсы для новичков, года два назад я записался на начальный курс и он был практически идентичен, тому что вы найдете в этой книге (хотя Илья иногда отмечал особенности браузеров — чего в книге нет, UPDATE: начал перечитывать и понял, что ошибся — особенности браузеров тоже описаны) , впрочем строение курса скорей всего поменялось. Сейчас на английском есть 6-ое (!) издание книги, я заказал себе одну с амазона, так что кому надо могу отдать 5-ое издание на русском совершенно бесплатно (правда там много пометок карандашом). Если вы новичок — это пожалуй, самая лучшая книга для старта.

JavaScript & jQuery: The Missing Manual

JavaScript & jQuery: The Missing Manual

Книга написана очень ясно и понятно, минимум теории — максимум практики. Большая часть отведена под jQuery, есть раздел посвященный фишкам, например как сделать галлерею фотографий, с их предзагрузкой (так вконтакте, кстати делает). Если посмотрите на рейтинг книг по javascript на amazon — missing manual идет практически вровень с definitive guide, так что если вы начнете с этой книги ничего не потеряете.

JavaScript: The Good Parts

JavaScript The Good Parts

Из предисловия: «Большинство языков программирования содержат хорошие и плохие части, но JavaScript имеет больше плохих, будучи разработанным и выпущенным в спешке перед тем как эти части могли быть пересмотрены».  Несмотря на то, что книга о хороших особенностях языка, всё плохое здесь описано и даются соответствующие рекомендации как это обходить. Много внимания уделено особенностям наследования и его отличиям от обычной ООП парадигмы. Подойдет для программиста среднего уровня. Написана Дугласом Крокфордом — человеком, к-ый популяризировал json и создал замечательный инструмент JSLint. Да и что касается объема страниц вот вам сравнение с первой книгой :)

 

Регистрация facebook приложения

unnamed
Standard

Казалось бы, что такого сложного в регистрации приложения  :), но мне «повезло» так как мой сотовый оператор — МТС.

Страница создания приложения здесь, facebook необходим ваш телефон, его можно добавить на странице мобильных настроек, на ней можно получить код, к-ый надо отправить на определенный номер, но у МТС есть неприятная особенность — весь трафик из фейсбука (возможно от других соц. сетей тоже) блокируется, получается что смс с ответным кодом не придет. Решение — подключить услугу МТС Онлайн, все это дело стоит 1.5 руб в день, правда нам ведь никто не мешает подключить и сразу отключить :)