linux下php實現C/C++擴充套件程式設計
某個功能被編譯到so檔案中,那麼如何通過php來呼叫它?一個方法是寫一個php模組(php extension),在php中呼叫該模組內的函式,再通過該模組來呼叫so中的函式。下面做一個簡單的例子,使用的作業系統是Fedora Core 6。
首先做一個簡單的so檔案:
/**
* hello.c
* To compile, use following commands:
* gcc -O -c -fPIC -o hello.o hello.c
* gcc -shared -o libhello.so hello.o
*/
int hello_add(int a, int b)
{
return a + b;
}
然後將它編譯成.so檔案並放到系統中:
$ gcc -O -c -fPIC -o hello.o hello.c
$ gcc -shared -o libhello.so hello.o
$ su
# echo /usr/local/lib > /etc/ld.so.conf.d/local.conf
# cp libhello.so /usr/local/lib
# /sbin/ldconfig寫段小程式來驗證其正確性:
/**
* hellotest.c
* To compile, use following commands:
* gcc -o hellotest -lhello hellotest.c
*/
#include <stdio.h>
int main()
{
int a = 3, b = 4;
printf("%d + %d = %d\n", a, b, hello_add(a,b));
return 0;
}
編譯並執行:
$ gcc -o hellotest -lhello hellotest.c
$ ./hellotest
3 + 4 = 7OK,
下面我們來製作PHP模組。首先確保你安裝了 php-devel 包,沒有的話請自行從安裝光碟上找。然後下載php原始碼。我使用的是php-5.2.9.tar.gz,解壓縮。
$ tar xzvf php-5.2.9.tar.gz
$ cd php-5.2.9/ext然後通過下面的命令建立一個名為 test 的模組。
$ ./ext_skel --extname=test執行該命令之後它會提示你應當用什麼命令來編譯模組,可惜那是將模組整合到php內部的編譯方法。如果要編譯成可動態載入的 php_test.so,方法要更為簡單。
$ cd test首先編輯 config.m4 檔案,去掉第16行和第18行的註釋(註釋符號為 dnl 。)
16: PHP_ARG_ENABLE(test, whether to enable test support,
17: dnl Make sure that the comment is aligned:
18: [ --enable-test Enable test support])然後執行 phpize ()程式,生成configure指令碼:
$ phpize然後開啟 php_test.h,在 PHP_FUNCTION(confirm_test_compiled); 之下加入函式宣告:
PHP_FUNCTION(confirm_hello_compiled); /* For testing, remove later. */
PHP_FUNCTION(test_add);開啟 hello.c,在 PHP_FE(confirm_test_compiled, NULL) 下方加入以下內容。
zend_function_entry test_functions[] = {
PHP_FE(confirm_test_compiled, NULL) /* For testing, remove later. */
PHP_FE(test_add, NULL) /* For testing, remove later. */
{NULL, NULL, NULL} /* Must be the last line in test_functions[] */
};
然後在 test.c 的最末尾書寫test_add函式的內容:
PHP_FUNCTION(test_add)
{
long int a, b;
long int result;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &a, &b) == FAILURE) {
return;
}
result = test_add(a, b);
RETURN_LONG(result);
}
儲存退出,編譯並安裝:
$ ./configure --enable-jinzhesheng_module--with-apxs=/usr/local/apache/bin/apxs--with-php-config=/usr/local/php/bin/php-config$ make
# cp modules/test.so /usr/lib/php/modules然後在 /www/web/ 下建立一個 test.php 檔案,內容如下:
<?php
dl("test.so");
echo test_add(1, 2);
?>
然後在瀏覽器中開啟test.php檔案,如果顯示3,則說明函式呼叫成功了。
相關文章
- Linux下為PHP新增FTP擴充套件LinuxPHPFTP套件
- Linux下編寫一個PHP擴充套件LinuxPHP套件
- Linux下給PHP安裝amqp擴充套件LinuxPHPMQ套件
- 基於PHP擴充套件的WAF實現PHP套件
- C++ 對C的擴充套件有哪些C++套件
- php新增pcntl擴充套件(Linux)PHP套件Linux
- C++ 開發 PHP 7 擴充套件之原生常量定義C++PHP套件
- Linux下安裝PHP的lua擴充套件庫LinuxPHP套件
- 用Shell擴充套件實現原始碼統計程式套件原始碼
- php利用pcntl擴充套件實現高併發PHP套件
- PHP實現Bitmap的探索 - GMP擴充套件使用PHP套件
- C++程式設計實現C++程式設計
- Linux 上安裝 PHP 擴充套件LinuxPHP套件
- CentOS 下安裝 PHP Swoole 擴充套件CentOSPHP套件
- centos下為php新增gd擴充套件CentOSPHP套件
- 新增php擴充套件PHP套件
- php ubuntu 擴充套件PHPUbuntu套件
- PHP擴充套件開發就是一個自己的PHP擴充套件PHP套件
- 利用PHP SOAP擴充套件實現簡單Web ServicesPHP套件Web
- (轉)Linux下 C++呼叫C 實現socket網路通訊程式設計LinuxC++程式設計
- C++對C語言的擴充套件(1)--引用C++C語言套件
- Mac & Linux下php7新增memcached和redis擴充套件MacLinuxPHPRedis套件
- linux與windows下 安裝 ImageMagick 及其 php imagick擴充套件LinuxWindowsPHP套件
- Linux下php擴充套件tidy的安裝_參考LinuxPHP套件
- 擴充套件JAAS,XMLPolicyFile實現套件XML
- Windows 7 下用C++為node.js寫擴充套件模組WindowsC++Node.js套件
- 使用高階函式實現類的擴充套件設計函式套件
- MAC下安裝php-redis擴充套件MacPHPRedis套件
- ubuntu 下安裝redis 以及php擴充套件UbuntuRedisPHP套件
- ubuntu 下安裝memcache 以及php擴充套件UbuntuPHP套件
- mac os 下php安裝mcrypt擴充套件MacPHP套件
- 開發php擴充套件PHP套件
- PHP 擴充套件安裝PHP套件
- PHP7擴充套件PHP套件
- 用SQL Server寫指令碼和程式設計實現SSIS包的擴充套件SQLServer指令碼程式設計套件
- Shell擴充套件程式設計實現Windows2000桌面圖示透明套件程式設計Windows
- php7安裝redis擴充套件和memcache擴充套件PHPRedis套件
- Mac 下使用 pecl 安裝 PHP 的 swoole 擴充套件實踐MacPHP套件