2019独角兽企业重金招聘Python工程师标准>>>

PHP Extension 是什么呢?很多写PHP的工程师,或许不知道PHP Extension是怎么做出来的,其实PHP 的最底层是使用c 语言,每一句PHP 的语法,都是透过c 语言来实现,所以我们可以藉由c ,去加强PHP 的功能,让PHP 更方便使用,一个正常的PHP Extension制作时,要先编写config.m4 这个档案,虽然这个档案不难写,不过他与Makefile的格式落差很大,这里就介绍如何使用Makefile 来编译PHP Extension ,先介绍一下正常的PHP Extension编译流程,phpize会建立Makefile档案, ./configure 这个指令会自动检查相关package 是否安装

  • 建立c code 与config.m4
  • phpize (下Linux 指令phpize)
  • ./configure
  • make
  • mv modules/xxx.so /extension : 将编译出来的so档,搬到extension目录下,这样就算完成一个PHP Extension

制作php extension Makefile

基实phpize的行为就是建立Makefile, libtool 等等工具,./configure就是检查一些设定是否正常,以及路径设定,即然我都要自已写php extension了,那就跳过这两个过程吧,自已写Makefile。

  • 首先我们先使用phpize ,自动生出一个Makefile,然后再把他改成我们想要的格式。
  • phpize & mv Makefile Makefile.global : 把Makefile改成Makefile.global

修改Makefile.global成我们要的样子Makefile.global范例

  • 加入php 安装的目录PHP_DIR = /home/program/php (路径自已修改吧)
  • 将部分变数的值改到PHP_DIR ,如prefix = $(PHP_DIR),phpincludedir = $(PHP_DIR)/include/php
  • phplibdir = $(SRC_PATH)/modules :指定编译完成后,so档的路径
  • PHP_PECL_EXTENSION = extension name //(注意名称不要重覆)
  • srcdir , builddir , top_srcdir , top_builddir ,修改至当前目录,要用绝对目录

简化过后的Makefile

Makefile.global弄半天,最后终于简化完成,以后要编译php extension就方便多了,正式写一个要用来编译程式的Makefile ,你看! 下面的PHP Makefile 多么简短。

Example

SRC_PATH = $ ( shell pwd )
LDEF =  - DCOMPILE_DL_MyExtension
CXXFILE = myClass . cc extension . cc
EXTRA_CXXFLAGS =
CXXOUTPUT =  MyExtension
include Makefile . global
cp : sudo cp ./ modules / $ ( CXXOUTPUT ). so / home / php_extension /

make 的结果

Example

create myClass . lo
create myClass . o
create extension . lo
create extension . o
create MyExtension . la
create MyExtension . so
//最后产生MyExtension.so 成功

接收php 传进来的变数的方式,使用zend_parse的function,有下列两种,其中[sal,lsl]代表要接放的变数型态。

  • zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,"sal",xxx,xx)
  • zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET,num_args TSRMLS_CC,"lsl", xx,xx,xx,xx)
    • l : 代表long
    • s : string
    • a : array
    • b : boolean
    • d : double
  • 回传result 给php的方式有下列几种

    • RETURN_LONG : 回传long
    • RETURN_STRING : 回传字串
    • RETURN_DOUBLE : 回传倍精数
    • RETURN_BOOL : 回传boolean (true or false)

建立一个php extension function

要写一个extension function ,就是使用PHP_FUNCTION 这个function ,而传进去的第一个参数,就是function 名称,写好之后,就可以在php 里使用simple("xxx");

Example

PHP_FUNCTION ( simple )
{ char * str = NULL ; char * tmp =  new  char [ 50 ]; string result =  "" ; int str_len =  0 ; if ( zend_parse_parameters ( ZEND_NUM_ARGS () TSRMLS_CC , "s" , & str ,& str_len )  == FAILURE )  { RETURN_NULL (); } sprintf ( tmp ,  "Your input string is [%s]"  , str ); result = tmp ; delete [] tmp ; RETURN_STRING ( const_cast < char *>( result . c_str ()), 1 ); }

