欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PHP中調(diào)用C/C++制作的動態(tài)鏈接庫的教程

 更新時間:2016年03月10日 15:32:47   作者:iam_wingjay  
這篇文章主要介紹了PHP中調(diào)用C/C++制作的動態(tài)鏈接庫的教程,文中還簡單地提到了gcc編譯器下動態(tài)鏈接庫的制作方法,需要的朋友可以參考下

一般而言,php速度已經(jīng)比較快,但是,對于一些較高級開發(fā)者而言,如果想要追求更快的速度,那毫無疑問可以通過自己寫c代碼,并編譯為動態(tài)鏈接庫(常為.so文件),然后php通過創(chuàng)建一個新的擴展(extension),并在擴展里調(diào)用該.so文件,同時對外暴露出php函數(shù)接口。
在實際使用中,只要調(diào)用該函數(shù)接口,即可使用底層更快速的c函數(shù)服務。

一、動態(tài)鏈接庫(shared)

動態(tài)鏈接庫的文件名后綴通常是 ".so"。在Windows系統(tǒng)中,其文件名后綴是".dll"。

程序如果是和動態(tài)連接庫進行鏈接(link),程序運行時需要能夠找到相應的動態(tài)鏈接庫文件。

使用動態(tài)鏈接庫存編譯的程序在運行時要求用戶的機器上必需也安裝了相應的動態(tài)鏈接庫文件,這些庫文件需要放置在特定的目錄,以讓程序能夠加載這些庫。

雖然這似乎沒有使用靜態(tài)鏈接庫的程序使用方便,但卻減少了程序的大小。對于那些會被很多程序使用到的庫,使用動態(tài)鏈接的好處就更加明顯了。

動態(tài)鏈接庫的制作:

gcc -shared -fPIC -o libmylib.so mylib.c  ; # 編譯成為shared library

選項-fPIC在AMD64上是必須的,其它平臺是則不是必要選項。

包含靜態(tài)鏈接庫到動態(tài)鏈接庫中

編譯動態(tài)鏈接庫時,如果需要鏈接靜態(tài)庫,并把鏈接庫的內(nèi)容包含到要編譯的動態(tài)庫中,可以使用選項-Wl,--whole-archive。

例如:

gcc -shared -o libmylib.so -Wl,--whole-archive libmylib.a \
  -Wl,--no-whole-archive libother.a

上面的-Wl表示傳遞給linker(鏈接器)。

二、調(diào)用動態(tài)C/C++鏈接庫
下面,本文的開發(fā)環(huán)境背景是CentOS release 6.5 。為了能夠調(diào)用c庫,我們的php 5.6.9,apache 2.4均是下載源碼并編譯的,不可直接通過yum安裝!請注意。至于php和apache的源碼編譯本文不提,只要注意在configure打開合適開關(guān)即可。

具體步驟如下:
將共享庫.so添加入系統(tǒng)配置中(假設(shè)共享庫名為 'libhello.so')

 cp libhello.so /usr/local/lib
 echo /usr/local/lib > /etc/ld.so.conf.d/local.conf
 /sbin/ldconfig

在php/ext目錄下創(chuàng)建擴展頭文件,取名為myfunctions.def
在該文件里填寫c函數(shù)聲明即可。每個函數(shù)一行。

 string hello(int a)
 int hello_add(int a, int b)

使用ext_skel搭建擴展骨架

./ext_skel --extname=myfunctions --proto=myfunctions.def

打開config.m4 中的enable開關(guān)

 PHP_ARG_ENABLE(myfunctions, whether to enable myfunctions support, 
 [ --enable-myfunctions        Include myfunctions support])

上面把擴展骨架建立好了,下面重新配置php (下面是我個人配置文件,讀者需要結(jié)合自己情況修改)

 ./buildconf --force  //生成新配置腳本
 './configure' '--prefix=/usr/local/php' '--with-libdir=lib64' '--enable-fpm' '--with-fpm-user=php-fpm' '--with-fpm-group=www--enable-mysqlnd' '--with-mysql=mysqlnd' '--with-mysqli=mysqlnd' '--with-pdo-mysql=mysqlnd' '--enable-opcache' '--enable-pcntl' '--enable-mbstring' '--enable-soap' '--enable-zip' '--enable-calendar' '--enable-bcmath' '--enable-exif' '--enable-ftp' '--enable-intl' '--with-openssl' '--with-zlib' '--with-curl' '--with-gd' '--with-zlib-dir=/usr/lib' '--with-png-dir=/usr/lib' '--with-jpeg-dir=/usr/lib' '--with-gettext' '--with-mhash' '--with-ldap' '--disable-fileinfo' '--with-config-file-path=/usr/local/php/etc' '--with-apxs2=/usr/local/httpd/bin/apxs' '--enable-myfunctions' // 配置

 記??!一定在末尾加上 —enable-myfunctions 。這樣子才會被編譯進php中。
