Using php-cgi on ARM


Development:
    kernel:2.6.31-14-generic ubuntu9.10
    cross-tools:arm-linux-gcc version 4.1.2
Target
        kernel: 2.6.28.9 MOZART380 armv5tejl
Webserver:
    boa: boa-0.94.13
    boa的移植可以参见
    http://hi.baidu.com/videoforlinux/blog/item/19c6c752bd9256461138c272.html

PHP source
    Version:php-5.2.17
    php的源码获取:
    http://www.php.net/downloads.php


解压:
    tar zxf  php-5.2.17.tar.gz
配置:
    ./configure     --host=arm-linux
            --prefix=/exchange/php-arm
            --disable-all
            --enable-pdo
            --with-sqlite
            --with-pdo-sqlite
            --with-zlib
            --without-iconv

修改Makefile
    gedit Makefile
    CC = gcc
    ------->
    CC = arm-linux-gcc

    CPP = gcc -E
    ------------>
    CPP = arm-linux-gcc -E
    
make
    make
    |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
    Q1:php_zlib.h:25:18: error: zlib.h: No such file or directory
    A:    查看php_zlib.h,了解其include交叉编译环境中的include/zlib.h
        find /opt/Mozart_Toolchain/arm-eabi-uclibc/ -name zlib.h

        可知道crosstools下并没有zlib.h
        一般情况下可以在host系统中find相应的文件(头文件一般是可以互用的)
        find /usr -name zlib.h
        /usr/src/linux-headers-2.6.31-14/include/linux/zlib.h
        /usr/src/linux-headers-2.6.31-14-generic/include/config/jffs2/zlib.h
        /usr/src/linux-headers-2.6.31-14-generic/include/config/ubifs/fs/zlib.h
        /usr/src/linux-headers-2.6.31-14-generic/include/config/crypto/zlib.h
        /usr/src/linux-headers-2.6.31-14-generic/include/linux/zlib.h
        /usr/include/zlib.h
        
        将其中的一个文件copy至crosstools的include
        sudo cp /usr/include/zlib.h /opt/Mozart_Toolchain/arm-eabi-uclibc/include
        Note:
        zlib.h依赖的其他头文件要一并复制到crosstools的include

     Q2:image.c error: zlib.h: No such file or directory
    A:    查看image.c 了解其引用了当前目录的zlib.h
        将其修改为引用标准目录
        gedit image.c
        #include "zlib.h"
        ------------->
        #include <zlib.h>

    Q1和Q2可以简单解决如下:
        gedit php_zlib.h
        #include <zlib.h>
        ---------------->
        #include "/usr/include/zlib.h"
        
        gedit image.c
        #include "zlib.h"
        ------------->
        #include "/usr/include/zlib.h"

        其中php_zlib.h image.c
        php/ext/zlib/php_zlib.h
        php/ext/standard/image.c

     Q3:cannot find -lz
    A:    查找crosstools中的lib是否丢失libz.so
        find /opt/Mozart_Toolchain/arm-eabi-uclibc/lib/ -name libz.so
        确认丢失!!!

        、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
        下载zlib-1.2.3.tar.gz
        交叉编译zlib
        编译过程可以参照
        下载:
            http://u.115.com/file/e6ya8rha
            tar zxf zlib-1.2.3.tar.gz
            cd zlib-1.2.3/
            export CC=arm-linux-gcc
            ./configure --shared --prefix=../zlib-arm
            Note:
                此处可以自行修改Makefile指定
                CC=arm-linux-gcc
                CPP=arm-linux-gcc -E
                AR=arm-linux-ar rc              [option]
                RANLIB=arm-linux-ranlib     [option]
            make
            完成后在当前目录下生成
                libz.so.1.2.3
                zlib.h
                zconf.h
                zutil.h
            此处的*.h拷贝至/opt/Mozart_Toolchain/arm-eabi-uclibc/include
        、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、


        sudo cp libz.so.1.2.3 /opt/Mozart_Toolchain/arm-eabi-uclibc/lib/
        cd /opt/Mozart_Toolchain/arm-eabi-uclibc/lib/
        ln -s libz.so.1.2.3 libz.so

        当然,亦可以拷贝开发板上编译好的libz.so.1.2.3
        
    Q4:php-5.2.17/ext/standard/basic_functions.c:6468: undefined reference to `getloadavg'
    A:    查看getloadavg手册
        man getloadavg
        DESCRIPTION
                   The  getloadavg()  function  returns  the  number of processes
            in the system run queue averaged over various periods of time.
        可知道这是一个统计负载的API

        查看crosstools下的接口定义:
        grep -Rr "getloadavg" /opt/Mozart_Toolchain/arm-eabi-uclibc/include/
        /opt/Mozart_Toolchain/arm-eabi-uclibc/include/stdlib.h:extern int getloadavg (double __loadavg[], int __nelem)

        解决方法:
            一:添加头文件stdlib.h和链接相应的lib
            二:注释掉getloadavg的功能
        
        bean选择方法二:
        gedit main/php_config.h
        注释掉含有HAVE_GETLOADAVG的定义
        #define HAVE_GETLOADAVG 1
        ---------------------->
        //#define HAVE_GETLOADAVG 1
        
        Note:
        以下同质问题和解决
            undefined reference to `__dn_skipname'            
            #define HAVE_DN_SKIPNAME 1
            ---------------------->
            //#define HAVE_DN_SKIPNAME 1
            
            undefined reference to `__res_nsend'
            #define HAVE_RES_NSEND 1
            ---------------------->
            //#define HAVE_RES_NSEND 1

            undefined reference to `strfmon'
            #define HAVE_STRFMON 1
            ---------------------->
            //#define HAVE_STRFMON 1
    |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||


配置:
    此时在sapi/cgi/下已经生成php-cgi
    file sapi/cgi/php-cgi
    sapi/cgi/php-cgi: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), not stripped
    如果测试稳定,可以strip
    将php-cgi拷贝至web server的cgi-bin/
    sudo cp sapi/cgi/php-cgi /home/zhaohui/NFS_09_10/rootfs/exchange/boa/www/cgi-bin/
    Note
        php-cgi应该在boa.conf的/cgi-bin/定义的目录下
        bean的定义如下
            ScriptAlias /cgi-bin/ /exchange/boa/www/cgi-bin/
    
测试:
    在boa.conf中查看DocumentRoot的定义
    在DocumentRoot定义的目录下创建测试文件
    bean的DocumentRoot定义
        DocumentRoot /exchange/boa/www
    cd /exchange/boa/www
    touch phpinfo.php
    vi phpinfo.php
    添加以下内容:

       ///////////////////////////////////////////////////////////////////////
        <?php
        // Show all information, defaults to INFO_ALL
        phpinfo();
        ?>

      ///////////////////////////////////////////////////////////////////////
    chmod +x phpinfo.php

    在pc的IE中输入
        http://YOURSIP/cgi-bin/php-cgi/phpinfo.php
    显示以“PHP Version 5.2.17”打头的表单

参考:
http://blog.csdn.net/jsfzdd/article/details/6431110

你可能感兴趣的:(Using php-cgi on ARM)