第二个范例是function entry 中定义的add ,主要功能是将第一个参数与第二个参数做加总的功能,在php extension 中,所有的数字回偾都是使用RETURN_LONG,不需要依int ,long,float 去判断回传值,这是由于php 变数型态很自由,不用区分得这么细。

Example

PHP_FUNCTION ( add )
{ int num_args = ZEND_NUM_ARGS (); if  ( num_args !=  2 )  { RETURN_LONG ( 0 ); } int result =  0 , int1 , int2 ; if ( zend_parse_parameters ( ZEND_NUM_ARGS () TSRMLS_CC , "ll" , & int1 ,& int2 )  == FAILURE )  { RETURN_NULL (); } result =  int1  +  int2 ; RETURN_LONG ( result ); }

相关问题

warning: deprecated conversion from string constant to 'char*'

我升级gcc 4.2.0 后,编译就会出现这个Warning,使用gcc 3.4.6 就没事了。

第二招,碰到Warning不要停掉,在Makefile档案中,将-Werror 这个属性拿掉吧

undefined symbol:__gxx_personality_v0

因为你使用c++ 语法,但是却没有载入c++ 的library

解法:将Makefile 的CC 加上-lstdc++ ,加上这句后,编译时,会自动载入/usr/lib/libstdc++.so。

Example

CC = cc - lstdc ++

错误: Invalid library (maybe not a PHP library)的处理

这代表,php在载入so档时,找不到程序入口,c & c++的程序入口是main ,而php extension的程序入口是zend_module_entry ,但是因为我有使用到c++ 语法,c++有个特性,在编译时,会自动乱改变数及function名称。

Example

zend_module_entry MyExtension_module_entry

像这句语法,经过c++ 编译后,就可能变成MyExtension_module_entryii,结果造成找不到程序入口而报错。

解法就是多加一句extern "C"

Example

zend_module_entry MyExtension_module_entry  =  { } extern  "C"  { ZEND_GET_MODULE ( MyExtension )
}

为何要加extern "C" 呢?

我们知道C++ 有overloading 的功能,一个function 可以有多种不同的参数数量,可是c++ 是怎么办到的呢,其实他在编译程式的时候,就会自动做function name 的mapping ,例如下面的例子,可是单纯的c 语言并不懂这个东西,所以当c 语言要去读取c++ 的function 时,就必需加上extern "C" ,强迫c++ 不要乱改名称,这样c语言才能正确的执行function 。

Example

int  test ( int a ){}
int  test ( char b , char c ){} //编译后
test ( int a )  => test_1 ( int a )
test ( char b ,  char c )  => test_2 ( char b ,  char c )

转载于:https://my.oschina.net/mickelfeng/blog/343420

