包含phpextskel的詞條

本文目錄一覽:

windows下開發並編譯PHP擴展的方法

現在就簡單說一在WINDOWS下開發PHP擴展的步驟:

首先需要準備的軟件有:

cygwin

安裝路徑e:\app\cygwin

visual

studio

C++

6.0,

修改環境變量,把已經安裝好的PHP路徑設置為環境變量。在這裡,假設我的PHP安裝目錄是:e:\app\php5.2.5,那麼我把WINDOWS環境變量後面加上這個安裝目錄。方便一會兒使用php.exe。

PHP源代碼,這裡假設為e:\c_source_code\php-5.2.5

1、修改文件

「PHP源文件目錄/ext/ext_skel_win32.php」,在這裡就是:E:\c_source_code\php-5.2.5\ext,其中主要是修改其中的cygwin路徑。$cygwin_path

=

‘e:\app\cygwin\bin’;

把$cygwin_path修改為你實際安裝cygwin的路徑。

2、在源代碼ext目錄也就是e:\c_source_code\php-5.2.5\ext下,執行

php

ext_skel_win32.php

–extname=EXT_NAME,此時會在ext目錄下生成EXT_NAME目錄,這個目錄就是我們將要進行PHP擴展開發的框架。比如你運行php.exe

ext_skel_win32.php

–extname=foo,會在ext目錄下生成foo目錄。

3、將php-root\dev\php5ts.lib拷貝至

「ext/EXT_NAME」中。比如你要開發的PHP擴展名為foo,那麼就需要把php-root\dev\php5ts.lib拷貝到PHP源文件目錄\ext\foo中。

4、修改foo.c內容,編寫我們需要的C代碼。

5、進入EXT_NAME目錄,打開EXT_NAME.dsp。

設置VC6工程,

設置菜單「組建」-「移除工程配置」,選中「Win

32

Release_TS」,

設置菜單「工程」,選中「Win

32

Release_TS」

打開Tab「連接」,設置「輸出文件名」中的目錄,

[可選]打開Tab「C/C++」,增加「預處理器定義」「,COMPILE_DL_EXT_NAME」(注意全大寫,默認加入的),取消預定義「LIBZEND_EXPORTS」(否則不可引入zend函數)。

6、設置好以後,進行編譯,會生成一個dll文件,文件名是EXT_NAME.dll,比如在我們的例子中就為foo.dll

把foo.dll拷到e:\app\ext目錄下,並在php.ini里加上一行extension=foo.dll,重啟一下apache,查看phpinfo();,會發現我們的PHP擴展foo()已經加載進來,已經可以使用這個foo擴展了。

CentOS 6.5 yum安裝php後缺少ext_skel

如果是為了使用php的話建議使用lnmp一鍵安裝包來安裝,如果是要學習安裝環境的過程,請忽略我的回答。

lnmp安裝腳本:

wget -c h t t p://soft.vpser.net/lnmp/lnmp1.1-full.tar.gz tar zxf lnmp1.1-full.tar.gz cd lnmp1.1-full ./centos.sh

將上面網址中的http中間的空格刪掉,防止被屏蔽,回車後會自動從官方下載並安裝,詳細教程可以去lnmp官方網站查看

如何編寫PHP擴展

PHP取得成功的一個主要原因之一是她擁有大量的可用擴展。web開發者無論有何種需求,這種需求最有可能在PHP發行包里找到。PHP發行包包括支持各種數據庫,圖形文件格式,壓縮,XML技術擴展在內的許多擴展。

擴展API的引入使PHP3取得了巨大的進展,擴展API機制使PHP開發社區很容易的開發出幾十種擴展。現在,兩個版本過去了,API仍然和PHP3時的非常相似。擴展主要的思想是:儘可能的從擴展編寫者那裡隱藏PHP的內部機制和腳本引擎本身,僅僅需要開發者熟悉API。

有兩個理由需要自己編寫PHP擴展。第一個理由是:PHP需要支持一項她還未支持的技術。這通常包括包裹一些現成的C函數庫,以便提供PHP接口。例如,如果一個叫FooBase的數據庫已推出市場,你需要建立一個PHP擴展幫助你從PHP里調用FooBase的C函數庫。這個工作可能僅由一個人完成,然後被整個PHP社區共享(如果你願意的話)。第二個不是很普遍的理由是:你需要從性能或功能的原因考慮來編寫一些商業邏輯。

如果以上的兩個理由都和你沒什麼關係,同時你感覺自己沒有冒險精神,那麼你可以跳過本章。

本章教你如何編寫相對簡單的PHP擴展,使用一部分擴展API函數。對於大多數打算開發自定義PHP擴展開發者而言,它含概了足夠的資料。學習一門編程課程的最好方法之一就是動手做一些極其簡單的例子,這些例子正是本章的線索。一旦你明白了基礎的東西,你就可以在互聯網上通過閱讀文擋、原代碼或參加郵件列表新聞組討論來豐富自己。因此,本章集中在讓你如何開始的話題。在UNIX下一個叫ext_skel的腳本被用於建立擴展的骨架,骨架信息從一個描述擴展接口的定義文件中取得。因此你需要利用UNIX來建立一個骨架。Windows開發者可以使用Windows ext_skel_win32.php代替ext_skel。

然而,本章關於用你開發的擴展編譯PHP的指導僅涉及UNIX編譯系統。本章中所有的對API的解釋與UNIX和Windows下開發的擴展都有聯繫。

如何編寫一個PHP的C擴展

