PHP для собственного клиента (NaCl) - PullRequest
1 голос
/ 12 декабря 2011

Есть ли проекты, портирующие php на собственный клиент ?Я не смог их найти.

Моя цель - выполнить проверку php lint без необходимости совершать обходы на сервер.

Ответы [ 3 ]

3 голосов
/ 16 января 2015

Ответ на вопрос @ crystal-miller о возрождении этого вопроса: я не знаю ни одного PHP-порта для NaCl, но существует множество портов для других языков, поэтому следующая информация должна указать вам верное направление, если вы хотите порт PHP (или любой другой язык) на NaCl.

Команда NaCl хранит список проверенных регрессией портов в naclports . Все они достаточно современны, иногда содержат небольшой патч, примененный к вышестоящему проекту (хотя команда пытается передать эти патчи вверх по течению), и имеют правильное значение make для построения для различных целей NaCl и PNaCl (portable, x86) -32, x86-64, ARM, статическое связывание, динамическое связывание, ...).

Вы можете начать с naclports , чтобы увидеть, есть ли ваш проект там. Если у вас работает PHP, я предлагаю связаться со списком рассылки и внести ваши изменения.

Следующий хитрый момент - хотите ли вы запустить язык:

  • В браузере Chrome, в открытом Интернете.
  • Как расширение Chrome или app .
  • На машине, например сервер.

Основной подход к компиляции будет таким же, но то, как приложение взаимодействует с внешним миром, будет совершенно другим: песочница предоставляет механизмы связи для взаимодействия с процессами вне песочницы.

На стороне компиляции вы можете выбрать между таргетингом на сам NaCl (который зависит от архитектуры: x86-32 / x86-64 / ARM / MIPS) или PNaCl (независимость от архитектуры). Оба являются независимыми от ОС и могут выполняться как расширение / приложение или на сервере, но только PNaCl может выполняться в открытой сети. Набор инструментов NaCl основан на GCC (на момент написания 4.4 x86, 4.9 для ARM), тогда как набор инструментов PNaCl основан на LLVM 3.5 (который скоро станет верхушкой дерева). Цепочка инструментов PNaCl также может быть использована для нацеливания на NaCl, на данный момент это несколько сложно, но скоро станет намного лучше с nacl-clang . Набор инструментов NaCl поддерживает статическое и динамическое связывание (посредством newlib или glibc), а также обработку исключений C ++ с нулевой стоимостью, в то время как набор инструментов PNaCl в настоящее время поддерживает только статическое связывание ( в процессе добавления динамического связывания ) и SJLJ обработка исключений на основе (нулевая стоимость, чтобы прибыть позже).

Это звучит сложно, но в целом это всего лишь компилятор с большим количеством ручек: для распространения в сети требуется скорость и переносимость.

Следует помнить одну вещь: NaCl поддерживает ограниченную динамическую генерацию кода (например, существует моно-порт , использующий JIT-компиляцию), но PNaCl в настоящее время не поддерживает. Это означает, что переводчики намного проще переносить (даже V8 работает в NaCl таким образом). Некоторые языки, такие как Halide, Rust или Julia, генерируют битовый код LLVM, и этот битовый код можно передать в PNaCl, но на момент написания этого документа иногда бывает сложно, следите за обновлениями этого списка рассылки (некоторые люди заставили их работать). Однако можно динамически генерировать файлы PNaCl .pexe, сохранять их в локальной файловой системе и выполнять их, а с помощью динамического связывания вы сможете сделать то же самое с .pso.

При выполнении в составе Chrome (открытый веб-сайт, расширение или приложение) есть API для связи с остальной частью Chrome . Некоторые из API-интерфейсов требуют привилегий, некоторые ограничены расширениями / приложениями (потому что они не соответствуют модели Интернета), а некоторые требуют, чтобы пользователь зарегистрировался.

В качестве части Chrome вы также можете использовать nacl_io , который эмулирует еще большее поведение POSIX и позволяет вам, например, смонтировать файловую систему HTML5, а затем просто использовать обычные API POSIX.

При работе в качестве сервера все становится сложнее: вы должны выяснить, как взаимодействовать с внешним миром, а NaCl не имеет API по умолчанию. Это возможно, однако: Google использует NaCl для внутреннего использования, и есть проекты, такие как ZeroVM и Ripple Lab Codius Smart Contracts , которые делают это. В этих обстоятельствах вы можете использовать NaCl sel_ldr или sel_ldr_seccomp для выполнения файлов NaCl .nexe (версия seccomp устанавливает изолированную программную среду на основе seccomp вокруг обычной изолированной программной среды NaCl для фильтрации syscall, я рекомендую занимаюсь этим тоже). Собственные тестовые наборы NaCl и PNaCl используют sel_ldr для проведения регрессионного тестирования.

Имея это в виду, я думаю, что у вас есть указатели на всю информацию, необходимую для начала работы в любом направлении!

0 голосов
/ 17 января 2015

Я использовал php.js для проверки PHP в браузере. http://phpjs.hertzen.com/

PHP.js - это PHP vm, написанный на Javascript. Это работает, но не является идеальным решением, так как некоторые из синтаксисов устарели. Раствор NaCl, вероятно, будет лучше, так как я предполагаю, что его будет легче поддерживать. Но пока что это лучшее, что я смог найти.

0 голосов
/ 12 декабря 2011

[редактировать] Я вижу, что вы после этого ... Было бы полезно опубликовать ссылку на страницу проекта Google.

Возможно, вы находитесь в такой ситуации, когда вам нужно самостоятельно скомпилировать его для NaCl. Я не уверен, что оригинальный ответ действительно полезен, но я оставляю его для потомков. :)


Использовать версию PHP для командной строки .

Вы захотите использовать проверку синтаксиса option

-l               Syntax check only (lint)

Полный справочник

Usage: php [options] [-f] <file> [--] [args...]
       php [options] -r <code> [--] [args...]
       php [options] [-B <begin_code>] -R <code> [-E <end_code>] [--] [args...]
       php [options] [-B <begin_code>] -F <file> [-E <end_code>] [--] [args...]
       php [options] -- [args...]
       php [options] -a

  -a               Run interactively
  -c <path>|<file> Look for php.ini file in this directory
  -n               No php.ini file will be used
  -d foo[=bar]     Define INI entry foo with value 'bar'
  -e               Generate extended information for debugger/profiler
  -f <file>        Parse and execute <file>.
  -h               This help
  -i               PHP information
  -l               Syntax check only (lint)
  -m               Show compiled in modules
  -r <code>        Run PHP <code> without using script tags <?..?>
  -B <begin_code>  Run PHP <begin_code> before processing input lines
  -R <code>        Run PHP <code> for every input line
  -F <file>        Parse and execute <file> for every input line
  -E <end_code>    Run PHP <end_code> after processing all input lines
  -H               Hide any passed arguments from external tools.
  -s               Output HTML syntax highlighted source.
  -v               Version number
  -w               Output source with stripped comments and whitespace.
  -z <file>        Load Zend extension <file>.

  args...          Arguments passed to script. Use -- args when first argument
                   starts with - or script is read from stdin

  --ini            Show configuration file names

  --rf <name>      Show information about function <name>.
  --rc <name>      Show information about class <name>.
  --re <name>      Show information about extension <name>.
  --rz <name>      Show information about Zend extension <name>.
  --ri <name>      Show configuration for extension <name>.
...