English 中文(简体)
为什么 PHP 在 Java 编译为字节码文件时使用 opcode 缓存?
原标题:Why does PHP use opcode caches while Java compiles to bytecode files?
  • 时间:2012-05-23 08:58:15
  •  标签:
  • php
  • apc

在我看来, PHP 和 Java 都有相似的结构 。 首先, 您要写一些高级代码, 然后必须将其翻译为简单的代码格式, 由 VM 执行 。 一个区别是, PHP 直接使用源代码文件, 而 Java 将字节代码存储在. class 文件中, VM 可以从那里装载它们 。

目前,快速执行PHP的要求不断增长,这使人们相信,最好直接与Opcodes合作,而不是每次用户点击文件时都经过汇编步骤。

解决方案似乎是"http://en.wikipedia.org/wiki/List_of_PHP_accelerators" rel=“noreferrer”>, 也就是所谓的加速器 , 基本上将汇编的结果存储在缓存中, 然后使用缓存的代码, 而不是再次编译 。

Facebook的另一种做法是“a href=”“https://github.com/facebook/hippop-php” rel=“noreferrer” 完全将PHP 代码汇编成一种不同的语言。

因此,我的问题是,为什么在PHP世界里没有人能像爪哇所做的那样做呢?真的需要每次重整一些动态元素吗?不然的话,当代码进入生产过程,然后仅仅用它来工作时,将所有内容编集起来会非常明智。

最佳回答

最重要的区别在于,JVM有一个完全涵盖字节码的明确的规格。 这使得字节码文件可以便携式,不仅对通过实施具体JVM执行执行的操作有用。

PHP 甚至没有 < em> 语言规格 。 PHP 代码是特定 PHP 引擎的实施细节, 因此您无法真正做任何有趣的事情, 并且没有什么意义让它们更显眼 。

问题回答

PHP 代码与 Java 类文件不同。 Java 类文件非常具体, 且在机器之间可移动。 PHP 代码绝非可移动的。 例如, 它们有嵌入它们的内存地址 。 它们严格地说是 PHP 解释器的实施细节, 不应该被视为 Java 字节代码 。

是否必须这样? 不,也许不是。但PHP源代码是一团糟,而且PHP内部没有实现这一点的愿望和政治意愿。 我认为有人在谈论将一个代码缓存烤入PHP 6,但PHP 6死了,我不知道这个想法的状况。

`强力'参考 :我写了

PHP 不使用代码标准机制 。 我希望它不是粘在堆叠的 VM ( Python,java) 上, 就是粘贴的登记 VM (x86, perl6 等 ) 上。 但是它使用绝对本土化的东西, 上面有污点 。

它在内存中使用一个连接列表, 导致每个代码都具有 - & gt;op1 - & gt;op2 和 -gt; 结果。 现在, 每一个都是常数或临时表格中的条目等。 这些指针无法以任何正常方式序列化 。

现在,人们已经实现了这个目标, 使用像pectl/bcompiler这样的项目, 将流向磁盘中。

但班级使得事情更加复杂, 这意味着有潜在的代码碎片 比如

if(<conditon>)
{
   class XYZ() { }
}
else 
{
   class XYZ() { }
}

class ABC extends XYZ {}

这意味着关于类 & amp; 函数的大量决定只能在运行时完成, 类似 Java 的功能会窒息在两个同名的类别上, 在运行时有条件地定义这两个类别。 简而言之, APC 的继承 & amp; 类缓存代码可能是代码库中最复杂的 & amp; 易发生错误的部分。 当一个类被缓存时, 所有父子继承的成员都必须被清除, 才能保存到 Opcode 缓存 。

指针问题不是不可克服的。 有一个 apc_ bindump, 我从来没有试过在重新启用时从磁盘上直接卸载全部缓存条目。 但是调试所有仍然需要找到系统指针的东西会很痛苦- apache 案例太容易, 因为所有的 php 进程都因为叉子行为而拥有相同的系统指针。 旧的快cgi 版本比较慢, 因为它们过去总是在先叉( amp); init php 之后使用它- php- fpm 来修正它。

但最终, PHP 中真正缺少的是创建字节码格式的意志, 丢弃当前引擎和amp; 所有模块 - 使用堆叠 VM & amp 重写它; 建立 JIT 。 我希望我能有时间 - FB 的家伙和他们的hiphop HHVM 几乎都在那里了。 这会为更快的性能神圣化 eval () - 这是一种公平的牺牲 :

PS:我是一个人谁不能找到时间 更新5.4的装甲运兵车

我认为你们所有人都错了信息。 HHVM不是另一个朗古格的编译者,而是虚拟机器本身。 混淆在于用于编译c++的Facebook使用,但对于开发者的要求(仅仅为测试一些微小的东西而汇编了10分钟),这种方法是缓慢的(仅仅为测试一些微小的东西而汇编了10分钟 ) 。





相关问题
Brute-force/DoS prevention in PHP [closed]

I am trying to write a script to prevent brute-force login attempts in a website I m building. The logic goes something like this: User sends login information. Check if username and password is ...

please can anyone check this while loop and if condition

<?php $con=mysql_connect("localhost","mts","mts"); if(!con) { die( unable to connect . mysql_error()); } mysql_select_db("mts",$con); /* date_default_timezone_set ("Asia/Calcutta"); $date = ...

定值美元

如何确认来自正确来源的数字。

Generating a drop down list of timezones with PHP

Most sites need some way to show the dates on the site in the users preferred timezone. Below are two lists that I found and then one method using the built in PHP DateTime class in PHP 5. I need ...

Text as watermarking in PHP

I want to create text as a watermark for an image. the water mark should have the following properties front: Impact color: white opacity: 31% Font style: regular, bold Bevel and Emboss size: 30 ...

How does php cast boolean variables?

How does php cast boolean variables? I was trying to save a boolean value to an array: $result["Users"]["is_login"] = true; but when I use debug the is_login value is blank. and when I do ...