由于ARM板使用的是ArmV7,所以使用ubuntu14.04来完成本次的编译。
php8.2.5截止到2023年5月是最新的版本,一些环境在ubuntu14.04上需要手动更新。
一、编译libxml2-v2.11.1
在Linux中,所有默认的库都与该系统的初代发布版本一致,所以在ubuntu14.04中使用apt install安装的库版本都很老。
编译php8.2.5依赖libxml2,下载libxml2-v2.11.1,尝试执行./autogen.sh,后执行./configure 失败,需要安装以下:
1、依赖automake 高版本 1.16.3
下载automake 1.16.3源码并编译
# ./configure
# make
# make install
查看已安装版本号 automake --version
2、安装python2.7-dev
# apt-get install python2.7-dev
3、添加pkg.m4环境变量
# find / -name "pkg.m4"
# export ACLOCAL_PATH=/usr/share/aclocal
4、添加libsqlite3
# find / -name libsqlite3.so
# export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/:$LD_LIBRARY_PATH
5、交叉编译libxml2
# ./autogen.sh
# ./configure --prefix=/home/zfadmin/xml2_v211/arm --without-python --without-zlib --host=arm-linux-gnueabihf
# make
# make install
二、编译Apache 2.4.57
1、编译pcre2-10.37源码并安装
./configure --prefix=/home/zfadmin/httpdCompile/pcre2_arm --host=arm-linux-gnueabihf
2、下载apr和apr-ultra
放到srclib目录下,注意拷贝过去不能带版本号。
遇到run test的编译错误就把configure目录下的run test段落注释掉就行,一共有3处
3、编译安装 expat-2.5.0
./configure --prefix=/home/zfadmin/httpdCompile/expatArm --host=aarch64-linux-gnu
4、编译openssl 1.1.1
./Configure --prefix=/home/zfadmin/httpdCompile/opensslArm/ linux-elf no-shared shared no-zlib no-asm no-threads no-sse2 no-rfc3779 no-rc5 no-zlib-dynamic no-hw no-md2 no-mdc2 no-rc2 no-idea no-camellia no-ec no-ripemd no-bf no-cast --cross-compile-prefix=arm-linux-gnueabihf-
5、安装Apache
--enable-so 选项可以使接下来编译php8可指定apxs目录,如不用php可不加
如果php8没有编译成线程安全的版本则需要--with-mpm=prefork --enable-mpms-shared=all
# CFLAGS="-pthread" CXXFLAGS="-pthread" ./configure --with-expat=/home/zfadmin/httpdCompile/expatArm --with-mpm=prefork --enable-mpms-shared=all --enable-so --with-ssl=/home/zfadmin/httpdCompile/opensslArm --prefix=/home/zfadmin/httpdCompile/arm CC=arm-linux-gnueabihf-gcc --host=arm-linux-gnueabihf --with-pcre=/home/zfadmin/httpdCompile/pcre2_arm/bin/pcre2-config --with-included-apr ac_cv_file__dev_zero=yes ac_cv_func_setpgrp_void=yes ap_cv_void_ptr_lt_long=no ac_cv_struct_rlimit=yes
提示gen_test_char:
进入到/home/zfadmin/httpdCompile/httpd-2.4.57/server 目录
执行gcc -Wall -O2 -DCROSS_COMPILE gen_test_char.c -s -o gen_test_char
再执行./gen_test_char > test_char.h
然后继续make
出现AH00534: httpd: Configuration error: More than one MPM loaded
在httpd.conf中加上Include conf/extra/httpd-mpm.conf。httpd.conf中不加任何mpm模块
在httpd-mpm.conf 中只保留关于 mpm_prefork_module的一小段,其余全部注释
三、编译PHP8.2.5
1、编译zlib1.2.13
export CC=aarch64-linux-gnu-gcc
export AR=aarch64-linux-gnu-ar
export RANLIB=aarch64-linux-gnu-ranlib
./configure --prefix=/home/zfadmin/php825/zlib/arm
2、编译php
先编译apache,才能再编译php8,因为php8在编译的时候需要指定--with-apxs2=/home/zfadmin/httpdCompile/arm/bin/apxs的目录才行,注意要么把php8编译成线程安全的,要么编译出来一个单线程的apache。本文选择编译一个单线程的apache。
需要在命令行中设置LDFLAGS 变量:
export CPPFLAGS="-I/home/zfadmin/php825/zlib/arm3/include -I/home/zfadmin/php825/sqllit3/arm/include"
export LDFLAGS="-L/home/zfadmin/xml2_v211/arm/lib -L/home/zfadmin/php825/zlib/arm3/lib -L/home/zfadmin/php825/sqllit3/arm/lib"
多次配置请记得 make clean;make disclean;以防出现意外情况
# ./configure --prefix=/home/zfadmin/php825/arm4 --with-apxs2=/home/zfadmin/httpdCompile/arm3/bin/apxs --host=arm-linux-gnueabihf --enable-session --with-libxml=/home/zfadmin/xml2_v211/arm --with-mysqli --without-sqlite3 --with-zlib=/home/zfadmin/php825/zlib/arm3 --disable-phar --without-pear
# make
# make install
选项说明:
1、必需要加 --enable-session,不然没有办法调用redis。
2、 需要指定--with-apxs2=/home/zfadmin/httpdCompile/arm/bin/apxs的目录,会在apache编译后目录下的moduls下生成一个libphp.so,这个libphp.so与生成的php可执行程序无关。
3、需要手动指定--without-sqlite3。
4、需要指定--disable-phar --without-pear。
5、显示指定--with-mysqli,即便后续还需要手动编译mysqli.so。
四、编译phpRedis5.3.7
进入到phpRedis扩展的源码目录,先运行刚刚编译的phpize,再执行configure。会在编译好的php扩展目录下生成对应的so文件。
# /home/zfadmin/php825/arm/bin/phpize
# CC=arm-linux-gnueabihf-gcc ./configure --with-php-config=/home/zfadmin/php825/arm/bin/php-config --host=arm-linux-gnueabihf --enable-redis
五、编译mysqli
进入php源码目录中的ext/mysqli目录下
/home/zfadmin/php825/arm4/bin/phpize
CC=arm-linux-gnueabihf-gcc ./configure --with-php-config=/home/zfadmin/php825/arm4/bin/php-config --with-mysqli=mysqlnd --host=arm-linux-gnueabihf
会在对应扩展目录下,如/home/zfadmin/php825/arm4/lib/php/extensions/no-debug-non-zts-20220829中生成相应的so文件
六、移植到ARM
在php.ini中指定extension绝对路径
extension=/opt/web/php-8.2.5-armv7/lib/php/extensions/no-debug-non-zts-20220829/redis.so
在 /etc/profile中添加查找php.ini的路径
export PHP_INI_SCAN_DIR=/opt/web/php-8.2.5-armv7/lib
以下是一些php查找相关扩展/配置文件路径的相关语句
//查看php版本
[root@EPC-M6Y2C bin]# ./php -v
PHP 8.2.5 (cli) (built: May 8 2023 17:57:41) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.5, Copyright (c) Zend Technologies
//查找配置文件的路径
[[root@EPC-M6Y2C bin]# ./php --ini
Configuration File (php.ini) Path: /home/zfadmin/php825/arm/lib
Loaded Configuration File: (none)
Scan for additional .ini files in: /opt/web/php-8.2.5-armv7/lib
Additional .ini files parsed: /opt/web/php-8.2.5-armv7/lib/php.ini
//查看可以找到的所有扩展
[root@EPC-M6Y2C bin]# ./php -m
[PHP Modules]
Core
date
hash
json
libxml
pcre
random
redis
Reflection
session
SPL
standard
[Zend Modules]
//查看phpinfo()
[root@EPC-M6Y2C bin]# ./php -i
phpinfo()
PHP Version => 8.2.5
System => Linux EPC-M6Y2C 4.14.98 #1 SMP Wed Mar 8 15:32:50 CST 2023 armv7l
Build Date => May 8 2023 17:57:22
Build System => Linux ubuntu 4.4.0-148-generic #174~14.04.1-Ubuntu SMP Thu May 9 08:17:37 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
Configure Command => './configure' '--prefix=/home/zfadmin/php825/arm' '--host=arm-linux-gnueabihf' '--enable-session' '--with-libxml=/home/zfadmin/xml2_v211/arm' '--without-sqlite3' '--disable-libxml' '--disable-all' '--without-config-file' 'host_alias=arm-linux-gnueabihf'
Server API => Command Line Interface
Virtual Directory Support => disabled
Configuration File (php.ini) Path => /home/zfadmin/php825/arm/lib
Loaded Configuration File => (none)
Scan this dir for additional .ini files => /opt/web/php-8.2.5-armv7/lib
Additional .ini files parsed => /opt/web/php-8.2.5-armv7/lib/php.ini
PHP API => 20220829
PHP Extension => 20220829
Zend Extension => 420220829
Zend Extension Build => API420220829,NTS
PHP Extension Build => API20220829,NTS
Debug Build => no
Thread Safety => disabled
………………………………
指定httpd.conf运行:./httpd -f /opt/web/apache-2.4.57-armv7/conf/httpd.conf
apache中的phpinfo()和./php -i中的phpinfo不是同一个来源,apache中的是指libphp.so文件,而./php的是对应php的phpinfo。
提示找不到QMYSQL驱动,需要把mysql客户端mysqlclient.so安装路径下的lib依赖环境设置到/etc/profile中