PHP的C扩展开发入门指南
为什么要用C扩展
C是静态编译的,执行效率比PHP代码高很多。同样的运算代码,使用C来开发,性能会比PHP要提升数百倍。IO操作如CURL,因为耗时主要在IOWait上,C扩展没有明显优势。
另外C扩展是在进程启动时加载的,PHP代码只能操作Request生命周期的数据,C扩展可操作的范围更广。
源码下载
From PHP官网
http://php.net/downloads.php
From Git
git clone https://github.com/php/php-src.git
From git.php.net
git clone http://git.php.net/repository/php-src.git
From Github
- 打开 php-src project page
- 选择感兴趣的分支
- 点击 Download ZIP即可
这里以zip为例:
wget http://museum.php.net/php5/php-5.3.16.tar.gztar zxvf php-5.3.16.tar.gzmv php-5.3.16 php-src
进入到PHP源码目录:
cd php-src
若使用 Git好处是方便切换不同版本
git clone http://git.php.net/repository/php-src.gitPHP 5.4: git checkout PHP-5.4 PHP 5.5: git checkout PHP-5.5 PHP 5.6: git checkout PHP-5.6 PHP 7.0: git checkout PHP-7.0 PHP HEAD: git checkout master
生成扩展
cd ext
第一步
生成PHP扩展骨架:
./ext_skel --extname=myext
ext_skel是PHP官方提供的用于生成php扩展骨架代码的工具
成功创建完基本文件之后会提示如下:
Creating directory myextCreating basic files: config.m4 config.w32 .svnignore myext.c php_myext.h CREDITS EXPERIMENTAL tests/001.phpt myext.php [done].To use your new extension, you will have to execute the following steps:1. $ cd ..2. $ vi ext/myext/config.m43. $ ./buildconf4. $ ./configure --[with|enable]-myext5. $ make6. $ ./php -f ext/myext/myext.php7. $ vi ext/myext/myext.c8. $ makeRepeat steps 3-6 until you are satisfied with ext/myext/config.m4 andstep 6 confirms that your module is compiled into PHP. Then, start writingcode and repeat the last two steps as often as necessary.
查看生成的文件:
tree myext|-- CREDITS|-- EXPERIMENTAL|-- config.m4|-- config.w32|-- myext.c|-- myext.php|-- php_myext.h`-- tests `-- 001.phpt1 directory, 8 files
config.m4是AutoConf工具的配置文件,用来修改各种编译选项。
第二步
修改 config.m4
cd ..vi ext/myext/config.m4
将
dnl PHP_ARG_WITH(myext, for myext support,dnl Make sure that the comment is aligned:dnl [ --with-myext Include myext support])
修改为
PHP_ARG_WITH(myext, for myext support,[ --with-myext Include myext support])
下边还有一个 –-enable-myext,是表示编译到php内核中。with是作为动态链接库载入的。
第三步
修改 php_myext.h,在45行找到 PHP_FUNCTION(confirm_myext_compiled), 这里就是扩展函数声明部分;
可以增加一行 PHP_FUNCTION(myext_helloworld);, 表示声明了一个myext_helloworld的扩展函数。
第四步
修改 myext.c, 这个是扩展函数的实现部分 在42行之后, 加入 PHP_FE(myext_helloworld, NULL)
const zend_function_entry myext_functions[] = { PHP_FE(confirm_myext_compiled, NULL) /* For testing, remove later. */ PHP_FE(myext_helloworld, NULL) PHP_FE_END /* Must be the last line in myext_functions[] */};
这的代码是将函数指针注册到Zend引擎,增加一行PHP_FE(myext_helloworld, NULL)(后面不要带分号)。
第五步
在 myext.c末尾加myext_helloworld的执行代码。
PHP_FUNCTION(myext_helloworld){ char *arg = NULL; int arg_len, len; char *strg; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) { return; } php_printf("Hello World!\n"); RETURN_TRUE;}
zend_parse_parameters是用来接受PHP传入的参数,RETURN_XXX宏是用来返回给PHP数据。
第六步
在myext目录下依次执行:
phpize./configuremakemake install
如果执行 ./configure时出现此错误: configure: error: Cannot find php-config. Please use Cwith-php-config=PATH 说明php-config配置文件不在缺省目录里, 重新执行: ./configure --with-php-config=/usr/local/php/bin/php-config节课 这个文件通常是在PHP的安装目录的bi目录下的一个叫做 php-config或者 php-config5的文件
然后修改php.ini加入 extension = "myext.so"
第七步
通过执行 php -r "myext_helloworld('test');"验证扩展是否成功加载,如果成功则输出 hello world!
参考
- http://php.net/git.php
- http://rango.swoole.com/archives/152

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

在PHP中,應使用password_hash和password_verify函數實現安全的密碼哈希處理,不應使用MD5或SHA1。1)password_hash生成包含鹽值的哈希,增強安全性。 2)password_verify驗證密碼,通過比較哈希值確保安全。 3)MD5和SHA1易受攻擊且缺乏鹽值,不適合現代密碼安全。

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

PHP類型提示提升代碼質量和可讀性。 1)標量類型提示:自PHP7.0起,允許在函數參數中指定基本數據類型,如int、float等。 2)返回類型提示:確保函數返回值類型的一致性。 3)聯合類型提示:自PHP8.0起,允許在函數參數或返回值中指定多個類型。 4)可空類型提示:允許包含null值,處理可能返回空值的函數。

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。
