PHP: обрезаем backtrace у exception

Разберём следующий кейс.

Разрабатываем мы на своём любимом похапэ некую систему и используем при этом некую библиотеку.
Пускай, например, это будет вот эта поделка для работы с базой данных.

И вот мы вызываем какой-то метод в нашей системе, тот вызывает ещё какой-то и так далее.
И, в конце концов, где-то мы обращаемся к вышеозначенной библиотеке:

$db->query('SELECT * FROM `test` WHERE `id`=?i')->el();

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

И вот, вызванный нами, метод query() начинает обращаться к каким-то другим классам библиотеки, те к следующим и так далее, всё как обычно.
В какой-то момент доходит дело до того, чтобы данные в запрос на нужные места вставлять и тут выясняется, что данных нет никаких. Ну и, ясное дело, всё валится с исключением:

go\DB\Exceptions\DataNotEnough: Data elements (0) less than the placeholders in /test/my/db/Helpers/Templater.php on line 126
 
Call Stack:
    1. {main}() /test/my/index.php:0
    2. callMyClass() /test/my/index.php:14
    3. MyClass->method() /test/my/index.php:11
    4. MyClass->selectDB() /test/my/MyClass.php:7
    5. go\DB\DB->query() /test/my/MyClass.php:20
    6. go\DB\DB->makeQuery() /test/my/db/DB.php:92
    7. go\DB\Helpers\Templater->parse() /test/my/db/DB.php:312
    8. preg_replace_callback() /test/my/db/Helpers/Templater.php:57
    9. go\DB\Helpers\Templater->placeholderClb() /test/my/db/Helpers/Templater.php:57

Смотрим мы печальными глазами на этот вывод и читаем сообщение, ага, забыли данных накидать.
А вот где именно это случилось, хрен поймёшь.
Исключение указывает на точку, где его выбросили, то есть глубоко в недрах библиотеки и делать нам там нечего.
Нам нужна та точка, где мы в эту библиотеку с невалидными данными вошли.

Остальной текст под катом

go\Request: доступ к данным запроса (PHP)

В рамках цикла «изобретение велосипедов» представляю релиз-кандидат библиотечки go\Request.

Библиотека осуществляет доступ к параметрам с которыми вызван наш сценарий: GET/POST-данные, куки, переменные окружения, заголовки запроса, настройки сервера и клиента, аргументы и опции командной строки и тому подобное.
Остальной текст под катом

WordPress: похожие посты (хардкор-вариант)

Задача: в wordpress’е после статьи выводить список «похожие статьи».

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

По запросу «wordpress similar posts» можно найти множество плагинов данной тематики. У них у всех отличный код, подробная документация и богатый набор настроек. Единственный минус: вместо похожих постов они выводят какую-то рандомную хероту.
Остальной текст под катом

Hostgen.py: генератор конфигов Apache под Win

Большая часть web-разработки проходит у меня на данный момент в Windows и под Apache. При этом часто приходится создавать локальные домены (и часто удалять их). При этом процесс создания обычно следующий:

  1. Вспомнить, где у меня лежит vhosts.conf и найти его
  2. Скопипастить одну из секций <VirtualHost>
  3. Внести в неё нужные изменения для нового домена
  4. Выдумать домену уникальный локальный IP и указать его тут же
  5. Откопать глубоко в недрах папки Windows файл hosts и добавить IP туда
  6. Перезапустить Apache
  7. PROFIT

Это утомляло мою лентяйскую натуру. Кроме того, я намеревался написать какую-нибудь простенькую утилитку на Python, для лучшего изучения этого, пока ещё тёмного для меня языка. Встречайте — Hostgen.py, может даже кому-нибудь пригодится. (Брать — здесь, zip 11K)
Остальной текст под катом