摘要:起步最近在看擴展開發中文教程的版。擴展是什么用過的人一定也用過擴展。本身帶有個擴展,擴展是對語言功能的一個延伸,的核心由兩部分組成最底層的引擎和內核。額外不使用工具寫擴展一個擴展為避免與寫過的沖突,采用作為名字,至少包含個文件。
起步
最近在看 《PHP擴展開發中文教程》 的pdf版。PHP的解釋器是用C語言寫的,所以PHP擴展自然也是用C 語言了。
擴展是什么用過php的人一定也用過php擴展。php本身帶有86個擴展,擴展是對php語言功能的一個延伸,php的核心由兩部分組成:最底層的 Zend引擎 和 PHP內核 。ze把腳本解析成機器可讀的符號,也會處理內存管理,變量作用域,程序調度。PHP內核則主要涉及主機環境(Apache,IIS,Nginx),處理與主機的通信。
動機當php自身不滿足需求的時候就可以自己去造輪子了。采用C語言開發還能一定程度上解決性能問題,而php是我最喜歡的一門編程語言,寫擴展的機會自然不放過,更重要的是可以 裝逼 。
新建擴展我們要寫個擴展代替以下的功能:
我的開發環境是:
系統: Ubuntu 16.04
PHP: 7.0+
gcc :4.8.4
PHP已經提供了工具用來創建擴展,并初始化代碼:ext_skel$ cd php-src/ext $ ./ext_skel --extname=hello工具會在當前目錄生成 hello 文件夾。
修改配置文件cd到hello,工具已經初始化了目錄,打開配置文件 config.m4:
dnl If your extension references something external, use with: dnl PHP_ARG_WITH(hello, for hello support, dnl Make sure that the comment is aligned: dnl [ --with-hello Include hello support]) dnl Otherwise use enable: dnl PHP_ARG_ENABLE(hello, whether to enable hello support, dnl Make sure that the comment is aligned: dnl [ --enable-hello Enable hello support])dnl 是注釋符,表示當前行是注釋。這段話是說如果此擴展依賴其他擴展,去掉PHP_ARG_WITH段的注釋符;否則去掉PHP_ARG_ENABLE段的注釋符。顯然我們不依賴其他擴展或lib庫,所以去掉PHP_ARG_ENABLE段的注釋符:
PHP_ARG_ENABLE(hello, whether to enable hello support, Make sure that the comment is aligned: [ --enable-hello Enable hello support])書寫代碼工具生成的hello.c,寫上我們的實現:
PHP_FUNCTION(hello) { zend_string *strg; strg = strpprintf(0, "hello world."); RETURN_STR(strg); }添加到編譯列表里:
const zend_function_entry hello_functions[] = { PHP_FE(hello, NULL) /*添加這行*/ PHP_FE(confirm_hello_compiled, NULL) /* For testing, remove later. */ PHP_FE_END /* Must be the last line in hello_functions[] */ };編譯與安裝$ phpize $ ./configure --with-php-config=/usr/local/php7/bin/php-config $ make & make install修改php.ini,開啟擴展,若找不到可以用phpinfo()查看使用哪個配置文件.
extension=hello.so寫個腳本: 不出意外就能看到輸出了。
額外:不使用工具寫擴展一個擴展(為避免與寫過的hello沖突,采用world作為名字),至少包含3個文件: config.m4、 php_world.h 、 world.c 。一個是phpize用來準備編譯擴展的配置文件,一個是引用包含的頭文件,一個是源碼文件。
config.m4
PHP_ARG_ENABLE(world, whether to enable world support, Make sure that the comment is aligned: [ --enable-world Enable hello support]) if test "$PHP_WORLD" != "no"; then AC_DEFINE(HAVE_WORLD,1,[ ]) PHP_NEW_EXTENSION(world, world.c, $ext_shared,, -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1) fiphp_world.h
#ifndef PHP_WORLD_H #define PHP_WORLD_H extern zend_module_entry hello_module_entry; #define phpext_hello_ptr &hello_module_entry #define PHP_WORLD_VERSION "0.1.0" #define PHP_WORLD_EXTNAME "world" #endifworld.c
#ifdef HAVE_CONFIG_H #include "config.h" #endif #include "php.h" #include "php_world.h" PHP_FUNCTION(world) { zend_string *strg; strg = strpprintf(0, "hello world. (from world module)"); RETURN_STR(strg); } const zend_function_entry world_functions[] = { PHP_FE(world, NULL) PHP_FE_END }; zend_module_entry world_module_entry = { STANDARD_MODULE_HEADER, PHP_WORLD_EXTNAME, world_functions, NULL, NULL, NULL, NULL, NULL, PHP_WORLD_VERSION, STANDARD_MODULE_PROPERTIES }; #ifdef COMPILE_DL_WORLD #ifdef ZTS ZEND_TSRMLS_CACHE_DEFINE() #endif ZEND_GET_MODULE(world) #endif編譯安裝:
$ phpize $ ./configure --with-php-config=/usr/local/php7/bin/php-config $ make & make install測試:
一樣需要在php.ini添加extension=world.so不使用工具的精簡的一個擴展完成。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/22067.html
摘要:下載源代碼要開發擴展,需要先下載的源代碼,一方面是因為我們的擴展一般會用到自身定義的函數和宏,另一方面我們可以利用官方提供的工具減少工作量。重點關注,,即可,最簡單的場景下這三個文件就是一個擴展的全部組成部分了。 下載PHP源代碼 要開發PHP擴展,需要先下載PHP的源代碼,一方面是因為我們的擴展一般會用到PHP自身定義的函數和宏,另一方面我們可以利用官方提供的工具減少工作量。我下載了...
摘要:四使用語言開發是我重點推薦的擴展開發框架,簡明易懂,功能強大,開發效率高,代碼易維護,執行速度快。優點三支持,的擴展開發有兩套擴展開發框架,分別支持,,雖然框架代碼有兩個,但是接口卻是一樣的。 PHP擴展是高級PHP程序員必須了解的技能之一,對于一個初入門的PHP擴展開發者,怎么才能開發一個成熟的擴展,進入PHP開發的高級領域呢?本系列開發教程將手把手帶您從入門進入高級階段。本教程系列...
摘要:簡介通過擴展,我們可以在代碼中使用一些特定的方法大部分的擴展都是用寫的。這個目錄與我們的擴展同名。我們先來在擴展中創建一個類,使用此類來渲染。接下來命令行執行以下命令來編譯擴展第一次運行以上命令時,會初始化一些東西。 showImg(https://segmentfault.com/img/remote/1460000018698586); 簡介: 通過 PHP 擴展, 我們可以在 p...
摘要:什么是是一種中間語言,以接近的語法來編寫代碼,然后轉換編譯成擴展,旨在簡化擴展的創建和可維護性。如果成功,會自動生成文件到目錄你需要編輯填加擴展測試一下就這樣,你也會擴展開發了附附編譯擴展的方法 什么是 Zephir Zephir 是一種中間語言,以接近 PHP 的語法來編寫代碼,然后轉換編譯成 PHP 擴展,旨在簡化 PHP 擴展的創建和可維護性。利用編譯來提高性能和資源消耗,又不需...
摘要:在安裝及各種擴展的過程中,如果你是用源碼安裝,會注意到在成功之后總會有一句提示這個就是運行的自動化測試了。本文轉自官方博客 在安裝 PHP7 及各種擴展的過程中,如果你是用源碼安裝,會注意到在 make 成功之后總會有一句提示:Dont forget to run make test. 這個 make test 就是運行 PHP 的自動化測試了。 如果你剛剛安裝完 PHP7,直接運行 ...
閱讀 1660·2021-11-16 11:41
閱讀 2457·2021-11-08 13:14
閱讀 3106·2019-08-29 17:16
閱讀 3079·2019-08-29 16:30
閱讀 1843·2019-08-29 13:51
閱讀 356·2019-08-23 18:38
閱讀 3223·2019-08-23 17:14
閱讀 630·2019-08-23 15:09