一、首先下載PHP源碼包,假設源碼包目錄為:/software/php-5.2.13

一、首先下載PHP源碼包,假設源碼包目錄為:/software/php-5.2.13

# cd /software/php-5.2.13/ext

二、假設我們要開發一個名為caleng_module的擴展,該擴展包含兩個函數:a–處理兩個整型相加和b-處理字符串重複輸出;

1、首先編寫一個函數定義文件,該文件編寫函數原型後綴為def,假設為:caleng_module.def

int a(int x, int y)

string b(string str, int n)

2、通過擴展骨架生成器,將在ext目錄下自動建立擴展目錄caleng_module

# ./ext_skel –extname=caleng_module –proto=caleng_module.def

3、修改配置文件: # vim /software/php-5.2.13/ext/caleng_module/config.m4,將如下行的注釋標籤”dnl”去掉,修改後如下所示:

PHP_ARG_ENABLE(myfunctions, whether to enable myfunctions support,

Make sure that the comment is aligned:

[ –enable-myfunctions Enable myfunctions support])

4、完善函數a和b的功能: # vim /software/php-5.2.13/ext/caleng_module/caleng_module.c

PHP_FUNCTION(a)

{

int x, y, z;

int argc = ZEND_NUM_ARGS();

if (zend_parse_parameters(argc TSRMLS_CC, “ll”, x, y) == FAILURE)

return;

z = x + y;

RETURN_LONG(z);

}

PHP_FUNCTION(b)

{

char *str = NULL;

int argc = ZEND_NUM_ARGS();

int str_len;

long n;

char *result;

char *ptr;

int result_length;

if (zend_parse_parameters(argc TSRMLS_CC, “sl”, str, str_len, n) == FAILURE)

return;

result_length = str_len * n;

result = (char *) emalloc(result_length + 1);

ptr = result;

while (n–) {

memcpy(ptr, str, str_len);

ptr += str_len;

}

*ptr = ‘\0’;

RETURN_STRINGL(result, result_length, 0);

}

三、編譯安裝,假設php的安裝目錄為:/usr/localhost/webserver/php

# cd /software/php-5.2.13/ext/caleng_module

# /usr/localhost/webserver/php/bin/phpize

# ./configure –with-php-config=/usr/localhost/webserver/php/bin/php-config

# make

# make install

現在將在/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613目錄下生成caleng_module.so文件

在php.ini配置文件中加入: extension=caleng_module.so.

搞定收工

如何在php擴展中封裝一個c++類

首先,要到了Query歸一化的C++版本源代碼。

query歸一化

引用第三方的類庫有兩種方法,一種是靜態引用,一種是動態引用,推薦使用靜態引用,因為靜態引用的情況下,會把類庫打包到php的擴展.SO文件中,這樣我們不必擔心依賴關係,帶着類庫到處跑了。

先用gcc產生.o文件,再用.o產生 最終的靜態庫 .a 文件

gcc -c -fpic queryword.cpp tradmap.cpp transcode.cpp -I . -O2

ar -r libqueryword.a queryword.o tradmap.o transcode.o

上邊圖中有產生的.o 和 .a文件

如果要動態編譯so的話,就是這個:

gcc -c -fpic -O3 queryword.cpp tradmap.cpp transcode.cpp -I .

gcc -shared queryword.o transcode.o tradmap.o -o libqueryword.so

好,現在有了libqueryword.a靜態庫,我們就可以開始做我們的擴展了。

先使用ext_skel工具生成我們框架的骨架.

./ext_skel –extname=queryword

把上邊的靜態庫放到 ./lib 目錄下。

然後修改config.m4文件。

去掉一些注釋符 dnl, 再添加兩行,最後config.m4里,有用的就是這幾行。

PHP_ARG_ENABLE(queryword, whether to enable queryword support,

Make sure that the comment is aligned:

[ –enable-queryword Enable queryword support])

if test “$PHP_QUERYWORD” != “no”; then

PHP_ADD_INCLUDE(./lib)

PHP_ADD_LIBRARY(stdc++, 1, QUERYWORD_SHARED_LIBADD)

PHP_ADD_LIBRARY_WITH_PATH(queryword, ./lib, QUERYWORD_SHARED_LIBADD)

PHP_REQUIRE_CXX()

PHP_SUBST(QUERYWORD_SHARED_LIBADD)

PHP_NEW_EXTENSION(queryword, queryword.cpp, $ext_shared)

fi

其中:

PHP_REQUIRE_CXX()用於指定這個擴展用到了C++

PHP_ADD_LIBRARY(stdc++, 1, QUERYWORD_SHARED_LIBADD) 用於將標準C++庫鏈接進入擴展

PHP_NEW_EXTENSION用於指定有哪些源文件應該被編譯,文件和文件之間用空格隔開.ext_skel默認生成的模塊框架是針對C的,我們要使用C++,那以上說明的兩個宏就是必須的.另外還要把queryword.c改名成queryword.cpp,所以PHP_NEW_EXTENSION原本包括的queryword.c也要修改.

默認生成的queryword.c(現在改名為queryword.cpp)了,已經包含了一個測試性質的導出函數,通過那個例子就可以大概明白怎麼添加自己的函數了. zend_function_entry是導出函數列表, zend_module_entry描述了模塊的信息. 不過因為是C++了,還是有幾點要修改的,否則跑不起來:

原創文章,作者:NUOS,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/147585.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
NUOS的頭像NUOS
上一篇 2024-11-01 14:10
下一篇 2024-11-01 14:10

相關推薦

發表回復

登錄後才能評論