天嵌 ARM开发社区

 找回密码
 注册
查看: 4088|回复: 0

apache+php+mysql的嵌入式移植----1

[复制链接]
流浪记 发表于 2013-8-26 16:08:31 | 显示全部楼层 |阅读模式
本帖最后由 流浪记 于 2013-8-27 12:56 编辑

经过了接近两个星期的研究,查阅了太多资料,编译的过程中出了很多问题,不断的在网络上搜寻答案。网上的编译移植版本有的有好几种,有的甚至没有,就这样不断的尝试,不断的失败,不断的从头开始,终于成功移植。

开发板:天嵌科技 TQ3358
编译器:arm-linux-gcc 4.4.6版本
平台:ubuntu 11.10 amd64
嵌入式服务器的移植包括apache ,php ,mysql。这里我们用的版本分别是apache-2.2.20(httpd-2.2.20),php-5.3.6 ,mysql-5.1.69。

Apache-2.2.20的嵌入式移植
首先得说下,我之前移植的是apache-1.3.39,由于程序代码用的是2.2.20,所以移植进去之后有很多bug,后来又改成apache-2.2.20。这两个版本的移植方法稍微有些不同,不过也是大同小异。我之前找的一个移植版本说要先移植apr,pcre几个库,后来我又找了一种方法也就是下面的方法则不需要。
编译apache要编译两个版本,一个是基于PC的,一个是基于ARM的。首先将apache-2.2.20.tar.gz解压,目录可以自己选择,我这里分别解压到了两个目录,
Home/jason/PC/apache-2.2.20 和/home/jason/arm/apache-2.2.20.
先编译本机代码  
  #Cd  Home/jason/PC/apache-2.2.20
# ./configure
# make  这里不需要make install,我们只是在编译基于ARM版的时候要用到这里的make后的几个文件。
编译基于arm的代码
这里有一点要特别注意,有的情况下我们需要apache运行在root下,比如如果php扩展了sockets功能,用到socket的相关函数,由于这类socket需要root权限,所以要让apache运行在root权限下。
那么要让apache运行在root下要做的就是:
   在apache源码包的include/http_config.h文件里面,在文件的最开始添加下面几句:#ifndef BIG_SECURITY_HOLE         #define BIG_SECURITY_HOLE         #endif
   然后再做下面的工作。最后记得做的就是讲apache的配置文件httpd.conf里面的user跟group选项都改成root,这样apache就可以以root权限运行了。

#Cd  Home/jason/arm/apache-2.2.20
#CC=arm-linux-gcc  ./configure  --host=arm-linux  --prefix=/usr/local/apache  --enable-so  --with-mpm=worker  ac_cv_file__dev_zero=yes  ac_cv_func_setpgrp_void=yes apr_cv_process_shared_works=yes  apr_cv_mutex_robust_shared=yes  apr_cv_tcp_nodelay_with_cork=yes  ap_cv_void_ptr_lt_long=no
# make  make的过程中出了一些错误,按照下面的方法解决即可
  7.1 error:redefinition of 'struct iovec'
      解决方法:在 srclib/apr/include/apr_want.h中,注掉struct iovec { ...}这个结构体
  7.2 error  ./dftables: cannot execute binary file
      解决方法:因为交叉编译出的文件不能在编译的主机上运行,所以将编译的本地版本 的/src/lib/pcre/dftables文件拷贝过来,覆盖掉原来的。
  7.3 error :./gen_test_char :cannot execute binary file
      解决方法:将本地编译生成的这个文件拷贝过来,覆盖掉原来的。
#  make install

将/usr/local/目录下的apache文件夹复制到开发板的相同目录下,即/usr/local/下。不过我这里复制的时候出了些问题,有些库没有复制进去,开启httpd服务的时候根据错误提示又把这些库复制进去了。其实是电脑上的/usr/local/apache/lib里面有些库没有复制到开发板里面,只要单独将那些没有复制出来的库复制到开发板里面相同的目录下,也行。
由于apache拒绝使用root用户运行,所以要增加一个用户和用户组,具体做法就是在开发板的linux文件系统的/etc/目录中建立两个文件passwd,group。
passwd文件的内容如下:
root::0:0:root:/:/bin/sh
nobody::65534:65533:nobody:/:/bin/sh

group文件的内容如下:
nobody::65533
nogroup::65534:nobody
root::0:
users::100
修改配置文件httpd.conf(这里只标出需要修改的地方)
User nobody
Group nobody
DirectoryIndex  index.html
DirectoryIndex  index.php
DirectoryIndex  index.php3
DirectoryIndex  index.phtml
ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/"
ScriptAlias /php5/ "/usr/local/php/bin/"
AddType application/x-tar .tgz    AddType application/x-httpd-php .php3   
AddType application/x-httpd-php .php   
AddType application/x-httpd-php .phtml   
AddEncoding x-compress .Z   
AddEncoding x-gzip .gz .tgz
</IfModule>
Action application/x-httpd-php "/php5/php-cgi"
还有ServerName前面的’#’去掉,否则启动httpd服务的时候会报错。
到此,apache终于移植成功!Happy有木有!!!
./htttpd启动apache的时候可能会出这样一个错误:
Forbidden
you don't have the permission to access /php5/php-cgi/index.php on this server
解决方法:请修改apache的httpd.conf文件,把原来:
<Directory />   
Options FollowSymLinks   
AllowOverride None   
Order deny,allow   
Deny from all   
Satisfy all
</Directory>
改为如下:
<Directory />   
Options FollowSymLinks   
AllowOverride None   
### Order deny,allow   
### Deny from all   
### Satisfy all
/Directory>
把PHP下面的php.ini下的:short_open_tag=off;修改成on重启apache,问题解决了

