2011-12-12 52 views
1

有没有任何项目将php移植到native client? 我一直没能找到任何。本地客户端(NaCl)的PHP

我的目标是做php lint检查,而不必进行往返服务器。

+0

我希望我回答你的问题在下面!我不确定你是以开放网络,扩展/应用程序还是服务器用例为目标,所以我试图回答所有这些问题。 –

+0

你看过http://www.icosaedro.it/phplint/?或想到在命令行上使用php命令做这件事? – unixmiah

+0

Phplint没有帮助,因为它运行在PHP中,目的是在不连接到服务器的情况下在浏览器中执行lint检查。 –

回答

0

我结束了使用php.js lint在浏览器中检查PHP。 http://phpjs.hertzen.com/

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

0

我明白你现在的想法......发布一个链接到google项目页面会有帮助。

您可能正处于需要自己编译NaCl的地步。我不确定最初的答案是否真的有用,但我将它留给子孙后代。 :)


使用command line version of 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>. 
3

接听@晶米勒的这个问题的复兴:我不知道任何PHP的端口到NaCl,但是有很多其他语言的端口,所以如果您希望将PHP(或任何其他语言)移植到NaCl,以下信息应指向正确的方向。

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

您需要从naclports开始查看您的项目是否在那里。如果你确实让PHP工作,我建议contacting the mailing list并贡献你的改变。

下一个棘手的一点是,你是否要运行的语言:

  • 在Chrome浏览器,开放的网络上。
  • 作为Chrome extensionapp
  • 在一台机器上,例如一台服务器。

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

在编译方面,您可以选择针对NaCl本身(架构特定:x86-32/x86-64/ARM/MIPS)或PNaCl(架构不可知)。两者都是操作系统不可知的,可以作为扩展/应用程序或服务器执行,但只有PNaCl可以在打开的网络上执行。 NaCl工具链基于GCC(写入x86的4.4版本,ARM的版本为4.9),而PNaCl工具链则基于LLVM 3.5(即将成为树结点)。 PNaCl工具链也可以用来定位NaCl,目前有点复杂,但是should get much better soon with nacl-clang。NaCl工具链支持静态和动态链接(通过newlib或glibc)以及零成本C++异常处理,而PNaCl工具链目前仅支持静态链接(work in progress to add dynamic linking)和基于SJLJ的异常处理(零成本稍后) 。

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

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

当作为铬的部分(开放式网络或扩展程序或应用)执行有APIs to communicate with the rest of Chrome。有些API需要特权,有些仅限于扩展/应用(因为它们不适合网络模型),有些需要用户选择加入。

自Chrome的一部分,您可能还需要使用nacl_io看齐更加POSIX的行为,并允许你如安装HTML5文件系统,然后使用常规的POSIX API。

当作为一个服务器运行的东西比较复杂:你必须弄清楚如何与外界沟通,和NaCl没有默认的API。但有可能:Google在内部使用NaCl,并且有ZeroVM和Ripple Lab的Codius Smart Contracts这样的项目。在这种情况下,你可能要依靠氯化钠的sel_ldrsel_ldr_seccomp执行氯化钠.nexe文件(seccomp版本设置围绕通常氯化钠沙箱基于的Seccomp沙箱做系统调用过滤,我建议过这样做)。 NaCl和PNaCl自己的测试套件使用sel_ldr进行回归测试。

考虑到这一点,我认为你已经指出了你需要从任何方向入手的所有信息!