Тоже мучался подобной проблемой — однако так и не нашел красивого решения. Статический метод — не слишком хорошо, комментарии — тоже, instanceof засоряет код. Остановился на комментариях как предложил .
public static function getMongoDb ()
{
static $mongodb, $mongo;
if ($mongodb === null) {
$mongo = new \Mongo (MONGO_SERVER);
$mongodb = $mongo->selectDB (MONGO_DATABASE);
}
return $mongodb;
}
Да, при выборе коллекции по прежнему выполняется соединение с mongo, однако если нигде на странице Mongo не используется — объекты для работы с ним так и не будут созданы.
можно перед отдачей страницы класть html в кэш (redis, memcached, а ключ составить из запроса и критичных кук), а в index.php до всего-всего-всего проверять наличие флага «повышенная нагрузка». если флаг стоит — не грузить php код, а отдавать страницу из кэша.
флагом может быть файл — например по крону проверять нагрузку на сервер и создавать /tmp/ddos, если она повышена