zoukankan      html  css  js  c++  java
  • 用Zephir编写PHP扩展

      自从NodeJS,和Golang出来后,很多人都投奔过去了。不为什么,冲着那牛X的性能。那PHP的性能什么时候能提升一下呢?要不然就会被人鄙视了。其实大牛们也深刻体会到了这些威胁,于是都在秘密开发各种秘密武器。

    HHVM和Hack
      Facebook自己弄了一套HHVM虚拟机,和一个新语言Hack。HHVM的性能不错,像Wordpress,PHPMyAdmin这样的项目,运行在上面很流畅,但是有个问题很致命,如果你引入了第三方扩展,现有的代码移植过去,没办法运行。如果你希望你的代码运行于HHVM,那么你需要编写基于HHVM的扩展,这时候你要学习C++了。很抓狂有木有?又或者,用Hack重写你的代码,这事谁会干呢?新项目可能可以拿来玩玩,但是旧的项目,如果代码量大,且代码混乱的项目,那就只能呵呵了。

    PHPNG(next generation)
      前些日子PHP核心开发组宣布了个利好消息,将在PHP 5.7版本会有很大的性能提升。这一次又打击到HHVM了。但是要等到5.7的版本才会发布。现在很多都只是停留在5.4的版本,鞭长莫及啊。

    除了这些,就没有办法提升性能了吗?有!------ PHP扩展。

    Phalcon没听过,Yaf总听过了吧。什么?都没听过?赶紧去Google下,听说面试会加分。

    PHP扩展
      PHP的流行,得益于它的扩展系统。开发者通过为PHP开发扩展,通过这个中间件,跟其他系统连接通信。例如我们常用的cURL,Memcache和Redis等扩展。这些扩展不包含在PHP核心,需要额外编译。这里有一份官方列出的PHP扩展列表:
    http://www.php.net/manual/en/extensions.alphabetical.php

    如果你想自己编写PHP扩展,意味着你需要掌握C语言,因为PHP的扩展是通过C编写的,而且你还需要掌握PHP的Zend API,了解它的核心原理。如果你有兴趣,可以参考:《深入理解PHP内核》。如果你懂C,那么你看完上面这本书,那么你大概也能写了。但是,对于C语言水平比较菜,或者不怎么懂C的人来说,就只能望而却步了。

    为什么我要写PHP扩展呢?

    1. 访问现有的库。假设现在有一个库很好用(例如MongoDB),你希望在PHP也能用上它。如果这个库很热门,那么你就走运了,应该有大牛帮你实现了。要是运气不好,这个库比较冷门,但你业务需求又刚好需要用到的话,那只能干着急了(当然这种情况是极少出现的)。

    2. 性能。PHP是动态语言,代码性能比C语言相差一个级别。正是由于此原因,产生了Yaf,Phalcon这样的PHP的扩展框架。

    对于那些不想学C,但又想要得到编写自己的扩展,怎么办?

    Zephir
    分析了以上的种种不靠谱,终于进入了正题。现在隆重向你介绍一个叫Zephir的项目。它可以帮助你使用类PHP的语法,来生成C语言代码,并帮助你编译成PHP扩展。是不是很酷?很酷,有没有?

    Show Me The Code
    如果你用C写一个Hello World的扩展,那么你需要这样写:

    #ifdef HAVE_CONFIG_H
    #include "config.h"
    #endif
    
    #include "php.h"
    #include "php_test.h"
    #include "test.h"
    
    #include "kernel/main.h"
    
    /**
     * This is a sample class
     */
    ZEPHIR_INIT_CLASS(Test_Hello) {
        ZEPHIR_REGISTER_CLASS(Test, Hello, hello, test_hello_method_entry, 0);
        return SUCCESS;
    }
    
    /**
     * This is a sample method
     */
    PHP_METHOD(Test_Hello, say) {
        php_printf("%s", "Hello World!");
    }
    

    而Zephir则只需要这样:

    01.namespace Test;
    02. 
    03./**
    04.* This is a sample class
    05.*/
    06.class Hello
    07.{
    08./**
    09.* This is a sample method
    10.*/
    11.public function say()
    12.{
    13.echo "Hello World!";
    14.}
    15.}

    是不是跟写PHP代码没什么区别?

    安装 Zephir

    1.$ git clone https://github.com/json-c/json-c.git
    2.cd json-c
    3.$ sh autogen.sh
    4.$ ./configure
    5.make && sudo make install
    1.$ git clone https://github.com/phalcon/zephir
    2.cd zephir
    3.$ ./install -c

    安装完成后,运行

    1.$ zephir help

    如果没有报错,说明你已经安装成功了。

    Zephir语法
    Zephir跟PHP有几点区别:

    1. Zephir是强类型语言。变量有自己的类型。
    01.namespace Test;
    02. 
    03.class Arithmetic
    04.{
    05.public function intSum()
    06.{
    07.int a, b, c;
    08. 
    09.let a = 1,
    10.b = 2,
    11.c = a + b;
    12. 
    13.return c;
    14.}
    15.}

    这里需要特别注意的是Zephir有个let关键字,用于变量赋值。

    编译扩展

    1. 初始化一个Zephir扩展
    1.zephir init myframework
    1. 新建一个叫 calculator.zep的文件
    1.namespace Myframework;
    2.class Calculator {
    3.public function add(int a, int b) {
    4.return a + b;
    5.}
    6.}

    Zephir必须指定一个命名空间,上面的例子Myframework为这次Demo的命名空间。Zephir遵循PSR-1的标准进行命名。

    1. 把Zephir代码编译成PHP的C扩展
    1.zephir build
    1. 开启扩展
      在你的php.ini文件加上
    1.extension=myframework.so
    1. 测试
    1.$ php -a
    2.php > $calc = new MyframeworkCalculator;
    3.php > var_dump($calc->add(2, 1));
    4.int(3)

    是不是很简单?你也来尝试一下吧。

  • 相关阅读:
    cors解决跨域
    神经网络和keras
    tensorflow笔记
    5.聚类算法-kmeans
    4.回归类算法-目标值连续型
    3.分类算法-目标值离散型
    Phaser.js开发小游戏之洋葱头摘星星
    VS Code 插件之 vscode-debug-visualizer
    Phaser.js开发小游戏之Phaser.js介绍
    微信小程序中写threejs系列之 threejs-miniprogram
  • 原文地址:https://www.cnblogs.com/fuland/p/4280456.html
Copyright © 2011-2022 走看看