天天看点

嵌入式如何移植php,关于嵌入式web服务器的移植

目标:静态编译

版本:apache-1.3.39 + php-5.5.5

PC环境:ubuntu16

交叉编译工具链:arm-linux-gcc

首先可以参考:https://www.cnblogs.com/eoiioe/archive/2008/12/23/1360476.html,按照这样的思路进行。

一 . 编译apache

嵌入式如何移植php,关于嵌入式web服务器的移植

解压目录

1.本机编译。

进入到 pc/src目录下执行 ./Configure 命令,生成Makefile文件。

返回到 pc目录下,执行 ./configure命令,然后 make,这里不需要make install.

因为在交叉编译的时候,只需要用到主机编译的在 pc/src/main 目录下生成的两个可执行文件,分别为gen_test_char 和 gen_uri_delims。

2.交叉编译

配置自己的交叉编译工具链环境,在添加到/etc/profile后source一下,终端测试arm-linux-gcc -v,返回该交叉编译链的具体信息,再export CC=arm-linux-gcc即可(该shell命令可直接写在/etc/profile中,不用在终端输出了),然后步骤依然同上:

进入到 arm/src目录下执行 ./Configure 命令,生成Makefile文件。

返回到 arm目录下,执行 ./configure命令, 其配置选项如下:

#!/bin/sh

./configure \

--prefix=/mnt/nand1-2/apache \

--enable-module=most \

--enable-module=rewrite

嵌入式如何移植php,关于嵌入式web服务器的移植

TIM截图20190830194333.png

或者

/home/f/下载/Apache/arm/src/helpers/testfunc: 1: Syntax error: word unexpected (expecting ")")

/home/f/下载/Apache/arm/src/helpers/testfunc: 1: Syntax error: word unexpected (expecting ")")

/home/f/下载/Apache/arm/src/helpers/testfunc: 1: Syntax error: word unexpected (expecting ")")

/home/f/下载/Apache/arm/src/helpers/testfunc: 1: Syntax error: word unexpected (expecting ")")

/home/f/下载/Apache/arm/src/helpers/testfunc: 1: Syntax error: word unexpected (expecting ")")

这里将 pc/src/main/下的上面所说的两个可执行文件复制(也说覆盖)到arm/src/main/下,然后再进行make即可,若再次出现同样的错误,可再次进行同样的复制操作,再make。(注,make规则中如果依赖文件中任一个 文件的时间戳比目标文件新,则使用规则所定义的命令重建目标文件。)

在make过程中,可能有

嵌入式如何移植php,关于嵌入式web服务器的移植

TIM截图20190830200515.png

这里找到对应文件,注释掉相应选项再次make即可。

嵌入式如何移植php,关于嵌入式web服务器的移植

TIM截图20190830200742.png

嵌入式如何移植php,关于嵌入式web服务器的移植

TIM截图20190830200800.png

无需make install,进行第二步。

二 .交叉编译php

为实现静态编译,这里需要提前安装php所需要的静态库,这里我安装了5种静态库文件,分别使用了libxml2-2.9.2, openssl-1.0.2q, zlib-1.2.8, libiconv-1.14, pcre-7.8, 安装的路径可自定义,但尽量安装到一个主文件路径下,如默认的 /usr/local/ 。另外,由于php5以上版本默认支持sqlite选项,因此这里就不在配置了。

关于./configure配置选项我写在go.sh文件里面了,该文件内容如下,执行时给文件 chmod+x 即可。

#! /bin/sh

./configure \

--host=arm-linux \

--prefix=/mnt/nand1-2/php \

--enable-shared=no \

--disable-shared \

--with-apache=/home/f/下载/Apache/arm \

--enable-static=yes \

--enable-sockets \

--disable-all \

--enable-pdo \

--enable-json \

--disable-ipv6 \

--enable-sqlite-utf8 \

--with-libxml-dir=/usr/local/libxml2 \

--with-openssl-dir=/usr/local/openssl/include/openssl \

--with-zlib-dir=//home/f/downloads/NewPHP/zlib \

--with-iconv-dir=/home/f/downloads/NewPHP/libiconv \

--with-pcre-dir=/home/f/downloads/NewPHP/pcre

#--with-sqlite3=/usr/local/sqlite3\lib\libsqlite3.a \

#--with-pdo-sqlite \

