新闻中心

EEPW首页>嵌入式系统>设计应用> APPWeb+PHP5+SQLite3在S3C6410上移植

APPWeb+PHP5+SQLite3在S3C6410上移植

作者: 时间:2016-11-10 来源:网络 收藏
我自己是移植Lighttpd+PHP+SQLite3的,由于忘了PHP怎么移植,所以就转别人的,免得以后再移植会忘记

原作者:

本文引用地址://m.amcfsurvey.com/article/201611/317295.htm

hwwr112100

网址:http://blog.csdn.net/hwwr112100/article/details/8249294

相关支持库移植

主要包括libiconv、zlib以及加密服务组件matrixssll。

下载Embedthis提供的第三方工具包,采用git从GitHub获取packages软件包,命令如下。

gitclone http://github.com/embedthis/packages

如果下载失败,可以在直接在https://github.com/embedthis/packages中选择下载ZIP包,内容包括:


其中,libiconv-1.11、zlib和matrixssl中的matrixssl1-8-8-open被本次移植采用,php目录中的PHP版本较高,并且默认目标平台为Linux和Windows平台,不支持交叉编译,编译时会出现诸多问题,本次移植并未采用。

1编译libiconv

libiconv库是编译xmlrpc必须的支持库,选择libiconv-1.11,注意:最新版iocnv,编译时会可能会出现诸多问题,这里不建议采用。

首先设置CC、AR等环境变量的路径(假设arm-linux-gcc工具安装在/usr/local/arm/4.2.2-eabi/目录下),具体设置如下所示。

export CC=/usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-gcc

export AR=/usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-ar

export LD=/usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-ld

export RANLIB=/usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-ranlib

export STRIP=/usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-strip

export CC_FOR_BUILD=gcc

配置:

./configure --build=arm-linux --host=i686-linux --prefix=/usr/local/iconvarm

配置完成后,编译安装:

make

make install

--prefix参数指定libconv库安装的位置,在编译PHP时需要引用该位置。

2编译libz.so

zlib是PHP必须的支持库,这里采用的版本为zlib-1.2.6。注意:CC、AR等环境变量选择为arm-linux-xx。

./configure --prefix=/usr/local/zlib

配置成功之后,编译:

make clean

make

--prefix参数指定libz库安装的位置,编译PHP时,加入--with-zlib-dir=/usr/local/zlib编译参数。

3编译libxml2.so

源码包版本为libxml2-2.7.4,libxml2库同样是PHP所必须的支持库。

./configure --build=arm-linux --host=i686-linux --disable-ipv6 --prefix=/usr/local/libxmlarm

配置成功之后,编译安装:

make

make install

编译PHP

当上述支持库编译完成之后,进行PHP编译。注意:上述编译得到的*.so文件格式必须为如下形式:

libz.so.1.2.6: ELF32-bit LSB shared object,ARM, version 1 (SYSV), dynamically linked, not stripped

另外,正常编译得到的库文件包含调试信息,可以使用arm-linux-strip工具去除不必要的调试信息,以减小文件体积。

PHP采用的版本为PHP-5.2.17(PHP-5.3.8会出问题,如无法正常运行,服务器自动重启,建议采用此版本)。

PHP配置参数如下:

./configure --target=arm --host=arm-linux --disable-debug --disable-rpath --disable-cli--enable-bcmath --enable-calendar --disable-maintainer-zts--enable-embed=shared --enable-ftp--enable-inline-optimization --enable-magic-quotes --enable-safe-mode --enable-sockets --enable-wddx --sysconfdir=/etc/appweb--with-pic --with-exec-dir=/etc/appweb/exec--with-regex=system --with-pear --with-xmlrpc --with-zlib-dir=/usr/local/zlib --with-libxml-dir=/usr/local/libxmlarm --with-iconv-dir=/usr/local/iconvarm/

注意:在使能多线程模式,即附带参数--enable-maintainer-zts编译时,报错信息如下:

上述错误可以通过修改configure文件解决,修改内容如下:

将{ echo "configure: error: Your system seems to lack POSIXthreads." 1>&2; exit 1; }
替换为:

{ echo"configure: error: Your system seems to lack POSIX threads."1>&2; }#exit 1; }

在多线程与单线程模式下,PHP脚本运行性能对比(由雅黑PHP探针测得数据),如下表所示。

表2 PHP性能对比

性能参数

单线程模型

ARM11 667MHz

多线程模型

ARM11 667MHz

美国 IXwebhosting.com

4 x Xeon E5530 @ 2.40GHz

整数运算能力检测
(1+1运算300万次)

7.439s

15.547s

0.535s

浮点运算能力检测
(圆周率开平方300万次)

42.599s

无法测出

1.607s

数据I/O能力检测
(读取10K文件1万次)

0.961

11.112s

0.058s

通过上述对比分析,在单线程模式下系统性能好于多线程模式,所以本移植中PHP配置为单线程模式,另外AppWeb也需要禁用多线程模式。

配置完成之后,需要检查生成的Makefile文件,确保CC和CPP等环境变量指向交叉编译链,即arm-linux-xx,以及相关库文件和头文件的路径是否正确,正确配置信息如下图所示:

配置成功之后,系统提示如下信息:

编译安装:

make clean

make

make install

编译时如果出现如下错误,表示编译PHP的工具链并不是arm-linux-gcc而是gcc,所以需要重新设置CC、AR等环境变量指向arm-linux-xx交叉工具链。

编译成功,系统提示信息如下:

注意:编译完成后不可执行make test,因为PHP编译的目标为网关(ARM平台),所以运行时会报错。直接运行makeinstall进行安装即可。

安装完成后,在libs/目录下生成libphp5.so动态库文件,使用file命令查看文件信息,如下所示:

在未使用strip工具去除调试信息之前,本次编译的库文件大小为12.5M,执行arm-linux-strip得到的库文件大小仅为3.8M。

编译PHP加速器eAccelerator

eAccelerator是一款开源PHP加速器,优化动态内容缓存,提高php脚本的缓存性能,使PHP脚本在编译的状态下,对服务器的开销几乎完全消除;另外,可以实现脚本优化,加快脚本执行速率,最终使PHP程序代码执行效率提高1至10倍。

eAccelerator-0.9.5版本支持PHP进行交叉编译,但是该版本不支持动态模块加载方式,只能将eaccelerator编译进libphp5.so动态库中。

将解压得到的eaccelerator-0.9.5目录重命名为eaccelerator,并复制到php-5.2.17/ext目录下,进入该目录,使用phpize工具生成configure文件,phpize是安装PHP时自动生成的工具,默认安装于/usr/local/bin目录下。

/usr/local/bin/phpize

执行成功后,系统提示信息如下:

将php-5.2.17/目录下的configure文件删除,使用buildconfig工具重新生成包含eaccelerator编译选项的configure文件。首先,系统必须安装了autoconf-2.13工具,若未安装,可以通过apt-get工具自动安装。执行下述命令:

apt-getinstall autoconf-2.13

rm configure

./buildconf --force

生成的configure文件包含了eaccelerator的配置语句--enable-eaccelerator。

重新执行PHP配置命令,并在最后加上--enable-eaccelerator参数。执行make时将出现如下错误:

该错误可通过下述方法进行修改:

修改eaccelerator目录下mm.c文件,在文件开始处加入如下语句:

#defineMM_SEM_IPC 1

#defineMM_SHM_IPC 1

设置完成后,重新编译安装eAccelerator,问题解决。

要使PHP能够运行eAccelerator,首先,需要修改php.ini配置文件,并加入eaccelerator的配置信息,在该文件最后添加如下语句:

extension= eaccelerator.so

;eAccelerator

eaccelerator.shm_size= "16"

eaccelerator.cache_dir= "/tmp/eaccelerator"

eaccelerator.enable= "1"

eaccelerator.optimizer= "1"

eaccelerator.check_mtime= "1"

eaccelerator.debug= "0"

eaccelerator.filter= ""

eaccelerator.shm_max= "0"

eaccelerator.shm_ttl= "0"

eaccelerator.prune_period= "0"

eaccelerator.shm_only= "0"

eaccelerator.compress= "1"

eaccelerator.compress_level= "9"

最后,在网关/tmp/目录下创建用于存放eAccelerator缓存文件的目录eaccelerator,并修改该目录权限为777。

4PHP外部C扩展

使用PHP的外部C扩展将实现与外部库(C库)的交互,另外,可以改善PHP脚本执行效率的问题。通常采用以下3种方式实现C扩展:

l Built-in Modules编译进PHP

好处: (1)不需要动态加载,模块在php脚本里面可以直接使用.

(2)不需要将模块编译成.so共享库,因为直接编译进PHP。

缺点: (1)对模块的改变都需要重新编译PHP

(2)因为编译进PHP,所以PHP二进制文件较大,而且多占点内存

l External Modules外部模块,也就是编译成共享库,用dl()函数动态加载。

好处:(1)不需要重新编译 PHP

(2)PHP体积小,因为不需要编译进PHP

缺点:(1)每次*.php脚本执行都需要用 dl()去加载,效率较低

(2)每次都要调用dl()

l The Zend EngineZend 核心里实现

下面介绍第一种C扩展方式Built-in Modules。

创建C扩展框架

PHP本身提供一个创建扩展框架的工具ext_skel,该工具会生成PHP扩展必须的基本代码,位于PHP源码的ext/目录下。创建一个名为test的扩展库,完成之后,将会生成config.m4、test.c、php_test.h等文件。

cd/home/username/share/php-5.2.17/ext/

./ext_skel--extname=test

cdtest

修改扩展库

修改config.m4文件,该文件是一个宏解释工具,将输入文件中的宏展开到输出文件,是PHP扩展框架所必须的,用来生成扩展所需的makefile文件。

将源码文件中的如下代码:

dnlPHP_ARG_ENABLE(test, whether to enable test support,

dnl Make sure that the comment is aligned:

dnl [--enable-test Enabletest support])

替换为(dnl在m4文件中起注释作用,即取消上述代码注释)

PHP_ARG_ENABLE(test, whether to enable testsupport,

Make sure that the comment is aligned:

[--enable-test Enabletest support])

注意:不要使用PHP_ARG_WITH,可能会出现问题(提示C函数未定义)

修改php_test.h文件,在PHP_FUNCTION(confirm_mysqlc_compiled);语句下追加下述语句:(PHP_FUNCTION是一个Zend Macro,作用是声明一个C函数,使它在PHP脚本中可用,参数是函数的名字)

PHP_FUNCTION(test);

修改test.c文件,该文件为主程序文件,包含了C代码实现。首先,在zend_function_entrytest_functions函数中增加如下语句:

PHP_FE(test,NULL)

在文件最后,增加函数实现:

PHP_FUNCTION(test){

long int a, b;

long int result;

if (zend_parse_parameters(ZEND_NUM_ARGS()TSRMLS_CC, "ll", &a, &b) == FAILURE) {

return;

}

result = hello_add(a, b);

RETURN_LONG(result);

}

test就是在PHP脚本中调用的函数名(不需与扩展库名相同),hello_add函数包含在动态库hello.so(需事先准备好)中,Linux下打包.so文件的GCC命令如下:

arm-linux-gcc-fPIC -O -c -o test.o test.c

arm-linux-gcc-shared -o libtest.so test.o

注意:需将生成的动态库置于交叉编译器的Lib目录下,或者放置于当前目录。zend_parse_parameters的功能是从PHP脚本向该函数传递参数(类似于scanf函数),符号“ll”说明参数的数据类型。

重新编译PHP

使用buildconf工具重新生成configure文件,实现包含--enable-test参数选项。

注意:由于使用了外部.so动态库,在执行./configure后,需要修改生成的Makefile文件,在EXTRA_LIBS中增加-ltest选项。

编译完成后,将libs/目录下的libphp5.so(使用strip工具瘦身)拷贝到网关WEB服务器配置目录下的lib子目录中。

最后,必须重新启动AppWeb服务器,使PHP内核加载自定义的扩展库。可以编写一个PHP脚本测试是否调用成功。

echo test(3,9);

?>

数据库SQLite3移植

PHP5.2.27内部SQLite版本为v2,为了获得更多功能支持,采用外部SQLite3版本sqlite3.7.11(通过PDO方式访问)。

1编译SQLite3

首先,在源码目录下建立build/目录,并进入

usrname@ubuntu:~/sqlite3.7.11/sqlite3.6.1/$mkdirbuild

usename@ubuntu:~/sqlite3.7.11/sqlite3.7.11/$cdbuild

usename@ubuntu:~/sqlite3.7.11/ sqlite3.7.11/build/$ ../configure --host=arm-linux--prefix=$(pwd) --disable-tcl

usrname@ubuntu:~/sqlite3.7.11/ sqlite3.7.11/build/$make

usename@ubuntu:~/sqlite3.7.11/ sqlite3.7.11/build/$make install

使用strip工具去除动态库中的调试信息

usename@ubuntu:~/sqlite3.7.11/ sqlite3.7.11/build/$cd lib

usename@ubuntu:~/sqlite3.7.11/ sqlite3.7.11/build/lib/$ arm-linux-strip libsqlite3.so.0.8.6

2 拷贝文件至网关

将lib目录下的文件拷贝到网关/usr/lib目录中,并将/bin目录下的sqlite3拷贝至网关的/usr/bin目录下。

在网关运行sqlite3

[root@urbetter/]# ./usr/bin/sqlite3

正确运行结果如下所示:

3 应用程序编译

应用程序中使用sqlite接口时,首先必须包含相应的头文件“sqlite3.h”,另外,在编译应用程序时必须在编译参数中加入sqlite动态库的路径,如下所示。

$arm-linux-gcc -o test test.c -L/home/username/temp/ sqlite3.7.11/

sqlite3.7.11/build/lib-I/home/hwwr/ sqlite-3.7.11

sqlite3.7.11/build/include-Wall

另外,可以将动态库文件放入到所使用的交叉编译链的路径中:

$ sudocp -rP sqlite3.7.11/build/lib/libsqlite3.* /usr/local/

arm/4.2.2-eabi/lib/