當擴展編譯進去了之后,就可以開始修改擴展里的myfunctions.c文件,在里面可以添加php->c的轉(zhuǎn)接函數(shù),在轉(zhuǎn)接函數(shù)里可以調(diào)用.so內(nèi)的函數(shù)。
比如要添加一個hello_add的php函數(shù),里面可以調(diào)用c函數(shù)add(int a, int b)
a. 添加函數(shù)聲明

PHP_FE(hello_add, NULL)

b. 添加php函數(shù)

PHP_FUNCTION(hello_add){ ... }

注意,在該函數(shù)里,如果調(diào)用了.so文件里的接口函數(shù),那么待會在make的時候,要指定所使用的.so共享庫,該共享庫必須完成第1步中添加到系統(tǒng)配置的操作。
如果調(diào)用了.so文件,那么要在php/Makefile中添加

Extra_LDFLAG = -lhello //對應前面的libhello.so
Extra_libs = -lhello
(make clean)

每次修改完上面的c文件,都要重新make

make
make install

重啟apache服務器

httpd -k restart

在phpinfo里可以看到新擴展,可以直接在php調(diào)用新擴展內(nèi)的函數(shù)。


相關(guān)文章

  • PHP7數(shù)組的底層實現(xiàn)示例

    PHP7數(shù)組的底層實現(xiàn)示例

    這篇文章主要給大家介紹了關(guān)于PHP7數(shù)組的底層實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家學習或者使用PHP7具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-08-08
  • php簡單截取字符串代碼示例

    php簡單截取字符串代碼示例

    這篇文章主要介紹了php簡單截取字符串的方法,可實現(xiàn)截取140個字符的功能,并針對中文字符進行判定處理,具有一定參考借鑒價值,需要的朋友可以參考下
    2016-10-10
  • PHP封裝的HttpClient類用法實例

    PHP封裝的HttpClient類用法實例

    這篇文章主要介紹了PHP封裝的HttpClient類,可實現(xiàn)簡單的GET、POST、Cookie、Session等功能,需要的朋友可以參考下
    2015-06-06
  • php抽獎概率算法(刮刮卡,大轉(zhuǎn)盤)

    php抽獎概率算法(刮刮卡,大轉(zhuǎn)盤)

    這篇文章主要為大家詳細介紹了php中獎概率算法,可用于刮刮卡,大轉(zhuǎn)盤等抽獎算法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-06-06
  • php常用的工具開發(fā)整理

    php常用的工具開發(fā)整理

    在本篇文章里小編給大家分享的是關(guān)于php常用的工具開發(fā)整理內(nèi)容,有此需要的朋友們可以學習下。
    2019-09-09
  • PHP連接MySQL數(shù)據(jù)庫操作代碼實例解析

    PHP連接MySQL數(shù)據(jù)庫操作代碼實例解析

    這篇文章主要介紹了PHP連接MySQL數(shù)據(jù)庫操作代碼實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • php中Array2xml類實現(xiàn)數(shù)組轉(zhuǎn)化成XML實例

    php中Array2xml類實現(xiàn)數(shù)組轉(zhuǎn)化成XML實例

    這篇文章主要介紹了php中Array2xml類實現(xiàn)數(shù)組轉(zhuǎn)化成XML的方法,實例分析了數(shù)組轉(zhuǎn)化成XML實現(xiàn)類Array2xml,是非常實用的數(shù)組轉(zhuǎn)化技巧,需要的朋友可以參考下
    2014-12-12
  • PHP實現(xiàn)定時生成HTML網(wǎng)站首頁實例代碼

    PHP實現(xiàn)定時生成HTML網(wǎng)站首頁實例代碼

    做靜態(tài)頁面的時候增加這個功能非常不錯,大家看下實現(xiàn)代碼
    2008-11-11
  • PHP遞歸創(chuàng)建多級目錄

    PHP遞歸創(chuàng)建多級目錄

    本文主要介紹了PHP遞歸創(chuàng)建多級目錄,這是一道經(jīng)典的php程序員面試題,分享了解題過程和思路,需要的朋友可以參考一下
    2015-11-11
  • 淺析php變量修飾符static的使用

    淺析php變量修飾符static的使用

    本篇文章是對php變量修飾符static的使用進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06

最新評論