在ARM Linux上使用Apache+PHP

发布者:技术掌门最新更新时间:2016-06-20 来源: eefocus关键字:ARM  Linux  Apache+PHP 手机看文章 扫描二维码
随时随地手机看文章
相信这篇文章同样是国内很难搜到的一个HOWTO(,截至到我写出来之前),我的最初目的是在ARM上使用PHP,尝试了Busybox的httpd,以及boa都没有办法很方便的和PHP接口,因此我狠下心来,编译了Apache。在ARM上使用PHP,好处仅仅是脚本比cgi好写一些,付出的代价是速度和蜗牛一样慢,不要指望很多人同时访问可以响应得过来。
另外说件事,BLOG上的文章多了,经常发现有人转载,但是有的人却不注出处……难道要我吧我的名字和邮件地址写到文章的每一个部分吗?也许国人就是这样缺乏某种精神,在我看到的转载我文章的BLOG中,基本都是网上各种ARM Linux文章的集合,不可否认他们搜集的很好,但是看了这么多文章,连一点心得体会都没有么,写点原创的东西就这么难么?不管怎样,我还是坚持EE小站的风格——原创性。下面开始正题,本文分为三大部分,apache、php和配置。

编译apache
下载apache 1.3.39(1.3.41有些bug,没有办法交叉编译)
下载地址http://apache.mirror.phpchina.com/httpd/apache_1.3.39.tar.bz2


交叉编译apache总体上需要两个步骤:
1.编译本机代码
2.利用本机代码进行交叉编译

这是因为编译apache时,需要使用编译生成的工具制作后续编译使用的头文件,交叉编译的工具当然没有办法在PC上运行,因此,需要借用本机编译生成的工具。假设为本机编译的apache代码已经解压缩到/home/lxz/apache-1.3.39-i586,为ARM编译的apache代码已经解压缩到/home/lxz/apache-1.3.39,交叉编译器arm-linux-gcc已设缺省路径,具体步骤还是用命令来说明:

# cd /home/lxz/apache-1.3.39-i586
# ./configure

因为仅仅是借用下本机代码,所以不用设置配置参数,然后编译

# make

等编译完成后,就可以配置交叉编译的apache了。apache的安装位置为/usr/local/apache

# cd /home/lxz/apache-1.3.39
# CC=arm-linux-gcc ./configure --prefix=/usr/local/apache

会出来这样的提示,因为交叉编译的生成的testfunc这个工具不能在PC上执行,但可以不理会它
./helpers/TestCompile: line 294: /home/lxz/apache-1.3.39/src/helpers/testfunc: cannot execute binary file
打开/home/lxz/apache-1.3.39/src/main/Makefile这个文件,找到这两段代码
uri_delims.h: gen_uri_delims
./gen_uri_delims >uri_delims.h
test_char.h: gen_test_char
./gen_test_char >test_char.h
修改为
uri_delims.h: gen_uri_delims
/home/lxz/apache-1.3.39-i586/src/main/gen_uri_delims >uri_delims.h
test_char.h: gen_test_char
/home/lxz/apache-1.3.39-i586/src/main/gen_test_char >test_char.h
这里借用了刚才编译生成的本机代码里的工具,然后

# make

这就编译好了,下面是安装。由于配置apache的时候“prefix”参数指定的安装位置是/usr/local/apache,在PC上,访问/usr/local是需要有root权限的,需要切换到root用户来进行安装。不建议将apache安装到一个随意的目录然后拷贝,因为这样会造成apache中的脚本调用位置的错误。当然,如果想要将apache安装到一个PC和ARM Linux都能访问的固定位置,如/home/lxz/apache也可以。
如果你不明白上面这段话在说什么,那么请按照下面的步骤进行操作。请确认你的PC Linux上的/usr/local/apache这个目录不存在PC上使用的apache,否则下面的步骤会使你PC Linux上的apache不可用。

# su root

输入密码

# cd /home/lxz/apache-1.3.39/
# make install
# exit

别忘了用exit退出root用户模式,这样,apache的文件就被安装到PC上的/usr/local/apache了。接下来所要做的是将apache拷贝到ARM Linux根文件系统,假设ARM Linux根文件系统在PC上的位置为/home/lxz/root,其中已经有/usr/local这个目录

# cp -r /usr/local/apache /home/lxz/root/usr/local

