PHP擴展調用so動態鏈接庫(1)

今天so終於是調起來了,服務器上的問題雖然一度沒有辦法,但是也最終解決了。好了 ,把過程步驟和問題都彙總一下啦偷笑
先來說一下網上爛大街的調用so步驟:
首先,編寫一個簡單的so:

int hello(int a,int b)
{
    return a+b; 
 }

然後將它編譯成.so文件:
放到系統庫中:

$sudo cp libhello.so /usr/local/lib
$ sudo ldconfig

在這裏說明一下,之前的linux系統的用戶動態庫目錄設置好像是在/etc/ld.so.conf.d/local.conf文件中,而在我使用的ubuntu12.04中是在/etc/ld.so.conf.d/libc.conf這個文件中,而且默認已設置爲/usr/local/lib這個目錄,將我們的so文件放到這個目錄後,需用ldconfig命令使其生效。
下面我們寫個test程序來驗證一下:

 #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 hellotest.c -lhello
$ ./hellotest
3 + 4 = 7

OK,下面我們來製作PHP模塊。首先確保你安裝了 php-devel (centOS系列),ubuntu下面是php5-dev。

$ sudo apt-get update
$ sudo apt-get install php5-dev

好吧我是手打的,包名有點記不清了,出錯的話自行查一下就OK。
然後再下載php源碼,建議使用版本不要太高,因爲沒有必要,我用的5.3.20~~下載鏈接:PHP源碼下載

$ tar xzvf php-5.2.30.tar.gz
$ cd php-5.2.30/ext

進入到ext後,先不着急生成自己的擴展模塊,所謂磨刀不誤砍柴工,我們先來寫一個.def函數原型文件,這樣我們纔好利用proto參數的好處。一會就明白了。

$ vim hello.def

在這個裏面我們只需要寫一行字:

int hello(int a,int b)

注意不要加分號,然後保存退出。一會在解釋。
然後通過下面的命令建立一個名爲 hello 的模塊。

$ ./ext_skel --extname=hello --proto=hello.def

然後 ls一下,你會發現多了一個叫hello的文件夾,這就是咱們要往php中添加的擴展模塊。
按正常的步驟,我們需要在php_hello.h和hello.c中添加我們想要調用的函數信息,然而,我機智地發現了proto這個參數,這爲我省了不少事~~
然後

$ cd hello

首先編輯 config.m4 文件,去掉第16行和第18行的註釋(註釋符號爲 dnl 。)ps:config.m4是個很重要的文件,生成擴展所需要的命令細節都在這,比如讓擴展支持c++等。

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

然後執行 phpize 程序,生成configure腳本:

$ phpize 

hello.def用過的人歐說好,自動把函數框架頭文件啥的都弄好了,讓你直接開上自動檔。
然後在 hello.c 的最末尾寫hello_add函數的內容,:

PHP_FUNCTION(hello_add)
{
    long int a, b;
    long int result;    
    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &a, &b) == FAILURE) {
        return;
    }
    result = hello_add(a, b);
    RETURN_LONG(result);
}

保存退出,然後經典三步走,編譯-安裝:

$ ./configure
$ make LDFLAGS=-lhello
$ sudo make install (此命令會將so放在php的擴展文件去)

然後在php.ini中添加一行字,告訴PHP引擎我的擴展要來了~~這個文件位置和你安裝PHP還有APACHAE有關,要是實在想不起來,locate一下。

$ cd /etc/php/apache2/php.ini 
$ /etc/php5/apache2/php.ini 
$ vim php.ini

大概在50%左右的地方,找到mysql.so,這是人家給的例子,前面的分號表示註釋,在這附近隨便什麼地方,加上:

 extension=hello.so

然後重啓apache服務:

$ /etc/init.d/apache2 restart

在centOS/RedHat下面是找到httpd後:

# ./httpt -k restart

然後在 /var/www/html 下建立一個 hello.php 文件,內容如下:

<?php

    echo hello_add(3, 4);
?>

然後在瀏覽器中打開hello.php文件,如果顯示7,則說明函數調用成功了。

好了,基本的流程大致就這樣了,後面會說說碰到的問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章