PHP7擴展開發入門

下載PHP源代碼

要開發PHP擴展,須要先下載PHP的源代碼,一方面是由於咱們的擴展通常會用到PHP自身定義的函數和宏,另外一方面咱們能夠利用官方提供的工具減小工做量。
我下載了PHP-7.0.2,地址是:http://cn2.php.net/get/php-7....
解壓源碼壓縮包, tar xzf php-7.0.2.tar.gz,咱們如今只須要關注Zendext這兩個目錄。
Zend目錄裏面包含了PHPZend Engine源代碼,有些函數和宏的定義咱們須要在這裏面簡單地看一下。
ext目錄裏面包含了PHP原生的擴展,以及咱們開發本身的擴展時能夠利用的工具,Linux下使用ext_skelWindows下使用ext_skel_win32.phpphp

使用ext_skel工具

咱們能夠在ext目錄下看到全部的PHP原生擴展,其中包括了熟悉的curljson,mbstring,simplexmlsockets等擴展,還有不少沒有用過甚至沒有據說過的擴展,不用在乎這些,咱們先打開咱們最熟悉的curl來看看,有config.m4配置文件,有php_curl.hcurl_file.c等源代碼,還有一些中間文件,最後還有一個tests目錄,裏面放的curl擴展的單元測試。重點關注config.m4php_curl.hcurl_file.c便可,最簡單的場景下這三個文件就是一個擴展的所有組成部分了。json

打開隨便看一下,不算太複雜,可是本身寫一個相似的仍是挺頭疼的,這時就須要用到我前面提到的ext_skel工具了。這個工具也在ext目錄下,咱們執行一下,./ext_skel --help,能夠看到若干參數,咱們用到的只有--extname=module,這裏填上本身開發的擴展名稱。想深刻了解各個參數的做用能夠看這裏:http://php.net/manual/en/inte...數組

./ext_skel --extname=hello

ext目錄下多了一個hello目錄,咱們後續的工做都在這個目錄下面,工具已經爲咱們自動生成了一些文件。curl

config.m4配置文件
開發PHP擴展,在寫C代碼以前,要先配置一下這裏。咱們打開能夠看到詳細的註釋說明,dnl是註釋語法。
若是你的擴展用到了外部依賴,就配置--with-hello選項,不然配置--enable-hello選項,刪除這下面3行的dnl註釋socket

PHP_ARG_ENABLE(hello, whether to enable hello support,
Make sure that the comment is aligned:
[  --enable-hello           Enable hello support])

PHP_ARG_WITHPHP_ARG_ENABLE這兩個宏用來配置configure選項,一個配置須要外部依賴的,另外一個配置不須要外部依賴的
配置好的內容,在後面執行configure --help時能夠看到。函數

php_hello.h頭文件
相似於C語音的頭文件,包含了一些自定義的結構和函數聲明,在這個demo中暫時不須要改動工具

hello.c代碼文件
真正的邏輯代碼都在這個文件中,後面會詳細介紹。單元測試

編寫代碼

好了,到這一步咱們終於要開始寫代碼了,打開hello.c文件。
整個擴展的入口是zend_module_entry這個結構,具體的定義能夠在Zend目錄下的zend_modules.h文件中看到,一共有十幾個屬性,快速跳過,咱們暫時只須要"hello world"。測試

zend_module_entry hello_module_entry = {
    STANDARD_MODULE_HEADER,
    "hello",
    hello_functions,
    PHP_MINIT(hello),
    PHP_MSHUTDOWN(hello),
    PHP_RINIT(hello),       /* Replace with NULL if there's nothing to do at request start */
    PHP_RSHUTDOWN(hello),   /* Replace with NULL if there's nothing to do at request end */
    PHP_MINFO(hello),
    PHP_HELLO_VERSION,
    STANDARD_MODULE_PROPERTIES
};
  • STANDARD_MODULE_HEADER幫咱們實現了前面6個屬性ui

  • "hello"是擴展的名字

  • hello_functions是擴展包含的所有方法的集合

  • 後面5個宏分別表明5個擴展特定方法

  • PHP_HELLO_VERSION是擴展的版本號,定義在頭文件中

  • STANDARD_MODULE_PROPERTIES幫咱們實現了剩下的屬性

暫時都不須要修改,知道這是一個入口就行。順着這個入口,咱們繼續看怎麼給擴展添加方法,在hello_functions[]方法數組中已經有了一個示例方法confirm_hello_compiled,咱們參考它寫咱們的方法hello_world

const zend_function_entry hello_functions[] = {
    PHP_FE(confirm_hello_compiled,  NULL)       /* For testing, remove later. */
    PHP_FE(hello_world,  NULL)
    PHP_FE_END  /* Must be the last line in hello_functions[] */
};

先在擴展的方法數組中添加上hello_world,而後再定義hello_world。找到confirm_hello_compiled方法定義的地方,在它下面依葫蘆畫瓢,php_printfZend Engine中的printf方法。

PHP_FUNCTION(hello_world)
{
    php_printf("Hello World!\n");
    RETURN_TRUE;
}

編譯安裝

最後就是編譯安裝咱們的擴展了,安裝過PHP擴展的同窗不用看,沒有經驗的能夠參考一下。

/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make
make test
make install

如今PHP的擴展目錄中已經有了hello.so這個文件,在php.ini中添加上擴展的配置

extension = hello.so

測試

寫一個test.php方法,執行腳本就能夠看到"Hello World!"

<?php
hello_world();
相關文章
相關標籤/搜索