Дмитрий: если нужно реализовать задачу, где блоков много — решение будет немного другим.
По поводу медленного раскрытия/закрытия: по клику добавляйте/убирайте класс на нужном элементе. В CSS для этого класса используя свойство transition, анимируйте свойство max-height (от 0 к фиксированному значению, и наоборот. Не забудьте про overflow-y: hidden).
Назар Мокринский: вряд ли у человека, который поднимет Runkit Sandbox на сервере, появится вопрос "почему мой сервер упал?". Что касается "как положено" — это очень относительно. И да, я не против вашего варианта с Docker.
Назар Мокринский: проблемы притянуты за уши, все решаемые (кроме п.4 — вы его, видимо, написали чтобы пунктов было больше). Даже несмотря на это, мой ответ релевантен, поскольку отвечает на вопрос автора "как вменяемо выполнить PHP код от юзера".
Саша: в тегах есть jQuery, поэтому я привел такой пример. Правильно ли я понимаю, у вас мало опыта и поэтому вы, во первых, не правильно поняли задачу, а во вторых рекомендуете использовать селекторы типа $('div') и не кэшировать их?
Максим Панов: toggleClass() вторым параметром принимает логический литерал, который задает, грубо говоря, приоритет. Если получит false, он сначала добавит класс, а потом уберет. С true — будет наоборот.
В вашем случае нужно добавлять класс только пока удерживается клавиша мыши, поэтому используется проверка типа события e.type == "mousedown", которая возвращает true при событии mousedown и false если это mouseup.
По поводу медленного раскрытия/закрытия: по клику добавляйте/убирайте класс на нужном элементе. В CSS для этого класса используя свойство transition, анимируйте свойство max-height (от 0 к фиксированному значению, и наоборот. Не забудьте про overflow-y: hidden).