Встроенные скриптовые языки для PHP?
Мне было интересно, если кто-нибудь знает хороший скриптовый язык, который может быть встроен в php? Javascript был бы любимым, и хотя есть несколько попыток, они либо слишком шаткие / медленные / устаревшие (phpjs, j4p5), либо реальная боль, чтобы начать работать на общих хостах (pecl spidermonkey).
Исходная информация: я хотел бы иметь язык, который используется для управления php на сервере, но он также должен поддерживать некоторую логику, поэтому yaml, xml или json просто недостаточно. Я изучал интерпретаторы LUA и "Winter" от Mediakwiki, но все они либо полагаются на внешние движки, либо имеют мощную привязку.
Привязка pecl spidermonkey представляется наиболее полной, где вы можете зарегистрировать переменные, функции и целые объекты в js-engine. Кто-нибудь знает какую-либо систему или язык, который может приблизиться к тому, что я ищу?
Лучший
Рольф
2 ответа
Я понимаю вашу озабоченность. Даже для надежных источников PHP предоставляет больше доступа, чем необходимо для всей среды веб-запроса. Даже если сценаристам доверяют, и даже если они могут нанести себе вред только из-за ошибки сценария, им будет проще использовать более ограниченную среду сценариев и поддерживать ее.
Вам нужно что-то, что можно отключить в песочнице, получить доступ только к тем ресурсам, которые вы явно назначаете для его области действия, и выполнять в среде выполнения "play in the play", а не в собственной PHP.
Одним из подходов является использование языка веб-шаблонов для пользовательских скриптов. Они обеспечивают определенный уровень контроля (например, назначение переменных) и закрывают другие опции, например, вы не можете написать бесконечный цикл. Я использовал Velocity для этой цели в приложениях Java; Я думаю, что-то вроде Smarty может работать в PHP, но у меня нет прямого опыта использования этого для этой цели.
Другой подход, если то, что требуется для выполнения сценариев, ограничено доменом, заключается в реализации языка, специфичного для домена (DSL). Я упоминал об этом в этом ответе.
Кроме того, я не знаю ни одной чисто PHP-реализации языков сценариев. Это то, что меня заинтересовало бы.
Я не видел много движков, позволяющих включить другой язык сценариев в PHP:-(
Даже в PECL не так много записей (см., Например, категорию "языки": только одну, которую вы уже знаете).
А в PEAR я даже не нахожу ничего, что соответствовало бы вашим критериям...
Я немного поиграл со Spidermonkey (см. Эту статью в моем блоге на французском), и это довольно забавно, да. Но пару месяцев назад, когда я написал эту статью, ситуация была не очень стабильной, и с тех пор было всего несколько коммитов. Итак, я понимаю, почему хостинговые компании не будут предоставлять его на своих серверах...
Даже если бы я хотел, чтобы они: было бы здорово позволить разработчикам, не использующим PHP, разрабатывать сценарии для вашего приложения!
Вопрос, однако: зачем вам нужен / нужен другой язык, кроме PHP?
Я имею в виду, что PHP уже установлен на вашем сервере, у вас явно есть опыт работы с ним, и это довольно мощный язык... Так почему вы хотите / должны работать с чем-то другим?
Используя PHP eval, вы даже можете подумать о выполнении "динамического" PHP-кода (Да, eval - это eval, и все это, я знаю ^^)
Другой вариант, использующий такие вещи, как "exec" и тому подобное, будет, если вы находитесь на сервере Linux, запускать какой-то shell-скрипт; но я бы определенно предпочел кодирование в PHP, а не оболочку, и я, конечно, не единственный ^^
В любом случае, следите за ответами, которые вы можете получить, что также может заинтересовать меня;-)
В Symfony есть компонент ExpressionLanguage:
Компонент ExpressionLanguage предоставляет механизм, который может компилировать и оценивать выражения. Выражение - это однострочное выражение, которое возвращает значение (в основном, но не ограничиваясь, логическими значениями).
...
Назначение компонента - позволить пользователям использовать выражения внутри конфигурации для более сложной логики. В некоторых примерах Symfony Framework использует выражения для безопасности, для правил проверки и сопоставления маршрутов.
Ниже приведен пример языка:
# Get the special price if
user.getGroup() in ['good_customers', 'collaborator']
# Promote article to the homepage when
article.commentCount > 100 and article.category not in ["misc"]
# Send an alert when
product.stock < 15