如果是一路看着我的BLOG建立起根文件系统的,接下来还必须建立nobody用户和nogroup组,因为apache拒绝使用root用户运行。具体来说就是在ARM Linux根文件系统上建立/etc/passwd和/etc/group两个文件,怎么写这两个文件,可以google下。它们的内容可以如下:

/etc/passwd
root::0:0:root:/:/bin/ash
nobody::65534:65533:nobody:/:/bin/ash
/etc/group
nobody::65533:
nogroup::65534:nobody
root::0:
users::100:
当然,如果你的ARM Linux根文件系统中有这两个文件,那么你需要检查一下是不是有nobody用户和nogroup组。接下来,可以制作文件系统映像并测试apache是否可以正常工作了,还是用命令来说明。

# mkfs.cramfs /home/lxz/root /home/lxz/root.img

我一直用cramfs,SUSE 10.2自己就带了mkfs.cramfs这个工具。烧写或者加载文件系统映像的步骤我就不说了,需要注意的是如果你使用了不可写的文件系统,如cramfs,需要把apache的日志路径挂载为临时文件目录,下面这几条命令在ARM Linux上执行。

# mount -t tmpfs tmpfs /usr/local/apache/log

然后就可以启动apache了

# cd /usr/local/apache/bin
# ./apachectl start

假设ARM板的ip地址是192.168.5.118,在浏览器里输入http://192.168.5.118:8080访问ARM板(不修改默认配置,服务端口是8080)。apache的配置一会儿编译了php再说。

编译php
首先下载php-4.4.8,下载地址:http://cn2.php.net/get/php-4.4.8.tar.bz2/from/this/mirror

交叉编译php同样需要两个步骤:
1.编译本机代码
2.利用本机代码进行交叉编译

原因我就不重复了,假设为本机编译的php代码已经解压缩到/home/lxz/php-4.4.8-i586,为ARM编译的php代码已经解压缩到/home/lxz/php-4.4.8,交叉编译器arm-linux-gcc已设缺省路径,具体步骤还是用命令来说明:

# cd /home/lxz/php-4.4.8-i586
# ./configure
# make