Php-5.3.6的嵌入式移植
我最开始移植的是php-4.4.8版本的,移植这个版本不需要zlib,libxml以及其他的库。可以直接编译。不过后来因为这个版本太低,所以改成5.3.6版本的,但是这个版本编译的时候就要用到很多库zlib-1.2.7,libxml2-2.7.2,gettext,png,gd ,jpeg,freetype,fontconfig。当然不一定每个都要,反正我在电脑上都安装了。但是其实这些库应该是不需要单独安装的,php本身包含了很多扩展库,就是源代码里面已经包含了这些库了,我们在编译php即./configure的时候只要加上所要用到的库的扩展就行了,如--with-png这种。你可以先不安装下面这些库,但是zlib和libxml2是必须要安装的。
安装gettext
# CC=arm-linux-gcc  ./configure  --host=arm-linux  --enable-shared
#  make
#  make install

安装png
# CC=arm-linux-gcc  ./configure  --host=arm-linux  --enable-shared
#  make
#  make install

安装jpeg
# CC=arm-linux-gcc  ./configure  --host=arm-linux  --enable-shared
#  make
#  make install

安装 freetype
# CC=arm-linux-gcc  ./configure  --host=arm-linux  --enable-shared
#  make
#  make install


安装fontconfig
# CC=arm-linux-gcc  ./configure  --host=arm-linux  --enable-shared
#  make
#  make install

安装gd
# CC=arm-linux-gcc  ./configure  --host=arm-linux  --enable-shared  --with-png  --with-freetype --with-jpeg  --with-fontconfig(由于这些库我都是用的默认的安装路径,所以这里没有指定路径,如果安装这些库的时候指定了路径,则可以用--with-png=/usr/local/png这种方式指定路径)
#  make
#  make install
以上这些库你可以先不安装。但是下面两个库必须安装。
安装zlib-1.2.7
解压进入目录
#cd  /zlib-1.2.7
#  CC=arm-linux-gcc  ./configure  --host=arm-linux  --enable-shared (我用的默认安装目录,所以没有配置prefix)
# make
# make  install
安装Libxml2
这里我编译的时候有个问题,我不知道别的朋友在这里有没有出现这个问题。就是编译php本机代码和arm代码的时候都要用到libxml2,之前我安装libxml2的时候用了CC=arm-linux-gcc,编译本机php的时候用的gcc编译器结果说libxml库没有在工作,原来是gcc编译器不认得由arm-linux-gcc编译出的libxml2,错误如下:
   checking for xml2-config path... /usr/local/libxml/bin/xml2-config
checking whether libxml build works... no
configure: error: build test failed.  Please check the config.log for details.

所以我又将libxml2重新安装了一次,这次没有用arm-linux-gcc编译安装libxml2.
不用arm-linux-gcc安装libxml2
# cd  /libxml2-2.7.2
# ./configure
# make
# make install

安装php
将php-5.3.6.tar.gz分别解压到两个目录,你可以自己选择目录,我这里是分别解压到/home/jason/PC/php-5.3.6和 /home/jason/arm/php-5.3.6
先编译本机代码(此时libxml2没有用arm-linux-gcc编译安装)
  #cd  /home/jason/PC/php-5.3.6
#  ./configure
#  make   这里不需要make install
编译基于arm的代码之前要先用CC=arm-linux-gcc重新安装一次libxml2,否则出错。当然这安装了两次libxml2其实是我自己想出的笨办法。
# Cd  /home/jason/arm/php-5.3.6
# CC=arm-linux-gcc ./configure --host=arm-linux --prefix=/usr/local/php --enable-pdo  --with-zlib  --with-libxml  --with-gd  --with-freetype  --with-jpeg --with-png --enable-mbstring  --with-mysql=/usr/local/mysql/  --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-gd-native-ttf   --with-gettext=/usr/local/gettext/   --enable-magic-quotes--enable-sockets  --with-zlib  --without-iconv (with貌似就是加上php的这个扩展库)
#make
Make的时候会出错:
generating phar.php
/home/jason........./sapi/cli/php:1:Syntax error:word unexpected (expecting “)”)
或者
Generating phai.phai
/home/jason/........./sapi/cli/php:1;syntax  error:word unexpected (e
xpecting “)”)
这是因为/sapi/cli/php这个可执行文件是基于ARM的,在PC机上无法运行,所以我将基于PC平台下编译的/sapi/cli/php拷贝到基于ARM的这个地方,当然先得将这里原来的备份改名成php-back,后面这个php-back还会用到的。这样make就不会报错了。
# make install
将php-back文件拷贝到/usr/local/php/bin下改名为php覆盖原来的php,并拷贝php.ini-development文件拷贝到/usr/local/php/lib下并改名为php.ini。
将php文件夹拷贝到开发板相同目录下。
由于字数限制,mysql的移植请参考wo xie de 另一篇文章


















  

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-4-26 01:11 , Processed in 1.031250 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表