Вот вам отличный кавер на известный трек из NFS https://youtu.be/TLeZ-NcjfkQ. Если не вдаваться в текст, то все довольно замечательно. А текст песни про минет...
Раньше пользовался Zend debugger, т.к. он был в комплекте с Zend studio.
А теперь из-за того что в компании стараемся использовать open-source продукты (Net Beans, Eclipse) стал пользовать xdebug. Он даже как-то поудобнее мне показался:
1. Поставл точку останова, тыкнул хелпер в firefox, запустил сессию дебага и наслаждаешься
2. Более приятные var_dump и сообщение об ошибках
3. Плюс есть профилировщик
Я думаю, что стоило описать полность при каких условиях работает сей код.
Указать каие именно настроки нужно включить/выключить в php.ini, чтобы получить желаемый результат
первым же делом проверил приведенный пример через браузер.
Строчки «Program still executing....» я так и не увидел, зато "(! ) Fatal error: Call to undefined function ololo() in /home/www/test/fatal.php on line 59" светилась во весь экран
Возможно, ничем, если ты не собираешься помечать в кеше целые пространства имен как недействительные одним вызовом memcached->increment(), а постоянно хранить все значения $key, чтобы потом к ним всем применить memcache-delete(), или предпологать какие ключи у тебя уже есть в кеше.
да реализация такого механизма на уровне самого расширения, несомненно лучше нежели выстраивать самому весь фугкционал. И меньше писанины, и работает быстрее. Но, согласитесь, если нет возможности на хостинге управлять расширениями, то о патче и речи быть не может.
нашел еще пару интересных особенностей этого решения.
Приведу реальный пример из своей практики.
У меня есть класс Application. Он хранит сообщения об ошибках (например неправильно заполнена форма) во внутреннем массиве $_messages. Сообщения добавляются в массив следующим методом:
public function addMessage($text, $type = 'Error') {
if (empty($text)) return true;
if (empty($type))
$type = 'Error';
$this->_messages[$type][] = $text;
return true;
}
А извлекаются следующим методом:
public function getMessages($type = 'Error') {
if (empty($type)) {
$type = 'Error';
}
$aMessages = isset($this->_messages[$type]) ? $this->_messages[$type] : false;
$this->_messages[$type] = null;
return $aMessages;
}
А выводятся эти сообщения в шаблоне _errors.tpl, который инклудится в основном шаблоне layout.tpl, таким вот образом:
Т.е. логика работы этого механизма такова, что если сообщение было выведено для просмотра значит его уже не нужно выводить.
Но каково было мое удивление, когда применяя приведенный здесь механизм наследования шаблонов, я не увидел ни единого сообщения, добавленного в Application.
В ходе отладки выяснилось, что метод getMessage вызывается по 2 раза на каждый тип сообщений, т.е. шаблон рендерится дважды!!!
Если посмотреть документацию smarty по блоковым функциям, коими являются smarty_block_extends и smarty_block_block, то они вызываются по два раза, при открытии и закрытии соответствующих тегов smarty {extends} и {block}.
В случае с smarty_block_extends дважды вызовется метод $smarty->fetch!!! вот тут собака и порылась. Таким образом, родительский шаблон рендерится дважды. Но это не оптимально — раз, и приводит к печальному результату с моими сообщениями — два.
Чтобы этого избежать, нужно рендерить родительский шаблон всего лишь один раз, когда у нас имеются данные для подстановки в теги {block}, когда был обработан шаблон-потомок, а именно во время второго вызова smarty_block_extends.
Внутри функции smarty_block_extends ставим проверку вида:
if (!is_null($content)) {
return $smarty->fetch($params['template'], ...);
}
return false;
Казалось бы, проблема решена, но! Во время переназначения содержимого блоков в таком случае данные push'атся в обратном порядке, т.е. содержимое блока из шаблона-наследника будет не на ВЕРШИНЕ стека, а на его ДНЕ. Т.е при получении содержимого блока при помощи метода getBlock, мы получим значение блока из родительского шаблона.
Есть вопрос! Нужно делать почти такое же но с областями покрытия. К примеру, области отображаются кругами (реализуется через GPolygon), естественно их размеры пропроциональны масштабу, т.е. покрывает одну и ту же площадь земной поверхности, не так как у маркеров(размер маркера всегда один и тот же не зависимо от масштаба).
Так вот, задача состоит в том если на карте нанесено огромное количество таких областей, как их объединить в группу или аппроксимировать, чтобы не нагружать пользовательскую машину. Эксперимент для 10000 областей положил браузер на 5 минут....
Секс, наркотики и убийства: смысл англоязычных песен, который мало кто замечает
Возрастные ограничения — от 12+. Ну да, рановато для минета. Но и в тексте прямым текстом об этом вроде не говорится ;)
Секс, наркотики и убийства: смысл англоязычных песен, который мало кто замечает
Вот вам отличный кавер на известный трек из NFS https://youtu.be/TLeZ-NcjfkQ. Если не вдаваться в текст, то все довольно замечательно. А текст песни про минет...
CleverStyle CMS — обзор для разработчика
CleverStyle CMS — обзор для разработчика
Работа с памятью (и всё же она есть)
Какой дебаггер для PHP вы используете и почему?
Какой дебаггер для PHP вы используете и почему?
А теперь из-за того что в компании стараемся использовать open-source продукты (Net Beans, Eclipse) стал пользовать xdebug. Он даже как-то поудобнее мне показался:
1. Поставл точку останова, тыкнул хелпер в firefox, запустил сессию дебага и наслаждаешься
2. Более приятные var_dump и сообщение об ошибках
3. Плюс есть профилировщик
Как обрабатывать Fatal Error в PHP
Как обрабатывать Fatal Error в PHP
Я думаю, что стоило описать полность при каких условиях работает сей код.
Указать каие именно настроки нужно включить/выключить в php.ini, чтобы получить желаемый результат
Как обрабатывать Fatal Error в PHP
output_buffering 4096
какие еще нужны настроки?
Как обрабатывать Fatal Error в PHP
Строчки «Program still executing....» я так и не увидел, зато "(! ) Fatal error: Call to undefined function ololo() in /home/www/test/fatal.php on line 59" светилась во весь экран
Как обрабатывать Fatal Error в PHP
Квест на хабре
Квест на хабре
Квест на хабре
/* Внутренний голос */
.i-am-your-father-luke {
display: block;
clear:both;
padding:.6em 0;
border: none;
font: normal 40px/110% Arial,sans-serif;
color: #cc9;
letter-spacing: -2px;
}
/* НЛО прилетело и написало */
.ufo-was-here {
margin-bottom: 20px;
font: normal 16px/110% Verdana,sans-serif;
color:#666;
}
Пространства имен в memcahced
Смотри первое предложение, второго абзаца.
Пространства имен в memcahced
Закрепляем jQuery — 25 отличных советов
Наследование шаблонов в Smarty
Приведу реальный пример из своей практики.
У меня есть класс Application. Он хранит сообщения об ошибках (например неправильно заполнена форма) во внутреннем массиве $_messages. Сообщения добавляются в массив следующим методом:
А извлекаются следующим методом:
А выводятся эти сообщения в шаблоне _errors.tpl, который инклудится в основном шаблоне layout.tpl, таким вот образом:
Т.е. логика работы этого механизма такова, что если сообщение было выведено для просмотра значит его уже не нужно выводить.
Но каково было мое удивление, когда применяя приведенный здесь механизм наследования шаблонов, я не увидел ни единого сообщения, добавленного в Application.
В ходе отладки выяснилось, что метод getMessage вызывается по 2 раза на каждый тип сообщений, т.е. шаблон рендерится дважды!!!
Если посмотреть документацию smarty по блоковым функциям, коими являются smarty_block_extends и smarty_block_block, то они вызываются по два раза, при открытии и закрытии соответствующих тегов smarty {extends} и {block}.
В случае с smarty_block_extends дважды вызовется метод $smarty->fetch!!! вот тут собака и порылась. Таким образом, родительский шаблон рендерится дважды. Но это не оптимально — раз, и приводит к печальному результату с моими сообщениями — два.
Чтобы этого избежать, нужно рендерить родительский шаблон всего лишь один раз, когда у нас имеются данные для подстановки в теги {block}, когда был обработан шаблон-потомок, а именно во время второго вызова smarty_block_extends.
Внутри функции smarty_block_extends ставим проверку вида:
Казалось бы, проблема решена, но! Во время переназначения содержимого блоков в таком случае данные push'атся в обратном порядке, т.е. содержимое блока из шаблона-наследника будет не на ВЕРШИНЕ стека, а на его ДНЕ. Т.е при получении содержимого блока при помощи метода getBlock, мы получим значение блока из родительского шаблона.
Решение: заменить в методе setBlock
на
Что делать, если ваша карта выглядит так?
Так вот, задача состоит в том если на карте нанесено огромное количество таких областей, как их объединить в группу или аппроксимировать, чтобы не нагружать пользовательскую машину. Эксперимент для 10000 областей положил браузер на 5 минут....