设置嵌入php的宿主环境

设置宿主环境

现在你已经了解了PHPAPI的世界, 并可以使用zval以及语言内部扩展机制执行很多工作了, 是时候转移目标用它做它最擅长的事情了: 解释脚本代码.

嵌入式SAPI

回顾介绍中, php构建了一个层级系统. 最高层是提供用户空间函数和类库的所有扩展. 同时, 其下是服务API(SAPI)层, 它扮演了webserver(比如apache, iis以及命令行接口cli)的接口.

在这许多sapi实现中有一个特殊的sapi就是嵌入式sapi. 当这个sapi实现被构建时, 将会创建一个包含所有你已知的php和zend api函数以及变量的库对象, 这个库对象还包含一些额外的帮助函数和宏, 用以简化外部程序的调用.

生成嵌入式api的库和头文件和其他sapi的编译所执行的动作相同. 只需要传递--enable-embed到./configure命令中即可. 和以前一样, 使用--enable-debug对于错误报告和跟踪很有帮助.

你可能还需要打开--enable-maintainer-zts, 当然, 理由你已经耳熟能详了, 它将帮助你注意到代码的错误, 不过, 这里还有其他原因. 假设某个时刻, 你有多个应用使用php嵌入库执行脚本任务; 其中一个应用是简单的短生命周期的, 它并没有使用线程, 因此为了效率你可能想要关闭ZTS.

现在假设第二个应用使用了线程, 比如webserver, 每个线程需要跟踪自己的请求上下文. 如果ZTS被关闭, 则只有第一个应用可以使用这个库; 然而, 如果打开ZTS, 则两个应用都可以在自己的进程空间使用同一个共享对象.

当然, 你也可以同时构建两个版本, 并给它们不同的名字, 但是这相比于在不需要ZTS时包括ZTS带来的很小的效率影响更多的问题.

默认情况下, 嵌入式库将构建为libphp5.so共享对象, 或者在windows下的动态链接库, 不过, 它也可能使用可选的static关键字(--enable-embed=static)被构建为静态库.

构建为静态库的版本避免了ZTS/非ZTS的问题, 以及潜在的可能在一个系统中有多个php版本的情况. 风险在于这就意味着你的结果应用二进制将显著变大, 它将承载整个ZendEngine和PHP框架, 因此, 选择的时候就需要慎重的考虑你是否需要的是一个相对更小的库.

无论你选择那种构建方式, 一旦你执行make install, libphp5都将被拷贝到你的./configure指定的PREFIX目录下的lib/目录中. 此外还会在PREFIX/include/php/sapi/embed目录下放入名为php_embed.h的头文件, 以及你在使用php嵌入式库编译程序时需要的其他几个重要的头文件.

构建并编译一个宿主应用

究其本质而言, 库只是一个没有目的的代码集合. 为了让它工作, 你需要用以嵌入php的应用. 首先, 我们来封装一个非常简单的应用, 它启动Zend引擎并初始化PHP处理一个请求, 接着就回头进行资源的清理.

#include <sapi/embed/php_embed.h>  

int main(int argc, char *argv[])
{
    PHP_EMBED_START_BLOCK(argc,argv)
    PHP_EMBED_END_BLOCK()  

    return 0;
}

由于这涉及到了很多头文件, 构建实际上需要的时间要长于这么小的代码片段通常需要的时间. 如果你使用了不同于默认路径(/usr/local)的PREFIX, 请确认以下面的方式指定路径:

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

由于这个命令每次输入都很麻烦, 你可能更原意用一个简单的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)

这个Makefile和前面提供的命令有一些重要的区别. 首先, 它用-Wall开关打开了编译期的警告, 并且用-g打开了调试信息. 此外它将编译和链接两个阶段分为了两个独立的阶段, 这样在后期增加更多源文件的时候就相对容易. 请自己重新组着这个Makefile, 不过这里用于对齐的是Tab(水平制表符)而不是空格.

现在, 你对embed1.c源文件做修改后, 只需要执行一个make命令就可以构建出新的embed1可执行程序了.

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索php
, 应用
, 嵌入式
, include
, embed
, 8 embed
, 代码c语言dev
, local
, 一个
嵌入php代码
php 环境变量设置、mac 设置php环境变量、linux设置php环境变量、php.ini 环境变量设置、php环境设置,以便于您获取更多的相关知识。

时间: 2024-12-31 12:44:29

设置嵌入php的宿主环境的相关文章

ASP.NET Web API Selfhost宿主环境中管道、路由

