我自己是移植Lighttpd+PHP+SQLite3的,因为忘了PHP怎样移植,所以就转他人的,以免今后再移植会忘掉
原作者:
hwwr112100
相关支撑库移植
首要包括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 |
整数运算才能检测 |
7.439s |
15.547s |
0.535s |
浮点运算才能检测 |
42.599s |
无法测出 |
1.607s |
数据I/O才能检测 |
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
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主页