PHP Extension Makefile 製作相关推荐

  1. 用C#製作PDF文件全攻略

    PDF文件是目前比較流行的電子文檔格式,在辦公自動化(OA)等軟件的開發中,經常要用到該格式,但介紹如何製作PDF格式文件的資料非常少,在網上搜來搜去,都轉貼的是同一段「暴力」破解的方法,代碼片斷如下 ...

  2. 從turtle海龜動畫 學習 Python - 高中彈性課程系列 10.2 藝術畫 Python 製作生成式藝術略覽

    Goal: 藉由有趣的「海龜繪圖」學會基礎的 Python 程式設計 本篇著重在以 Python 海龜繪圖模擬藝術圖形, 討論與生成式藝術的關聯. 本篇我們列舉一些網路上見到的, 用電腦程式或某些軟體 ...

  3. PHP Plurk Api基礎教學(一) - 如何製作自動發噗機器人

    PHP Plurk Api基礎教學(一) - 如何製作自動發噗機器人 1.第一步 到Plurk PHP APi Google code官網下載最新的PHP API 上面的連結是1.6.2版(聽說已經是 ...

  4. Swift 教學:如何使用iOS Charts API 製作漂亮的圖表

    在應付許多的資料時,比起只在表格中呈現,使用圖表來顯示資料,可以幫助使用者容易地了解資訊.有了圖表,相對於讀取整個資料表(或幾個資料表)你可以輕鬆地一眼便見到以圖形表示的資料,取得所需的資訊.圖表的使 ...

  5. LabelImg 影像標註工具使用教學,製作深度學習用的資料集

    本篇介紹如何使用 LabelImg 這個免費的影像標註工具,標示照片中的物體,製作成可用來訓練深度學習引擎的輸入資料集. 在使用深度學習來實作影像的物件偵測時,都會需要有大量的已知資料集,也就是照片加 ...

  6. Linux内核中makefile有什么作用?深入解析makefile工作过程和原理

    Table of Contents Makefile 中的变量 常用的变量有以下几类: 1) 版本信息 2) CPU 体系结构:ARCH 3) 路径信息:TOPDIR, SUBDIRS 4) 内核组成 ...

  7. linux源码Makefile详解(完整)-转

    随着 Linux 操作系统的广泛应用,特别是 Linux 在嵌入式领域的发展,越来越多的人开始投身到 Linux 内核级的开发中.面对日益庞大的 Linux 内核源代码,开发者在完成自己的内核代码后, ...

  8. OpenCV繪圖的實作-cvCircle,cvEllipse,cvEllipseBox

    转自:http://www.90in.net/space-4-do-blog-id-10218.html OpenCV繪圖的實作-cvCircle,cvEllipse,cvEllipseBox 圓的製 ...

  9. opencv在电脑屏幕上画_opencv平滑处理?opencv 画实心圆?OpenCV繪圖的實作-cvCircle,cvEllipse,cvElli...

    你是否正在寻找关于cvcircle的内容?让我把最吸引人的东西奉献给你: 转自: OpenCV繪圖的實作-cvcircle,cvEllipse,cvEllipseBox 圓的製作,要給他目標圖片,圓心 ...

最新文章

  1. Android HTTP2 + Oauth2 + Jwt 接口认证实例
  2. 结对项目——最大子数组
  3. python两个编程环境_多个python Behave环境安装文件
  4. java复习系列[4] - Java IO
  5. php自定义tcp协议,如何实现自定义协议?
  6. Jsp+Servlet+Mysql实现的火车票预定管理
  7. 初学关键段容易忽略的问题
  8. A股开盘:深证区块链50指数涨0.18%,概念股涨多跌少
  9. activiti 设置候选人_中标 | 河南移动公示无源波分复用设备集采中标候选人名单:3家厂商上榜...
  10. 闲谈REST API
  11. 实体词典 情感词典_情感词典
  12. 数据资料网站_更新......
  13. C++中float和double的比较
  14. 什么是 AngularJS?
  15. 【云原生】MYSQL语法总结
  16. 黄河中下游地区精化似大地水准面研究与实施
  17. 找出数组中其中最大的数及其下标
  18. PhpStorm修改字体和主题
  19. 三维动画在计算机上的应用,三维动画的十大应用领域
  20. 华宝小t股票机器人_基于算法自动抓取日内波动价差,智能炒股机器人,了解一下?...

热门文章

  1. 图像处理:图像中噪声分布和概率密度函数的关系
  2. python运行不了、显示警告_Python中偶尔遇到的细节疑问(二):UnicodeDecodeError,警告与忽略警告warnings...
  3. python ui框架_PyQt5GUI项目程序框架
  4. linux 爬虫工具,技术|如何在Ubuntu 14.04 LTS安装网络爬虫工具:Scrapy
  5. Java高并发编程(三):Java内存模型
  6. 北师计算机应用基础离线作业2,[北京师范大学]18秋《计算机应用基础(专科)》 离线作业2...
  7. python 输出字符串编码_Python print 字符串编码问题
  8. 在VM虚拟机Windows Server r2上部署安装Microsoft Dynamics CRM 2016 步骤详解(一)
  9. BZOJ.1032.[JSOI2007]祖码(区间DP)
  10. python 虚拟环境使用