是否有任何项目将 php 移植到本机客户端?我一直找不到。
我的目标是在不必往返服务器的情况下进行 php lint 检查。
回答@水晶米勒对这个问题的复兴:我不知道有任何 PHP 移植到 NaCl,但是有很多其他语言的移植,所以如果你想移植 PHP,以下信息应该为你指明正确的方向(或任何其他语言)到 NaCl。
NaCl 团队在naclports中保留了经过回归测试的端口列表。这些都是最新的,有时包含一个应用于上游项目的小补丁(尽管团队试图上游这些补丁),并且具有make
为各种 NaCl 和 PNaCl 目标(便携式、x86-32、 x86-64、ARM、静态链接、动态链接……)。
你会想从naclports开始,看看你的项目是否在那里。如果您确实让 PHP 正常工作,我建议您联系邮件列表并贡献您的更改。
下一个棘手的问题是您是否要运行该语言:
编译的基本方法是相同的,但应用程序与外界通信的方式将完全不同:沙箱公开通信机制以与沙箱外的进程通信。
在编译方面,您可以选择针对 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_ldr
或sel_ldr_seccomp
执行 NaCl.nexe
文件(该seccomp
版本在通常的 NaCl 沙箱周围设置了一个基于 seccomp 的沙箱来进行系统调用过滤,我建议也这样做)。NaCl 和 PNaCl 自己的测试套件用于sel_ldr
进行回归测试。
考虑到这一点,我认为您已经掌握了从任何方向开始所需的所有信息!
[编辑] 我知道你现在在追求什么......如果发布一个指向 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>.
我最终使用 php.js 在浏览器中检查 PHP。 http://phpjs.hertzen.com/
PHP.js 是一个用 Javascript 编写的 PHP 虚拟机。它可以工作,但不是一个完美的解决方案,因为某些语法已经过时了。NaCl 溶液可能会更好,因为我认为它更容易维护。但与此同时,这是我能找到的最好的。