在编译的同时,可以打开/home/lxz/php-4.4.8/configure这个文件,搜索“can not run test program while cross compiling”,会搜索到很多个这样的结果:
{ echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
把它们都改为
{ echo "configure: error: can not run test program while cross compiling" 1>&2; }
这样做的目的是直接无视交叉编译测试程序错误。另外,我使用的是arm-linux-gcc 3.4.1版,和代码不太兼容。找到/home/lxz/php-4.4.8/Zend/zend_strtod.c的第238行
#if defined(IEEE_LITTLE_ENDIAN) + defined(IEEE_BIG_ENDIAN) + defined(VAX) + \
    defined(IBM) != 1
Exactly one of IEEE_LITTLE_ENDIAN IEEE_BIG_ENDIAN, VAX, or
IBM should be defined.
#endif
把这段改为
#if defined(IEEE_LITTLE_ENDIAN) + defined(IEEE_BIG_ENDIAN) + defined(VAX) + \
    defined(IBM) != 1
//Exactly one of IEEE_LITTLE_ENDIAN IEEE_BIG_ENDIAN, VAX, or
//IBM should be defined.
#endif
在本机php编译完后,输入如下命令

# cd /home/lxz/php-4.4.8
# CC=arm-linux-gcc ./configure --prefix=/usr/local/php --host=i586-suse-linux --target=arm-linux

别以为可以编译了,还有东西要修改,真汗啊……打开/home/lxz/php-4.4.8/Makefile,找到这段
install-pear-packages: $(top_builddir)/sapi/cli/php
@$(top_builddir)/sapi/cli/php $(PEAR_INSTALL_FLAGS) /home/lxz/php-4.4.8/pear/install-pear.php -d "$(peardir)" -b "$(bindir)" /home/lxz/php-4.4.8/pear/packages/*.tar
用上我们刚才编译的本机php里的文件,把它改成
install-pear-packages: /home/lxz/php-4.4.8-i586/sapi/cli/php
@/home/lxz/php-4.4.8-i586/sapi/cli/php $(PEAR_INSTALL_FLAGS) /home/lxz/php-4.4.8/pear/install-pear.php -d "$(peardir)" -b "$(bindir)" /home/lxz/php-4.4.8/pear/packages/*.tar
终于可以编译了

# make

随后和apache一样,需要切换用户,把php的文件安装到/usr/local/php

# su

输入密码

# cd /home/lxz/php-4.4.8
# make install
# exit

这样,php就编译完成了。

配置Apache和PHP
接下来就需要修改配置文件,让apache和php能够链接起来工作。这个配置过程和Windows下使用apache+php的过程类似,因为我不是把apache和php一起编译的,只是让apache认识“.php”这个扩展名,然后调用php。为了方便,直接给出apache的配置文件,配置文件的位置在ARM Linux文件系统的/usr/local/apache/conf/httpd.conf,其中红色字是在默认配置文件基础上修改或添加的内容。
ServerType standalone
ServerRoot "/usr/local/apache"
PidFile /usr/local/apache/logs/httpd.pid
ScoreBoardFile /usr/local/apache/logs/httpd.scoreboard
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 15
MinSpareServers 5
MaxSpareServers 10
StartServers 5
MaxClients 150
MaxRequestsPerChild 0
Port 80
User nobody
Group nobody
ServerAdmin cosine@126.com
DocumentRoot "/home/webroot"

    Options FollowSymLinks
    AllowOverride None


    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all


    UserDir public_html


    DirectoryIndex index.html
    DirectoryIndex index.php
    DirectoryIndex index.php3
    DirectoryIndex index.phtml

AccessFileName .htaccess

    Order allow,deny
    Deny from all
    Satisfy All

UseCanonicalName On

    TypesConfig /usr/local/apache/conf/mime.types

DefaultType text/plain

    MIMEMagicFile /usr/local/apache/conf/magic

HostnameLookups Off
ErrorLog /usr/local/apache/logs/error_log
LogLevel warn
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
CustomLog /usr/local/apache/logs/access_log common
ServerSignature On

    Alias /icons/ "/usr/local/apache/icons/"
    
        Options Indexes MultiViews
        AllowOverride None
        Order allow,deny
        Allow from all
    

    Alias /manual/ "/usr/local/apache/htdocs/manual/"
    
        Options Indexes FollowSymlinks MultiViews
        AllowOverride None
        Order allow,deny
        Allow from all
    

    ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/"
    ScriptAlias /php4/ "/usr/local/php/bin/"
    # 注意 "/usr/local/php/bin/" 中最后一个"/"不可少
    
        AllowOverride None
        Options None
        Order allow,deny
        Allow from all
    



    IndexOptions FancyIndexing
    AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip
    AddIconByType (TXT,/icons/text.gif) text/*
    AddIconByType (IMG,/icons/image2.gif) image/*
    AddIconByType (SND,/icons/sound2.gif) audio/*
    AddIconByType (VID,/icons/movie.gif) video/*
    AddIcon /icons/binary.gif .bin .exe
    AddIcon /icons/binhex.gif .hqx
    AddIcon /icons/tar.gif .tar
    AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv
    AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip
    AddIcon /icons/a.gif .ps .ai .eps
    AddIcon /icons/layout.gif .html .shtml .htm .pdf
    AddIcon /icons/text.gif .txt
    AddIcon /icons/c.gif .c
    AddIcon /icons/p.gif .pl .py
    AddIcon /icons/f.gif .for
    AddIcon /icons/dvi.gif .dvi
    AddIcon /icons/uuencoded.gif .uu
    AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl
    AddIcon /icons/tex.gif .tex
    AddIcon /icons/bomb.gif core
    AddIcon /icons/back.gif ..
    AddIcon /icons/hand.right.gif README
    AddIcon /icons/folder.gif ^^DIRECTORY^^
    AddIcon /icons/blank.gif ^^BLANKICON^^
    DefaultIcon /icons/unknown.gif
    ReadmeName README.html
    HeaderName HEADER.html
    IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t


    AddLanguage da .dk
    AddLanguage nl .nl
    AddLanguage en .en
    AddLanguage et .ee
    AddLanguage fr .fr
    AddLanguage de .de
    AddLanguage el .el
    AddLanguage he .he
    AddCharset ISO-8859-8 .iso8859-8
    AddLanguage it .it
    AddLanguage ja .ja
    AddCharset ISO-2022-JP .jis
    AddLanguage kr .kr
    AddCharset ISO-2022-KR .iso-kr
    AddLanguage nn .nn
    AddLanguage no .no
    AddLanguage pl .po
    AddCharset ISO-8859-2 .iso-pl
    AddLanguage pt .pt
    AddLanguage pt-br .pt-br
    AddLanguage ltz .lu
    AddLanguage ca .ca
    AddLanguage es .es
    AddLanguage sv .sv
    AddLanguage cs .cz .cs
    AddLanguage ru .ru
    AddLanguage zh-TW .zh-tw
    AddCharset Big5         .Big5    .big5
    AddCharset WINDOWS-1251 .cp-1251
    AddCharset CP866        .cp866
    AddCharset ISO-8859-5   .iso-ru
    AddCharset KOI8-R       .koi8-r
    AddCharset UCS-2        .ucs2
    AddCharset UCS-4        .ucs4
    AddCharset UTF-8        .utf8
    
        LanguagePriority en da nl et fr de el it ja kr no pl pt pt-br ru ltz ca es sv tw
    

    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

Action application/x-httpd-php "/php4/php"

    BrowserMatch "Mozilla/2" nokeepalive
    BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0
    BrowserMatch "RealPlayer 4\.0" force-response-1.0
    BrowserMatch "Java/1\.0" force-response-1.0
    BrowserMatch "JDK/1\.0" force-response-1.0

php也有配置文件,但是修改起来比较简单,只需要把/home/lxz/php-4.4.8/php.ini-dist到ARM Linux文件系统的/usr/local/php/lib,并改名为php.ini,找到
register_globals = Off
修改为
register_globals = On
保存就可以了。
如果你觉得上面的一切都很麻烦,可以在EE小站的SkyDrive下载我制作好的压缩包,地址http://cid-4201fdc93932ddaf.skydrive.live.com/self.aspx/EE小站琐碎文件/armv4-apache-php.tar.bz2,解压缩到ARM Linux根文件系统的/。这个压缩包包含apache 1.3.39和php 4.4.8,默认的网页服务器根目录为/home/webroot,默认监听端口为80。
关键字:ARM  Linux  Apache+PHP 引用地址:在ARM Linux上使用Apache+PHP

上一篇:在ARM Linux上使用OpenGL
下一篇:Boa服务器在ARM+Linux上的移植

推荐阅读最新更新时间:2024-03-16 14:57

基于ARM核的ADμC7024在医疗电子中的应用
0 引言   随着信息技术的迅猛发展和人民生活水平的提高,极大地推动了医疗电子设备的发展,当今医疗电子设备的发展趋势是高精度、实时性、低功耗和小尺寸,作为医疗电子设备中核心地位的MCU(微处理器)也随着这一发展趋势向前不断衍变着。由早期的8位MCU发展到目前的32位RISC(精简指令集计算机)MCU。美国ADI公司根据市场的需要最新推出了一款基于ARM(高级精简指令集计算机)核的微处理器ADμC7024便是目前32位RISC MCU的杰出代表。ADμC7024卓越的处理能力、集成众多片上外围器件和芯片低功耗的特点,完全胜任目前医疗电子设备的需求及未来的发展目标。   本文以ADμC7024在医疗电子中监护产品脉搏血氧计的应用为
[工业控制]
建立ARM Linux交叉编译环境
首先需要一台运行Linux操作系统的PC以完成我们的编译工作。 其次要准备如下一些源文件。 1、源文件准备 binutils-2.14.tar.gz ftp://ftp.gnu.org/gnu/binutils/binutils-2.14.tar.gz gcc-core-2.95.3.tar.gz ftp://ftp.gnu.org/gnu/gcc/gcc-2.95.3/gcc-core-2.95.3.tar.gz gcc-g++2.95.3.tar.gz ftp://ftp.gnu.org/gnu/gcc/gcc-2.95.3/gcc-g++-2.95.3.tar.gz glibc-2.2.4.tar.gz ft
[单片机]
典型的Linux设备驱动程序的代码
为了增跟内核的灵活性和为了方便,设各驱动程序应被设计为一个可动态安装的内核模块。 于是,一个典型的Linux设备驱动程序应包含如下几部分代码: ·驱动程序模块的注册与注销函数; ·设各的打开、关闭、读、写及需要的其他操作函数; ·设备的中断服务程序。 下面用伪代码给出一个从键盘上输入一个字符的例子,以使读者对设备驱动程序的构成有一个基本的概念。 (1)定义读操作函数 ssize mydev_read(……) { 获取本设备的信号量以确倮没有其他进程访闷本设备; 申请中断标志,允许中断; 对设备发出读命令; 将进EH于等待队列,等待中断到来: } (2)定义中断服务程序
[单片机]
基于ARM 的来电号码显示器的实现方法
  本文介绍基于ARM 的来电号码显示器的实现方法。利用CID 芯片HT9032C 来解调FSK 码,同时可实现液晶显示、E2PROM存储和语音播报电话主叫号码等功能,以SPI 串行接口智能显示键盘控制芯片ZLG7289A 为核心设计的键盘电路可实现查阅、删除信息。文章详细介绍了系统的硬件电路设计和软件流程。实践表明,显示器外围器件少,抗干扰能力强,使用方便。   目前我国电话网交换机传送主叫识别信息CID(Calling Identity Delivery) 有两种方式,较常用的是FSK(频移键控) 方式,另一种是DTMF(双音多频) 方式。通过掌握相应的协议标准和数据格式,可通过ARM 控制芯片HT9032C 实现解调FSK
[单片机]
基于<font color='red'>ARM</font> 的来电号码显示器的实现方法
基于ARM9处理器S3C2440的GPS导航终端机的设计
0 引言 随着汽车等各种车辆交通工具的普及,车辆导航设备的需求也变得日益旺盛。作为车载设备.不仅要有可靠的性能,而且需要具有便携、低功耗和低价格等特点。而采用基于ARM微处理器的嵌入式系统与GPS模块相配合的GPS导航终端机的设计方案,可以很好的满足这一系统需求。为此,本文介绍了一种利用ARM9开发板和GPS模块实现GPS导航功能的终端机的软硬件结构和设计方法。 1 GPS导航系统结构 本文所介绍的GPS全球定位导航系统按功能可分为嵌入式主控模块、GPS模块、显示模块、扩展模块及供电模块等五大部分。 嵌入式主控模块基于S3C2440处理器,主要负责对GPS导航模块数据的响应、处理和控制。在硬件上,主控模块就是一个嵌入式
[单片机]
基于<font color='red'>ARM</font>9处理器S3C2440的GPS导航终端机的设计
基于ARM芯片S3C2410的TFT-LCD驱动方法
    S3C2410是三星公司生产的基于ARM920T内核的RISC微处理器,主频率可达203MHz,适用于信息家电、Smart Phone、Tablet、手持设备、移动终端等领域。其中,集成的LCD控制器具有通用性,可与大多数的LCD显示模块接口。     PD064VT5是一种用非晶硅TFT作为开关器件的有源矩阵液晶显示器,该模块包括TFT-LCD显示屏、驱动电路和背光源,其接口为TTL电平。分辨率为640 x480像素,可通过18bit数据信号显示262 144种色彩。     1 S3C2410的LCD控制器     S3C2410中的LCD控制器可用于传输视频数据并产生必要的控制信号(像VFRAME、VLI
[嵌入式]
YAFFS文件系统在嵌入式Linux系统中的构建与改进
在嵌入式Linux的开发工作中,常用的存储设备有NorFlash和NandFlash,其中价格低廉并适用于高密度和大容量存储的NandFlash运用更为广泛 。YAFFS(Yet Another Flash File System)文件系统是专门针对NandFlash的特殊构造设计的,是一种日志结构的文件系统,性能超越了原有的JFFS系列文件系统。但随着嵌入式技术的发展,在NandFlash介质上的嵌入式Linux中构造YAFFS时,YAFFS存在挂载时间过长和损耗均衡性不足两方面的缺点,需要进一步改进和优化。 1 YAFFS文件系统 在嵌入式所用的NandFlash中,基本的读写单位是页(page),YAFFS的存储位也是页(
[单片机]
YAFFS文件系统在嵌入式<font color='red'>Linux</font>系统中的构建与改进
Mouser供货Embedded Artists的LPC800/LPC812 MA原型开发板
贸泽电子 (Mouser Electronics) 近日开始供应 Embedded Artists 的 LPC800/LPC812 MAX ARM Cortex‑M0+ 快速原型开发板,该板结合了 LPCXpresso、mbed 和 Arduino™ 的最佳开发功能。 Mouser供应的 Embedded Artists LPC/LPC812 MAX 快速原型开发板采用 NXP LPC800 系列微控制器中的 NXP Semiconductor 12MHz LPC812。这款独特的开发板尺寸仅54x78 mm,结合了三种嵌入式编程环境的最佳特性:首先是 mbed,LPC812 MAX 采用 mbed 硬件开发套件 (HDK),
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved