1

是否有任何项目将 php 移植到本机客户端?我一直找不到。

我的目标是在不必往返服务器的情况下进行 php lint 检查。

4

3 回答 3

3

回答@水晶米勒对这个问题的复兴:我不知道有任何 PHP 移植到 NaCl,但是有很多其他语言的移植,所以如果你想移植 PHP,以下信息应该为你指明正确的方向(或任何其他语言)到 NaCl。

NaCl 团队在naclports中保留了经过回归测试的端口列表。这些都是最新的,有时包含一个应用于上游项目的小补丁(尽管团队试图上游这些补丁),并且具有make为各种 NaCl 和 PNaCl 目标(便携式、x86-32、 x86-64、ARM、静态链接、动态链接……)。

你会想从naclports开始,看看你的项目是否在那里。如果您确实让 PHP 正常工作,我建议您联系邮件列表并贡献您的更改。

下一个棘手的问题是您是否要运行该语言:

  • 在 Chrome 浏览器中,在打开的网络上。
  • 作为 Chrome扩展程序应用程序
  • 在机器上,例如服务器。

编译的基本方法是相同的,但应用程序与外界通信的方式将完全不同:沙箱公开通信机制以与沙箱外的进程通信。

在编译方面,您可以选择针对 NaCl 本身(特定于体系结构:x86-32/x86-64/ARM/MIPS)或 PNaCl(与体系结构无关)。两者都与操作系统无关,可以作为扩展程序/应用程序或在服务器上执行,但只有 PNaCl 可以在开放 Web 上执行。NaCl 工具链基于 GCC(截至编写 x86 的 4.4,ARM 为 4.9),而 PNaCl 工具链基于 LLVM 3.5(即将成为树尖)。PNaCl 工具链也可用于针对 NaCl,目前这有点复杂,但使用 nacl-clang 应该会变得更好。NaCl 工具链支持静态和动态链接(通过 newlib 或 glibc)以及零成本 C++ 异常处理,而 PNaCl 工具链目前仅支持静态链接(正在进行中以添加动态链接) 和基于 SJLJ 的异常处理(稍后将实现零成本)。

这听起来很复杂,但总的来说它只是一个带有很多旋钮的编译器:在网络上分发需要速度和可移植性。

要记住的一件事:NaCl 确实支持一些有限的动态代码生成(例如,有一个使用 JIT 编译的Mono 端口),但 PNaCl 目前不支持。这意味着解释器更容易移植(即使 V8 在 NaCl 中也可以这样工作)。一些语言,如 Halide、Rust 或 Julia 生成 LLVM 位码,并且可以将此位码传递给 PNaCl,但在撰写本文时它有时仍然很棘手,请关注邮件列表以获取有关此的更新(有些人已经让这些工作)。然而,可以动态生成 PNaCl 的.pexe文件,将它们存储在本地文件系统中,然后执行它们,并且通过动态链接,您应该能够对.pso.

当作为 Chrome 的一部分(开放的网络或扩展程序或应用程序)执行时,有API 可以与 Chrome 的其余部分进行通信。一些 API 需要特权,一些仅限于扩展程序/应用程序(因为它们不适合 Web 的模型),还有一些需要用户选择加入。

作为 Chrome 的一部分,您可能还想使用nacl_io来模拟更多的 POSIX 行为,并允许您挂载 HTML5 文件系统,然后只使用常规的 POSIX API。

当作为服务器运行时,事情就更复杂了:你必须弄清楚如何与外界通信,而 NaCl 没有默认的 API。不过有可能:谷歌在内部使用 NaCl,并且有像ZeroVM和 Ripple Lab 的Codius 智能合约这样的项目可以做到这一点。在这些情况下,您可能希望依赖 NaClsel_ldrsel_ldr_seccomp执行 NaCl.nexe文件(该seccomp版本在通常的 NaCl 沙箱周围设置了一个基于 seccomp 的沙箱来进行系统调用过滤,我建议也这样做)。NaCl 和 PNaCl 自己的测试套件用于sel_ldr进行回归测试。

考虑到这一点,我认为您已经掌握了从任何方向开始所需的所有信息!

于 2015-01-16T17:39:32.467 回答
0

[编辑] 我知道你现在在追求什么......如果发布一个指向 google 项目页面的链接会很有帮助。

您可能需要自己为 NaCl 编译它。我不确定原始答案是否真的有用,但我将其留给后代。:)


使用PHP 的命令行版本

您需要使用语法检查选项

-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>.
于 2011-12-12T17:14:57.210 回答
0

我最终使用 php.js 在浏览器中检查 PHP。 http://phpjs.hertzen.com/

PHP.js 是一个用 Javascript 编写的 PHP 虚拟机。它可以工作,但不是一个完美的解决方案,因为某些语法已经过时了。NaCl 溶液可能会更好,因为我认为它更容易维护。但与此同时,这是我能找到的最好的。

于 2015-01-17T18:44:47.117 回答