首頁  >  文章  >  後端開發  >  PHP擴充的生成與編譯

PHP擴充的生成與編譯

高洛峰
高洛峰原創
2016-11-17 14:20:111429瀏覽

首先說明一下,PHP擴充有兩種編譯方式:
方式一:在編譯PHP時直接將擴充編譯進去
方式二:擴充被編譯成.so文件,在php.ini裡設定載入路徑;

以下開始說明建立PHP擴充並編譯的步驟:
下載PHP原始碼,並解壓縮,在原始碼的根目錄下開始操作,
1. 使用ext_skel產生擴充框架,如下:

➜ php-5.6.24 cd ~/Downloads /tmp/php-5.6.24➜ php-5.6.24 cd ext
➜ ext ./ext_skel --extname=myfirstext

 

ext_skel在執行後,會提示開發者的操作步驟擴充的兩種編譯方式裡的方式一的步驟, 如下:

To use your new extension, you will have to execute the following steps:

 $ cd ..
 $ vi ext/plogger/config.m4
 $ ./buildconf
 $ ./configure --[with|enable]-plogger
 $ make
 $ ./sapi/cli/php -f ext/plogger/plogger.php
 $ vi ext/plogger/plogger.c
 $ make

2. 修改檔案ext/myfirstext/config.m4
重點看line10-18的程式碼,用於設定./configure時啟用此擴充的命令選項,將其中line16和line18的dnl刪掉,把dnl理解為註解符。

dnl Otherwise use enable:
16 dnl PHP_ARG_ENABLE(myfirstext, whether to enable myfirstext support,
dnl Make sure that the comment is aligned:
dnl [ --enable-myfirstext Enable myfirstext support])
20 if test "$PHP_MYFIRSTEXT" != "no"; then
dnl Write more examples of tests here...

以上兩步驟是公共的,以下將分別介紹編譯PHP擴展的兩種方式,
方式一:編譯PHP時直接將擴展編譯進去
3. 在源碼根目錄下執行./buildconf,如下
4 . 在原始碼根目錄下執行./configure –enable-myfirstext
為了減少編譯時間,可以在configure階段指明不編譯某些模組,例如:

./configure --without-iconv --enable-debug -- enable-myfirstext --disable-cgi --enable-cli --without-pear --disable-xml --without-mysql

5. 在源碼根目錄下執行make
注意編譯成功後,別執行make install了,因為至此,擴展myfirstext已經編譯成功,並且已經生成了相應的php二進製文件了,它在./sapi/cli/php

方式二:擴展被編譯成.so文件,在php.ini裡配置載入路徑
3. 在擴充目錄ext/myfirstext/下執行phpize指令
4. 在擴充目錄ext/myfirstext/下執行./configure –enable-myfirstext指令
5. 在擴充目錄ext/myfirstext/下執行make
執行make後會在ext/myfirstext/modules下產生對應的.so文件,在php.ini中配置載入此文件即可。

校驗擴展是否載入成功
執行./sapi/cli/php -f ext/myfirstext/myfirstext.php
或透過php -m列出所有擴展,查看是否有myfirstext,執行命令:./sapi/cli /php -m | grep myfirstext
通過以上校驗,說明擴充編譯成功了。但到目前為止,還沒有編輯過c相關的程式碼,一切都是ext_skel預設產生的,看看這個擴充myfirstext包含哪些函數呢?如下:

➜ php-5.6.24 ./sapi/cli/php -r 'print_r(get_extension_funcs("myfirstext"));'

OK, 目前為止熟悉了PHP擴展框架的生成,配置,編譯框架的生成。接下來就要往擴充myfirstext加入一個自己的函數。


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn