您的位置 首页 硬件

APPWeb+PHP5+SQLite3在S3C6410上移植

我自己是移植Lighttpd+PHP+SQLite3的,由于忘了PHP怎么移植,所以就转别人的,免得以后再移植会忘记原作者:hwwr112100网址:http://blog.c…

我自己是移植Lighttpd+PHP+SQLite3的,因为忘了PHP怎样移植,所以就转他人的,以免今后再移植会忘掉

原作者:

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-fP%&&&&&% -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主页

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/yingjian/275833.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部