PHP 7 中函数调用的实现

先看一个函数调用的OPCode:

function foo($arg) {
    echo $arg;
}
$arg = "Hello World\n";
foo($arg);

filename:       /home/roketyyang/test.php
function name:  (null)
number of ops:  6
compiled vars:  !0 = $arg
line     #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   2     0  E >   NOP                                                      
   5     1        ASSIGN                                                   !0, 'Hello+World%0A'
   6     2        INIT_FCALL                                               'foo'
         3        SEND_VAR                                                 !0
         4        DO_UCALL                                                 
         5      > RETURN                                                   1

filename:       /home/roketyyang/test.php
function name:  foo
number of ops:  3
compiled vars:  !0 = $arg
line     #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   2     0  E >   RECV                                             !0      
   3     1        ECHO                                                     !0
   4     2      > RETURN                                                   null

第一个OPArray是/home/roketyyang/test.php文件的,第二个OPArray是foo函数的。

我们来看下/home/roketyyang/test.php是如何被Zend引擎执行的。


Read more...

2016-11-04 PHP底层

认识PHP 7虚拟机

本文内容大部分翻译自Getting into the Zend Execution engine (PHP 5),并做了一些调整,原文基于PHP 5,本文基于PHP 7。

PHP : 一门解释型语言


PHP被称为脚本语言或解释型语言。为何? PHP语言没有被直接编译为机器指令,而是编译为一种中间代码的形式,很显然它无法直接在CPU上执行。 所以PHP的执行需要在进程级虚拟机上(见Virtual machine中的Process virtual machines,下文简称虚拟机)。

PHP语言,包括其他的解释型语言,其实是一个跨平台的被设计用来执行抽象指令的程序。PHP主要用于解决WEB开发相关的问题。

诸如Java, Python, C#, Ruby, Pascal, Lua, Perl, Javascript等编程语言所编写的程序,都需要在虚拟机上执行。虚拟机可以通过JIT编译技术将一部分虚拟机指令编译为机器指令以提高性能。鸟哥已经在进行PHP加入JIT支持的开发了。


Read more...

2016-11-04 PHP底层

转义序列导致的XSS注入

问题示例代码


出现xss注入的视图页面部分代码:

<script>
window.onload = function () {
    var url = '<?php echo htmlspecialchars($_GET['url']); ?>';
    div = document.createElement('div');
    div.innerHTML = '<iframe src="' + url + '"></iframe>';
    document.body.appendChild(div);
}
</script>

Read more...

2016-11-04 xss

静态库与动态库

学习自:《程序员的自我修养》和Static, Shared Dynamic and Loadable Linux Libraries

在Linux下有两种类型的C/C++库:

静态库:以lib{name}.a命名,会被链接为可执行文件的一部分。

被动态链接的共享库(以下简称动态库):以lib{name}.so命名,可执行文件运行时才进行链接,称为动态链接。链接的方式有:

  • 动态链接器在可执行文件真正开始运行前,链接动态库;
  • 动态连接器在可执行文件运行过程中,链接动态库,又称为延迟绑定,是为了避免程序在启动时就链接了所有依赖的库,等到真正需要的时候才进行链接;
  • 可执行文件运行过程中,调用dlopen()系统调用链接动态库,又称为运行时装载,PHP的扩展就是通过该方式加载的。

Read more...

2016-10-04

C开发时遇到一些问题

1、局部变量的地址赋值给了全局变量指针,导致程序出现诡异的Segmentation fault,且是在MAC下,Linux下碰巧没遇到!。

排查问题:

当时发现全局变量*executor_globals.return_value_ptr_ptr的值在经过某个函数调用的时候发生了改变(至于怎么发现这点的忘了= =)。

如下图,在经过efree(client->cli)之后,*executor_globals.return_value_ptr_ptr的值从0x000000010a244318变为了0x000000010a244340


Read more...

2016-09-25

初识火焰图

本文学习自:白话火焰图

火焰图的分类


压测程序时,火焰图能够帮助我们直观地了解到程序的性能瓶颈。本文主要是记录下在生成火焰图的时候的一些注意事项。以下链接是对每个类别的火焰图的详细说明。

  1. On-CPU:CPU Flame Graphs
  2. Off-CPU:Off-CPU Flame Graphs
  3. Memory:Memory Leak (and Growth) Flame Graphs
  4. Hot/Cold:Hot/Cold Flame Graphs
  5. Differential:Differential Flame Graphs

关于火焰图的PPT(讲解得非常详细):Blazing Performance with Flame Graphs


Read more...

2016-09-24

Laravel 依赖注入的实现

依赖注入


网上已经有许多不错的文章介绍依赖注入了,维基百科-DI也有其详细的介绍。

翻译一段PHP-DI官网的解释

在没有使用依赖注入的框架代码中:

  • App需要Foo
  • App创建了Foo
  • App调用了Foo
    • Foo需要Bar
    • Foo创建Bar
    • Foo调用Bar
      • Bar需要Bim
      • Bar创建Bim
      • Bar调用Bim
        • Bim做某些事情
      • Bar做某些事情
    • Foo做某些事情

在实现了依赖注入的框架代码中:

  • App需要Foo,Foo需要Bar,Bar需要Bim
  • App创建Bim
  • App创建Bar,并提供Bim
  • App创建Foo,并提供Bar
  • App调用Foo
    • Foo调用Bar
      • Bar调用Bim
        • Bim做某些事情
      • Bar做某些事情
    • Foo做某些事情

App在这里就相当于一个IOC(Inversion of Control控制反转)容器,依赖注入是IOC最普遍的一种实现。App负责创建实例,调用方只需要告诉App需要哪个类的实例就可以了。


Read more...

2016-08-23 Laravel