javascript — интерпретируемый язык внутри PHP для запуска пользовательских скриптов

Моему приложению нужно выполнить некоторые математические операции с некоторыми данными. Поскольку эти операции будут меняться очень часто, я подумал об использовании интерпретируемого языка и позволил пользователю писать их.

Я вижу, что в PHP есть как LUA, так и JS-анализатор, однако документация очень плохая.

Существуют ли интерпретируемые языки, которые можно анализировать с PHP? Мне нужны только базовые операторы if-then-else и math

1

Решение

Даже если документации немного, я пойду на LUA, используя скрипт установки, найденный здесь https://github.com/chtombleson/php-lua-install-script

Другие поддерживаемые языки перечислены здесь http://pecl.php.net/packages.php?catpid=59&catname = Языки

1

Другие решения

Я знаю, что уже поздно отвечать на это, но …

Работа с настраиваемой пользовательской логикой и отсутствие простого, готового к работе решения — вот почему я просто пошел дальше и создал свой собственный язык сценариев под названием прими.

Написан исключительно на PHP, изолирован в песочнице и интерпретируется PHP. Сделано без зависимостей от некоторых внешних двоичных файлов и / или библиотек или каких-либо необычных, нестандартных расширений PHP.

Я имею в виду, phpv8 / v8js довольно здорово (и похоже, что они проделали большую работу за последние 2 года), но посаживании его к трудовой деятельности часть была для меня довольно грубой — по крайней мере, в то время, когда я занимался исследованиями существующих сценариев (и с моими ограниченными знаниями Linux). Загрузка и компиляция Google V8, настроить компиляцию расширения и, наконец, заставить его работать — это даже не вариант иногда, если у вас нет абсолютного контроля над вашей машиной (облачный хостинг и прочее).

Прими наиболее определенно очень, очень плохой на любой полноценный язык сценариев / программирования, такой как PHP, JS, Python и т. д. — как по функциям, так и по производительности (интерпретируется PHP).

Цель Прими не состоит в том, чтобы делать сложные вещи — иметь ООП, поддерживать классы, асинхронные вещи или еще много чего (по крайней мере, не сейчас) — а чтобы обеспечить простой способ для разработчика, чтобы позволить его / ее клиентам написать собственную логику (вычисления, условия, циклы, манипуляции со строками и т. д.) это может быть благополучно выполнен внутри интерпретатора Primi, который сам исполняется PHP и, таким образом, ограничивается собственной виртуальной машиной PHP.

И все это без каких-либо изменений в окружающей среде (Установка бинарных файлов для всей ОС, компиляция библиотек).

прими может быть установлен как Композитор а затем используется мгновенно:

composer require smuuf/primi

И это все для процесса установки.

Затем интерпретатор можно использовать так:

$context = new \Smuuf\Primi\Context;
$interpreter = new \Smuuf\Primi\Interpreter($context);

try {

// Let the interpreter run a source code.
$interpreter->run('a = 1; b = a + 2; c = "some string"; d = c + " extra thing";');

// Get defined variables from primary context and print them.
foreach ($context->getVariables() as $name => $value) {
printf("%s (%s) ... %s\n", $name, $value::TYPE, $value->getPhpValue());
}

} catch (\Smuuf\Primi\ErrorException $e) {
die($e->getMessage());
}

Запуск этого кода в PHP приведет к следующему:

a (number) ... 1
b (number) ... 3
c (string) ... some string
d (string) ... some string extra thing

Я автор этого

Если вы обнаружите какие-либо ошибки, о которых будете сообщать, у вас есть предложения по новым функциям, или вы просто хотите посмотреть, как это работает или хотите помочь, вы можете найти все остальное здесь: https://github.com/smuuf/primi.

1

Я, вероятно, сделал бы это комментарием, но это слишком долго, и это технически ПОЧТИ ответ :-p

Если вам нужен самый простой подход для ваших пользователей … когда пользователь вводит уравнение, а затем вы несете ответственность за его использование на последующих страницах … тогда вы можете выполнить разбор строк.

Так, например, вы найдете все текстовые символы в строке и конвертируете их во входные данные. Итак, с помощью уравнения «2x» вы бы создали один вход: 2<input name='x' /> Затем в посте вы конвертируете 2x в:

$result = floatval(2) * floatval($_GET['x']);

Примерно так довольно безопасно, если вы не доверяете ни уравнению, ни пользовательскому вводу в виде кода PHP … гарантируете правильные типы и т. Д. Однако, в зависимости от вашего опыта, правильно анализируйте строку и превращаете 2y в 2 * у, и т. д., будет вашим вызовом, и больше, чем я могу ответить в данное время.

Дело в MathML в том, что если вы можете взять уравнение пользователя и преобразовать его в MathML, вы сможете воспользоваться работой других людей для обработки уравнения. Суть моего комментария заключалась не в том, чтобы пользователь сам использовал MathML … это ваша работа 🙂

0
По вопросам рекламы [email protected]