PHP 擴展開發(fā)環(huán)境搭建

環(huán)境搭建步驟:

  1. 創(chuàng)建 docker 容器
    (原因:①. Mac下環(huán)境配置有坑挪哄,不好弄(其實就是搞不定-_-||);②. 不想搞亂 Mac 環(huán)境报嵌;③. docker 容器可以隨時刪除和重建)
  2. 下載PHP源碼旷祸,并源碼安裝 PHP(源碼必須下,后面擴展開發(fā)還有用)
  3. 通過ext目錄下ext_skel腳本生成擴展的基本框架:./ext_skel --extname汹族;

1.環(huán)境配置說明:

我的環(huán)境:Mac + Docker + Ubuntu + PHP7.1.26 + bg-sync
Mac萧求、Docker、Ubuntu 這三個不用解釋顶瞒,php 版本這個沒有限制夸政,只是需要注意,生成擴展基本框架的腳本 7.1 版本跟 7.3 的有點區(qū)別榴徐。
重點說這個 bg-sync 守问,這是我用到的一個 Docker 容器,用來同步容器內(nèi)和宿主機(Mac)的文件坑资,否則只能用 vim 在容器中進行編輯酪碘。(說白了就是技術(shù)渣,用不慣 vim .

2.創(chuàng)建 Docker 容器

因為這里會用到 2 個容器盐茎,一個是 Ubuntu 容器,一個是用于同步文件的 bg-sync 容器徙赢,所以用 docker-compose 去組織容器
目錄結(jié)構(gòu):

|---php-ext
|   |---build 
|       |---Dockerfile //用于生成 Ubuntu 鏡像
|   |---php-src     //php 源碼
|       |---...
|   |--- docker-compose 

docker-compose.yml 文件:

version: '3'

# 掛載數(shù)據(jù)卷
volumes:
  php-ext:

services:
  ubuntu-php-ext:
    build: ./build/
    volumes:
      - php-ext:${EXTSPACES}
    stdin_open: true
    tty: true

  # this service sync a local dir in your computer with a dir on the app server side
  bg-sync:
    image: cweagans/bg-sync
    volumes:
      - ${WORKSPACES}:/source
      - php-ext:${EXTSPACES}
    environment:
      SYNC_VERBOSE: 1
      SYNC_DESTINATION: ${EXTSPACES}
      SYNC_MAX_INOTIFY_WATCHES: 40000
    privileged: true

./build/Dockerfile 文件

FROM ubuntu
# install compile tool
RUN apt-get update && apt-get install -y \
    libxml2 \
    libxml2-dev \
    autoconf

.env 文件

# 擴展源文件目錄(宿主機)
WORKSPACES=./php-src

# 擴展源文件目錄(容器內(nèi))
EXTSPACES=/root/php-src

3.下載源碼并解壓字柠,重命名

源碼下載地址:https://www.php.net/releases/
解壓,并重命名為 php-src 狡赐,按照步驟 2 中的文件目錄結(jié)構(gòu)復(fù)制到目錄下即可窑业。

4.構(gòu)建 docker-compose

·切換到 php-ext目錄下
·docker-compose up --build

等待出現(xiàn)下圖即成功

image.png

5.源碼安裝 php

 ·進入 Ubuntu 容器
·切換到/root/php-src目錄下
·依次運行一下命令進行源碼安裝:
./configure --enable-debug
make 
sudo make install
make clean(次步非必須)

如圖所示,即為安裝成功:


image.png

6.創(chuàng)建一個簡單的擴展

6.1PHP提供了一個命令用于生成擴展的基本文件架構(gòu)枕屉,只要調(diào)用該命令即可常柄。
cd php-src/ext/
./ext_skel --extname=aatest  //aatest為擴展的名稱

在命令行中出現(xiàn)如下提示,即為成功

root@544e81fb3734:~/php-src/ext# ./ext_skel --extname=aatest
Creating directory aatest
Creating basic files: config.m4 config.w32 .gitignore aatest.c php_aatest.h CREDITS EXPERIMENTAL tests/001.phpt aatest.php [done].

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

1.  $ cd ..
2.  $ vi ext/aatest/config.m4
3.  $ ./buildconf
4.  $ ./configure --[with|enable]-aatest
5.  $ make
6.  $ ./sapi/cli/php -f ext/aatest/aatest.php
7.  $ vi ext/aatest/aatest.c
8.  $ make

Repeat steps 3-6 until you are satisfied with ext/aatest/config.m4 and
step 6 confirms that your module is compiled into PHP. Then, start writing
code and repeat the last two steps as often as necessary.

此時搀擂,可以按照提示步驟運行西潘,也可繼續(xù)跟隨本文后面的步驟,意思相同哨颂。

成功之后打開 php-src/ext/aatest目錄喷市,上面的命令已經(jīng)幫我們生成好了一些文件。
最主要的是 config.m4, php_aatest.h, aatest.c 這三個文件威恼。

config.m4 //編譯配置文件
php_aatest.h //擴展頭文件
aatest.c //擴展源碼

6.2修改config.m4

// 注意:dnl 開頭的內(nèi)容為注釋
PHP_ARG_ENABLE(aatest, whether to enable aatest support,
  Make sure that the comment is aligned:
[  --enable-aatest           Enable aatest support])

if test "$PHP_AATEST" != "no"; then
    PHP_NEW_EXTENSION(aatest, aatest.c, $ext_shared)
fi

6.3修改 aatest.c

PHP_FUNCTION(confirm_aatest_compiled)
{
    php_printf("hello aatest!\n");
    return;
}

6.4編譯擴展

cd aaetest
phpize
./configure --with-php-config=/usr/local/bin/php-config
make
sudo make install

----------------------------------------------------------------------
成功提示:
Build complete.
Don't forget to run 'make test'.
Installing shared extensions:     /usr/local/lib/php/extensions/no-debug-non-zts-20160303/

其中第三步品姓,php-config 的路徑來自于源碼安裝之后的成功提示中,如下所示:

php-config.png

6.5運行測試文件

php -q aatest.php
運行結(jié)果:
Functions available in the test extension:
confirm_aatest_compiled
hello aatest!

----------------------------------------------------------------------
此時箫措,代表擴展是正確的腹备。

6.6添加php.ini 和擴展

雖然上面的步驟證明了擴展是正確的,但是通過命令 php -m 發(fā)現(xiàn)此時擴展中還沒有剛才創(chuàng)建的擴展斤蔓,但是查看步驟6.4的存放擴展的文件夾中植酥,已經(jīng)將擴展文件加進去了。于是猜想可能還需要在配置文件中附迷,添加擴展的路徑惧互,但是哎媚。。喊儡。php --ini查看拨与,居然連 php.ini 文件都沒有!0隆买喧!

root@544e81fb3734:/# php -m
[PHP Modules]
Core
ctype
date
dom
......
[Zend Modules]

root@544e81fb3734:/# php -i | grep aatest
root@544e81fb3734:/# ls /usr/local/lib/php/extensions/no-debug-non-zts-20160303/
aatest.so  opcache.a  opcache.so

root@544e81fb3734:/# php --ini
Configuration File (php.ini) Path: /usr/local/lib
Loaded Configuration File:         (none)
Scan for additional .ini files in: (none)
Additional .ini files parsed:      (none)

查詢得知,源碼編譯完了之后就是沒有 php.ini文件匆赃,需要手動添加

1.首先確定 php.ini文件的存放路徑
2.拷貝源碼中的文件淤毛,并重命名為 php.ini
3.添加 extension=aatest.so,拷貝 至 步驟1的目錄中

root@544e81fb3734:/# php -i | grep "php.ini"
Configuration File (php.ini) Path => /usr/local/lib
root@544e81fb3734:/# cd root/php-src/
root@544e81fb3734:~/php-src# ls
CODING_STANDARDS    Makefile.objects                  README.SUBMITTING_PATCH    Zend           config.sub       libtool        php.ini-development      stub.c
CONTRIBUTING.md     NEWS                              README.TESTING             acinclude.m4   configure        ltmain.sh      php.ini-production       tests
......
root@544e81fb3734:~/php-src# cp php.ini-development php.ini

----------------------------------------------------------------------
//php.ini文件中
......
;extension=php_pdo_sqlite.dll
;extension=php_pgsql.dll
;extension=php_shmop.dll
//添加下面這行進行 aatest 擴展的添加
extension=aatest.so

; The MIBS data available 
......
----------------------------------------------------------------------

root@544e81fb3734:~/php-src# cp php.ini /usr/local/lib/php.ini
root@544e81fb3734:~/php-src# ls /usr/local/lib/
php  php.ini  python3.6
root@544e81fb3734:~/php-src# php -i | grep "php.ini"
Configuration File (php.ini) Path => /usr/local/lib
Loaded Configuration File => /usr/local/lib/php.ini
root@544e81fb3734:~/php-src# php -m
[PHP Modules]
aatest
Core
ctype
.......
//上面兩條命令查看算柳,aatest 擴展已經(jīng)有了
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末低淡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子瞬项,更是在濱河造成了極大的恐慌蔗蹋,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件囱淋,死亡現(xiàn)場離奇詭異猪杭,居然都是意外死亡,警方通過查閱死者的電腦和手機妥衣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門皂吮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人税手,你說我怎么就攤上這事蜂筹。” “怎么了冈止?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵狂票,是天一觀的道長。 經(jīng)常有香客問我熙暴,道長闺属,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任周霉,我火速辦了婚禮掂器,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘俱箱。我一直安慰自己国瓮,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著乃摹,像睡著了一般禁漓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上孵睬,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天播歼,我揣著相機與錄音,去河邊找鬼掰读。 笑死秘狞,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蹈集。 我是一名探鬼主播烁试,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼拢肆!你這毒婦竟也來了减响?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤郭怪,失蹤者是張志新(化名)和其女友劉穎辩蛋,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體移盆,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年伤为,在試婚紗的時候發(fā)現(xiàn)自己被綠了咒循。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡绞愚,死狀恐怖叙甸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情位衩,我是刑警寧澤裆蒸,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站糖驴,受9級特大地震影響僚祷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜贮缕,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一辙谜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧感昼,春花似錦装哆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽萍桌。三九已至,卻和暖如春凌简,著一層夾襖步出監(jiān)牢的瞬間上炎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工号醉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留反症,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓畔派,卻偏偏與公主長得像铅碍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子线椰,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容