$ sudocp sqlite3.7.11/build/include/* /usr/local/arm/4.2.2-eabi/

include/

完成上述配置后,编译应用程序时可使用如下编译参数。

$arm-linux-gcc -o test test.c -lsqlite3 –I/ usr/local/arm/4.2.2-eabi/include

4在PHP中添加sqlite3支持

编译安装完SQLite,将在build目录下生成相关的头文件以及库文件,所以,可以在编译PHP时加入SQLite的路径。使用PDO方式访问sqlite数据库,并且使sqlite采用UTF-8编码方式,具体配置参数如下所示。

--with-sqlite=shared

--enable-sqlite-utf8

--with-pdo-sqlite=/home/hwwr/share/sqlite-3.7.11/

AppWeb服务器移植

AppWeb是一个开源的,针对安全性要求较高的HTTP Web服务器。其主要特点有:

l很小的内存消耗,快速响应,每秒可以处理超过50个页面请求。

l支持CGI;支持动态WEB页面,如PHP页面;支持嵌入式的JavaScript;支持安全的通信,如SSL(OpenSSL或MatrixSSL)

l支持单线程和多线程运行模式。

1 修改配置参数

Appweb采用稳定版本appweb-src-3.3.2(4.0版本编译时可能会出现问题)。AppWeb的配置参数如下:

./configure--host=arm-s3c6410-linux --build=i686-pc-linux --port=80 --type=RELEASE--disable-multi-thread --disable-access-log --disable-test --with-cgi=builtin --with-copy=builtin --with-auth=builtin--with-esp=builtin --with-upload=builtin --webDir=/www --with-ejs=builtin--with-php=/home/hwwr/share/php-5.2.17/--with-matrixssl=/home/hwwr/share/ssl/matrixssl/matrixssl-1-8-8-open/--sysconfdir=/WebServer --prefix=/WebServer

注意:由于PHP被编译为单线程模式,所以AppWeb必须禁用多线程模式,即加入配置参数--disable-multi-thread。

以上配置产生用于编译的Makefile文件,并生成相关服务程序、动态库以及模块;如果只需要静态文件则可加入--disable-shared --enable-static,编译后生成的服务程序较大,只生成静态库,没有模块,所以推荐生成动态版本。

选项--webDir用于指定网站的存放位置,webDir默认值为/var/www/appweb-default。通过上述配置,服务器的网站根目录为/www,默认http端口号为80。

选项--sysconfdir用于设置配置文件的安装位置,--prefix指定AppWeb可执行文件和相关库的安装位置。另外,AppWeb可执行文件被复制到/etc/init.d目录下。

2编译AppWeb

Configure执行成功后,生成Makefile文件,此时直接在终端运行make命令进行编译,编译完成之后,将在appweb-3.3.2目录下的bin、lib、modules子目录中生成arm-s3c6410-linux文件夹,该目录中包含生成的可执行文件、库文件及模块。

执行make install命令进行安装,安装完成,将生成/WebServer/appweb配置文件夹、/WebServer /lib/appweb脚本文件,更多文件信息可参考/WebServer /lib/appweb目录下的fileList.txt文件。

3将AppWeb移植至网关

将生成的WebServer目录复制到网关根目录下,打开/ WebServer /appweb中的配置文件appweb.conf,并确认如下信息是否正确。

Listen80

DocumentRoot"/www"

DirectoryIndexindex.html

LoadModulePath"/ WebServer /lib/appweb/modules"

以上信息与编译时的配置参数相关,参数DirectoryIndex用于设置默认起始页。

将主机/etc/init.d/appweb目录复制到网关/etc/init.d目录下。

4配置AppWeb

首先,注销(删除)配置文件/WebServer /appweb/appweb.conf中Groupnogroup语句,否则运行时将报错。

配置matrixssl加密服务支持。修改/WebServer /appweb/appweb.conf文件,在Include conf/modules/*语句之后(对模块的定义必须在该标记之后)增加如下语句:

Listen 443 # SSL - dont remove comment

LoadModule sslModule mod_ssl

rtualHost *:443>

DocumentRoot "/www"

SSLEngine on

# SSLCipherSuiteALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL

# SSLCipherSuite HIGH:RC4+SHA

# Use an RC4-SHA cipher to mitigate theBEAST attack

SSLCipherSuite HIGH:RC4+SHA

SSLProtocol ALL -SSLV2

SSLCertificateFile "/ WebServer/appweb/ssl/server.crt"

SSLCertificateKeyFile "/ WebServer/appweb/ssl/server.key.pem"

设置https监听443端口(即浏览器默认安全端口),SSL证书位于/WebServer /appweb/ssl目录下,注意:该证书已经过期,所在使用https访问时,出现如下安全提示:

选择“继续浏览网站”忽略该提示即可。

配置error log(日志消息),在调试期间,配置appweb应允许记录系统运行日志,如需取消则在./configure时加入--disable-log配置参数。

修改/WebServer/appweb/conf目录下的log.conf文件,配置如下:

ErrorLog“/log/appweb/error.log”

LogLevel4

即配置日志保存于/log/appweb下的error.log文件,所以必须在网关根目录下创建/log/appweb/error.log文件。

配置doc(在线文档),在开发阶段可以使用此功能。修改/ WebServer /appweb/conf目录下的doc.conf文件,配置如下:

Alias /doc/ "$DOCUMENT_ROOT/doc/"

将doc目录定位于网站根目录下。

配置CGI,修改/WebServer/appweb/conf/modules目录下的cgi.conf文件,配置如下:

LoadModulecgiHandler mod_cgi

AddHandlercgiHandler .exe .cgi .cgi-nph .out .bat .cmd .pl .py

ScriptAlias/cgi-bin/ "$DOCUMENT_ROOT/cgi-bin"

配置完成之后运行Appweb服务器:

/etc/init.d/appwebstart

通过浏览器访问网关WEB服务器,页面如下图所示。

图6 AppWeb主页



评论


技术专区

关闭