鍍金池/ 教程/ PHP/ 構(gòu)建并編譯一個(gè)宿主應(yīng)用
ext_skel生成器
構(gòu)建并編譯一個(gè)宿主應(yīng)用
總結(jié)
小結(jié)
小結(jié)
小結(jié)
編譯前的準(zhǔn)備
變量的存儲方式
強(qiáng)制模塊依賴
編譯我們的擴(kuò)展
庫的查找
讓我們從SAPI開始
Unix/Linux平臺下的編譯
小結(jié)
函數(shù)的參數(shù)
zendparseparameters
PHP語言中的超級全局變量(Superglobals)
同時(shí)擴(kuò)展和嵌入
線程安全
變量的值
啟動與終止的那點(diǎn)事
一個(gè)擴(kuò)展的基本結(jié)構(gòu)
資源自有的引用計(jì)數(shù)
小結(jié)
創(chuàng)建PHP變量
有趣的流
一個(gè)特殊的參數(shù):return_value
設(shè)置宿主環(huán)境
小結(jié)
關(guān)于生命周期
變量的檢索
內(nèi)存管理
狀態(tài)與屬性讀取
Persistent Resources
Autoconf
小結(jié)
PHP編譯前的config配置
函數(shù)返回值
PHP中的面向?qū)ο螅ㄒ唬?/span>
PHP擴(kuò)展中的全局變量
嵌入式SAPI
通過嵌入包裝重新創(chuàng)建cli
小結(jié)
在Win32平臺上編譯PHP
小結(jié)
老技術(shù)新用
過濾器
MINFO與phpinfo
zendclassentry
編寫函數(shù)
PHP中的資源類型
實(shí)現(xiàn)wrapper
引用計(jì)數(shù)
小結(jié)
變量的類型
流的概覽
PHP中的面向?qū)ο螅ǘ?/span>
擴(kuò)展生成器
覆寫INI_SYSTEM和INI_PERDIR選項(xiàng)
捕獲輸出
小結(jié)
回調(diào)到php中
PHP的啟動與終止
定義一個(gè)接口
初始化php
配置編譯環(huán)境
PHP Streams的本質(zhì)
小結(jié)
類的繼承與接口的實(shí)現(xiàn)
讀寫ini配置
定義一個(gè)類
小結(jié)
PHP的生命周期
流的上下文
引用與函數(shù)的執(zhí)行結(jié)果
類型轉(zhuǎn)換
小結(jié)
Array與HashTable
PECL_Gen
復(fù)合類型的數(shù)據(jù)——資源
小結(jié)
小結(jié)
數(shù)組(C中的)與鏈表
PHP的生命周期
讀寫對象的屬性
PHP變量在內(nèi)核中的實(shí)現(xiàn)
Manipulation
高級嵌入式
操作HashTable的API
流式訪問
Arg Info 與類型綁定
小結(jié)
在內(nèi)核中操作PHP語言中數(shù)組
第一個(gè)擴(kuò)展
流的封裝——wrapper
配置和鏈接
流的實(shí)現(xiàn)
PHP的生命周期
生成對象的實(shí)例與調(diào)用方法
錯(cuò)誤處理
INI設(shè)置
靜態(tài)編譯
小結(jié)
內(nèi)存管理
Static Stream Operations
常量

構(gòu)建并編譯一個(gè)宿主應(yīng)用

究其本質(zhì)而言, 庫只是?個(gè)沒有目的的代碼集合. 為了讓它工作, 你需要用以嵌入php 的應(yīng)用. 首先, 我們來封裝?個(gè)非常簡單的應(yīng)用, 它啟動Zend引擎并初始化PHP處理?個(gè)請求, 接著就回頭進(jìn)行資源的清理.

#include <sapi/embed/php_embed.h>
int main(int argc, char *argv[])
{
    PHP_EMBED_START_BLOCK(argc,argv)
    PHP_EMBED_END_BLOCK()
    return 0; 
}

由于這涉及到了很多頭文件, 構(gòu)建實(shí)際上需要的時(shí)間要長于這么小的代碼片段通常需 要的時(shí)間. 如果你使用了不同于默認(rèn)路徑(/usr/local)的PREFIX, 請確認(rèn)以下面的方式指定 路徑:

gcc -I /usr/local/php-dev/include/php/ \
    -I /usr/local/php-dev/include/php/main/ \
    -I /usr/local/php-dev/include/php/Zend/ \
    -I /usr/local/php-dev/include/php/TSRM/ \
    -lphp5 \
    -o embed1
    embed1.c

由于這個(gè)命令每次輸入都很麻煩, 你可能更原意用一個(gè)簡單的Makefile替代:

CC = gcc
CFLAGS = -c \
    -I /usr/local/php-dev/include/php/ \
    -I /usr/local/php-dev/include/php/main/ \
    -I /usr/local/php-dev/include/php/Zend/ \
    -I /usr/local/php-dev/include/php/TSRM/ \
    -Wall -g
LDFLAGS = -lphp5
all: embed1.c
    $(CC) -o embed1.o embed1.c $(CFLAGS)
    $(CC) -o embed1 embed1.o $(LDFLAGS)

這個(gè)Makefile和前面提供的命令有?些重要的區(qū)別. 首先, 它用-Wall開關(guān)打開了編譯期的警 告, 并且用-g打開了調(diào)試信息. 此外它將編譯和鏈接兩個(gè)階段分為了兩個(gè)獨(dú)立的階段, 這樣在后期 增加更多源文件的時(shí)候就相對容易. 請自己重新組著這個(gè)Makefile, 不過這里用于對齊的是Tab(水 平制表符)而不是空格.

現(xiàn)在, 你對embed1.c源文件做修改后, 只需要執(zhí)行?一個(gè)make命令就可以構(gòu)建出新的 embed1可執(zhí)行程序了.

上一篇:小結(jié)下一篇:庫的查找