#--enable-sqlite3 \

这里必须配置--with-apache,生成apache 所load的静态库文件,后面跟的路径就是上面apache解压编译所在的路径(arm文件夹路径)。

上述配置只是编译静态库文件 .a ,我们还需要生成静态可执行文件 statically linked

参考:http://ju.outofmemory.cn/entry/119804

这里在makefile中,更改:

-o 前面加上-all-static

make,该过程可能会出现下面错误

嵌入式如何移植php,关于嵌入式web服务器的移植

TIM截图20190830181533.png

这里只需要定位到文件,然后将这个预编译选项注释掉即可。make成功后,可以看到在文件夹下,php解压编译文件夹下libs文生成了libphp5.a文件和libphp5.la文件,而且在对应的apache解压编译文件夹arm下的src/modules/php5页生成了相应的文件,我们第三步的activate路径就是从这取。

make install ,可以看到安装目录/mnt/nand1-2/php下面有bin文件夹有php、php-cgi文件,有

嵌入式如何移植php,关于嵌入式web服务器的移植

TIM截图20190830191713.png

成功编译静态库和静态可执行文件。当然这两个静态可执行文件内存有点大,用arm-linux-strip一下即可。

6.复制编译目录下的php.oni-development到安装目录/mnt/nand1-2/php/lib下,并改名php.ini。

三 .再次编译apache,跟第一步动作类似。

但是:

当再次在arm文件夹下进行./configure配置,有

#!/bin/sh

./configure \

--prefix=/mnt/nand1-2/apache \

--activate-module=src/modules/php5/libmodphp5.a

--enable-module=most \

--enable-module=rewrite

2.上面一步是添加php配置选项,以及表示静态编译的方式,链接现有的静态库文件,以后不加载任何动态模块,而这一步需要进行生成apache静态可执行文件的设置。

在arm/src文件夹下的Makefile中,下面图中在 -o 符号之前添加 -static 选项

嵌入式如何移植php,关于嵌入式web服务器的移植

TIM截图20190830201924.png

在arm/src/support文件夹下的Makefile中,下面图中在 -o 符号之前添加 -static 选项

嵌入式如何移植php,关于嵌入式web服务器的移植

TIM截图20190830201635.png

3.如果跟第一步报同样的错,按第一步的规则处理,在arm文件夹下执行make,然后make install安装。

四 .此时在/mnt/nand1-2/文件夹下已经有两个最终安装后的apache和php文件夹。在将两者复制到开发板同样的位置,并使用,还得配置http.conf文件。

# 首先是基本的配置

Listen 0.0.0.0:80

Port 80

User nobody

Group nogroup

ServerName localhost

#然后

#205行

# Note: The order in which modules are loaded is important. Don't change

# the order below without expert advice.

# Example:

# LoadModule foo_module libexec/mod_foo.so

####这里不需要动态加载php动态库文件,因为我们需要静态编译

####即无需LoadModule php5_module modules/libphp5.so

# ExtendedStatus controls whether Apache will generate "full" status

#364行

DirectoryIndex index.html

DirectoryIndex index.php

DirectoryIndex index.php3

DirectoryIndex index.phtml

#763行

#

AddType application/x-tar .tgz

AddType application/x-httpd-php .php

AddType application/x-httpd-php .php3

AddType application/x-httpd-php .php5

AddType application/x-httpd-php .phtml

#

# AddEncoding allows you to have certain browsers uncompress

# information on the fly. Note: Not all browsers support this.

# Despite the name similarity, the following Add* directives have nothing

# to do with the FancyIndexing customization directives above.

#

AddEncoding x-compress .Z

AddEncoding x-gzip .gz .tgz

Action application/x-httpd-php "/php5/php-cgi"

由于apache拒绝使用root用户运行,所以需要增加一个用户和用户组,这里使用默认的用户名和用户组名,nobody和nogroup。

建立文件passwd代替开发板上的/etc/passwd

root::0:0:root:/:/bin/sh

nobody::65534:65533:nobody:/:/bin/sh

建立文件group代替开发板上的/etc/group

nobody::65533:

nogroup::65534:nobody

root:x:0:root

users::100:

五. 启动开发板,在终端有

mnt/nand1-2/apache/bin/apachectl start

则开发板上的apache服务已启动,下面即可以在主机通过ip访问嵌入式web了。