前言 前面的几个篇幅对Web API中的路由和管道进行了简单的介绍并没有详细的去说明一些什么,然而ASP.NET Web API这个框架由于宿主环境的不同在不同的宿主环境中管道中的实现机制和路由的处理方式有着很大的不同,所以我会将对应不同的宿主环境来分别的做出简单的讲解.  ASP.NET Web API路由.管道     ASP.NET Web API 开篇介绍示例     ASP.NET Web API 路由对象介绍     ASP.NET Web API 管道模型     ASP.NET

Velocity魔法堂系列三:模板与宿主环境通信

一.前言   Velocity作为历史悠久的模板引擎不单单可以替代JSP作为Java Web的服务端网页模板引擎,而且可以作为普通文本的模板引擎来增强服务端程序文本处理能力.而且Velocity被移植到不同的平台上,如.Net的 NVelocity和js的Velocity.js,虽然各平台在使用和实现上略有差别,但大部分语法和引擎核心的实现是一致的,因此学习成本降低不少 哦.   最好的学习资源--官网:http://velocity.apache.org/   本系列打算采用如下结构对Velo

简单设置IIS配置PHP调试环境

Windows系统内置的Internet 信息服务(IIS)对ASP具有良好的支持,因此在IIS中调试ASP网页是非常方便的.但有些朋友的网页采用PHP编程技术,默认情况下,IIS是不支持PHP的,手工配置IIS的PHP调试环境对我们这些菜鸟来说是非常困难的,那如何才能让IIS支持 PHP呢?下面介绍一种方法,只需要简单几步就能在IIS中配置好PHP调试环境. 安装IIS组件 笔者以Windows XP系统的IIS5.1为例,首先必须安装IIS组件,系统默认是安装了的.如果你的系统中还没有,进入

如何设置JSP开发及运行环境

js 要学习Servlet和JSP开发,首先你必须准备一个符合Java Servlet 2.1/2.2和JavaServer Pages1.0/1.1规范的开发环境.Sun提供免费的JavaServer Web Development Kit(JSWDK),可以从http://java.sun.com/products/servlet/ 下载. 安装好JSWDK之后,你还要告诉javac,在编译文件的时候到哪里去寻找Servlet和JSP类.JSWDK安装指南对此有详细说明,但主要就是把serv

设置JSP开发、运行环境

js 2.1 安装Servlet和JSP开发工具 要学习Servlet和JSP开发,首先你必须准备一个符合Java Servlet 2.1/2.2和JavaServer Pages1.0/1.1规范的开发环境.Sun提供免费的JavaServer Web Development Kit(JSWDK),可以从http://java.sun.com/products/servlet/下载. 安装好JSWDK之后,你还要告诉javac,在编译文件的时候到哪里去寻找Servlet和JSP类.JSWDK安

设置JSP开发及运行环境

js 要学习Servlet和JSP开发,首先你必须准备一个符合Java Servlet 2.1/2.2和JavaServer Pages1.0/1.1规范的开发环境.Sun提供免费的JavaServer Web Development Kit(JSWDK),可以从http://java.sun.com/products/servlet/ 下载. 安装好JSWDK之后,你还要告诉javac,在编译文件的时候到哪里去寻找Servlet和JSP类.JSWDK安装指南对此有详细说明,但主要就是把serv

在ASP.NET Core应用中如何设置和获取与执行环境相关的信息?

HostingEnvironment是承载应用当前执行环境的描述,它是对所有实现了IHostingEnvironment接口的所有类型以及对应对象的统称.如下面的代码片段所示,一个HostingEnvironment对象承载的执行环境的描述信息体现在定义这个接口的6个属性上.ApplicationName和EnvironmentName分别代表当前应用的名称和执行环境的名称.WebRootPath和ContentRootPath是指向两个根目录的路径,前者指向的目录用于存放可供外界通过HTTP请

简单设置IIS配置PHP调试环境_php基础

Windows系统内置的Internet 信息服务(IIS)对ASP具有良好的支持,因此在IIS中调试ASP网页是非常方便的.但有些朋友的网页采用PHP编程技术,默认情况下,IIS是不支持PHP的,手工配置IIS的PHP调试环境对我们这些菜鸟来说是非常困难的,那如何才能让IIS支持 PHP呢?下面介绍一种方法,只需要简单几步就能在IIS中配置好PHP调试环境. 安装IIS组件 笔者以Windows XP系统的IIS5.1为例,首先必须安装IIS组件,系统默认是安装了的.如果你的系统中还没有,进入

WPF如何设置嵌入的资源图片为SplashScreen?

问题描述 图片相对路径:./resource/splash/001.png设置为"嵌入的资源"SplashScreenss=newSplashScreen("resource.splash.001.png");ss.Show(true);报错,找不到资源文件.....请问这个resourceName应该如何写?图片放到根目录也一样不行 解决方案 解决方案二:图片的生成操作属性设置为"resource"路径设置为"/Resources/n