Не думаю, что вы хотите, чтобы выполнял произвольный код вне какого-либо контейнера. В то время как код должен работать в неблагоприятных условиях в большинстве случаев, вы рискуете:
- Кто-то щекочет ошибку повышения привилегий в вашем ядре (вспоминается старая ошибка vmsplice)
- Кто-то настраивает неприятную сетевую службу
- Кто-то швыряет СПАМ в четыре угла Интернета (я их никогда не видел, но я уверен, что в Интернете есть есть углы)
- Кто-то намеренно мешает нормальному использованию вашего сервера, выполняя раздражающий код.
Я бы рекомендовал, учитывая те потенциальные проблемы, в которых вы используете какую-то технологию виртуализации для фактического запуска кода. Некоторые кандидаты будут:
- QEMU (Быстрый грязный)
- Lguest (Быстрый и грязный)
- OpenVZ (немного сложнее)
- Паравиртуализация Xen (Требуется гипервизор, но идеально подходит для вашего использования)
Если у вашего университета есть доступ к таким инструментам, как Simics, вы, вероятно, могли бы использовать его вместо этого и предложить более полную отладку на уровне машины. Я не уверен, это было в то время как , так как я использовал Simics.
В этих случаях вы должны сделать копию операционной системы, поместить загруженный код в нее и выполнить сценарии для сборки, запуска и сбора выходных данных при загрузке. Это позволяет устанавливать строгие правила относительно продолжительности выполнения кода, сохранять его изолированным и предлагать сборки на нескольких архитектурах. Просто направьте выходные данные сборки и программы в файл, который вы получите после выполнения.
Также необходимо убедиться, что среда сборки поддерживает максимально возможное количество локалей.
Если вы хотите получить бонусные баллы, используйте также Valgrind. Тем не менее, вы захотите установить ограничение на уровень сложности сборки, который вы хотите обрабатывать ... чтобы вы могли сосредоточиться на функциях, которые делают вашу систему удобной для ее заявленной цели.
В любом случае, семейство вызовов PHP exec() / shell_exec()
должно быть достаточно, чтобы ваш интерфейс запускал скрипт, который запускает все остальное.