问题标签 [php-opcode]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1539 浏览

php - PHP 操作码与实际执行的二进制代码有何关系?

test.php 作为纯文本:

test.php 作为操作码:

test.php 作为二进制表示:

(跳过 test.php 的回声输出)

现在我想了解更多关于操作码如何转换为二进制表示的信息。

编辑和澄清的问题:

操作码如何翻译成二进制版本?你能看到 'a' 到 !0 的分配吗?ECHO 语句是否在某处以及它的输出?

我在二进制版本中发现很少有模式暗示操作码的逐行表示。

(“2f726f6f742f746573742e706870”是“/root/test.php”的十六进制表示)

编辑

当行长度设置为 4 字节并在不同程序之间进行比较时,十六进制表示揭示了模式。

但是我对虚拟机如何在这种级别上工作的知识太薄弱,无法真正正确地分析并将其链接到 C 代码。

编辑

PHP 有像 Java 这样的虚拟机吗?

Zend 引擎可以嵌入到 PHP 之外吗?

0 投票
2 回答
230 浏览

php - PHP 字符串文字和编译器优化

可能重复:
php 中的单引号与双引号是否有性能优势?

我想知道在定义不包含变量"的字符串时使用 s 时PHP 代码是否会受到性能影响,与不执行额外解析的情况相比。'

例如,PHP 将尝试解析由"but not定义的字符串中的变量'

所以我的问题是,一直以来我一直在编写这样的代码:

我一直在浪费周期吗?或者 PHP 是否智能/优化到足以知道我的真正意思是:

?

0 投票
1 回答
121 浏览

php - 包含期间的PHP操作码内存占用?

在优化网站的内存时,我注意到内存消耗的飞跃,同时包含大量用于特定目的的 PHP 类文件(600+)。分开来看,我注意到包含一个 PHP 文件(因此可能编译为操作码)占用的内存大约是磁盘上文件大小的 50 倍。

在我的例子中,磁盘上的文件总共有大约800 kB大小(带有缩进和注释,纯类声明,字符串不多),但是在包含所有文件后,内存消耗大约高出40 MB

我这样测量(PHP 5.3.6):

在 600 个文件的循环中,我可以看到内存消耗从基本上为零增长到 40 MB。(没有自动加载器加载额外的类,或者任何立即执行的全局代码或构造函数代码,它实际上只是纯粹的包含。)

这是正常行为吗?我假设操作码比纯源代码更紧凑(去掉所有空格和注释,或者只有一两个指令字节而不是“foreach”字符串等)?

如果这是正常的,有没有办法优化它?(我假设使用操作码缓存只会节省我的编译时间,而不是实际的内存消耗?)

0 投票
3 回答
1400 浏览

php - 速记 if then else php中的性能/优化

说到PHP,我想问一下这两者在性能上是否有区别:

对比

  • 这两个会导致不同的操作码吗?

  • 如果是,在性能上会有任何理论上的差异吗?(当然忽略这两个需要读取/编译/解释的时间)

  • 如果是的话,那么像zend优化器这样的优化器会利用这一点并自动进行任何重新安排吗?

ps如果您认为我的“全长手” if-then-else 代码太复杂,请提供最基本代码的示例并对此进行回答。

更新:

我希望这个问题非常清楚,但似乎人们没有得到这个信息。这个问题是关于性能上的理论(......但真实和可测量的)差异(这就是为什么我在理论中应用粗体斜体)。请不要回答说哪种编程风格更具可读性,而且这太吹毛求疵而不必担心性能。

ps 2:通过强调理论这个词,我试图阻止“别担心它不值得麻烦,它只是纳秒”类型的答案。

0 投票
0 回答
315 浏览

php - 在 AWS EB PHP 服务器上安装 Opcache 后出现无效的 UTF8 字符

我正在使用 CakePHP 2.4.2 在带有 RDS 数据库的 Amazon Elastic Beanstalk 服务器上运行 CMS 站点。从昨晚开始,我在日志中看到错误,并且某些页面因此无法加载(500 错误):

我有时会看到相同的“utf8”字符集,但错误日志中有一堆不同的字符串,所以每次都是相同的错误,但不是相同的错误字符串。以下是我的日志中的其他一些字符串:

昨晚下班之前,我推出了一个 ebextension 配置,以将 Zend Opcode Caching 安装到服务器。我没有证据表明这是错误的根源,但似乎我对服务器所做的唯一更改可能会导致错误 - 并且是在它们开始出现之前所做的最后一次更改。我在下午 5 点左右推送代码,并在下午 6 点左右开始在日志中看到错误。

为了更好地衡量,这是我用来启用 opcache 的配置:

我有几台服务器在生产中,没有 opcache 包,相同的设置运行良好,我也无法在我的本地测试盒上重现此类错误。

我是否可以在 opcache 中发现某种晦涩的错误,或者对于我所看到的内容是否有更合乎逻辑的结论?由于这些错误发生在我的代码深处,我什至不知道如何去调试它。我已经搜索了我的代码,以确保代码本身没有坏字符,但除此之外,我有点在黑暗中闲逛。

更新:

我调查了这是否是由 UTF8 字符串上的错误 strtolower() 转换引起的,但其中一个查询不包含用户输入的值,并且没有任何条件使用 UTF8 字符串,所以我不相信它可以被追踪到。失败的查询之一是查找我的登录控制器中可用的所有区域:

0 投票
2 回答
1100 浏览

php - PHP vld 显示文件输出而不是操作码

我正在尝试使用 vld 查看 php 文件的操作码

准备

我已经安装了 vld:

为了熟悉 VLD,我尝试与 php 文件(echo1 和 echo2)进行比较

回声1.php

回声2.php

phpinfo() 显示 vld 似乎已启用:

问题

运行 php 文件显示输出而不是操作码

显然我错过了一些东西:)

运行的版本

php版本

使用 Apache 2.2.22 在 Virtualbox 中运行 Debian

0 投票
1 回答
449 浏览

php - 什么是EXT_NOP和EXT_STMT,PHP操作码

我试图通过对我的实现执行本机 php 函数来更深入地了解 php 内部结构。

但是在每个操作码转储中,我都会看到以下两个操作码:

EXT_NOP : http: //php.net/manual/tr/internals2.opcodes.ext-nop.php

EXT_STMT: http: //php.net/manual/tr/internals2.opcodes.ext-stmt.php

正如您在文档中看到的那样,没有详细的解释。

即使在文档中给出的以下示例中,我的转储也与文档的规范不同。我真的很想知道为什么这两个摊位在每个垃圾场?它们的功能是什么?

环境规格:

操作码转储:

0 投票
0 回答
32 浏览

php - 尝试在 php 字节码中阻止范围信息

调用php -dvld.active=1 -dvld.execute=0 -dvld.dump_paths=1 multiple_catch.php 2> multiple_catch.php.byte结果

但是,只是天真地阅读 op 列,看起来好像 op 5 抛出的异常会导致打印出“内部”。但是,当考虑到原始源时,这显然是错误的,因为运行源确认:

PHP引擎如何根据字节码知道它所在的try块?