背景

  • Platform: IMX6Q
  • OS: Linux-QT5
  • Kernel: 4.1.15

需求

我们的设备在漏洞扫描中报了很多PHP的漏洞,以前使用的是PHP5,因此需要将PHP升级到最新版本.

PHP交叉编译

我使用的是目前最新的版本php-7.3.12, 其他版本可能大同小异

配置

./configure --host=arm-poky-linux-gnueabi --prefix=xxx/php-arm --disable-all --enable-session --without-sqlite3 --with-zlib --without-iconv --enable-json --enable-sockets --enable-fileinfo --enable-cli --enable-cgi --enable-fpm  --disable-phpdbg --with-config-file-path=/etc

说明:

  • --enable-session --enable-json --enable-sockets --enable-fileinfo: 因为我们的web网页需要用到Session, json文件操作(主要是配置文件),socket通信(和应用程序通信),和获取升级文件信息
  • --with-config-file-path=/etc: PHP的配置文件(php.ini)的路径
  • 这些配置需要根据实际需求来enable和disable.

编译安装

#编译
make
#安装到安装目录
make install
#精简文件大小
arm-poky-linux-gnueabi-strip xxx/php-arm/bin/*

最后将需要的文件拷贝到自己的文件系统,这里主要是php-cgi

问题

上传文件失败的问题

$_FILES为空,is_uploaded_file()返回false

  1. 检查配置文件php.ini路径
    编译配置里面配置--with-config-file-path=/xxx/xxx 选项,并将php.ini在此路径
  2. 检查配置文件php.ini里面的相关配置
    主要是以下几个配置:
    file_uploads = On
    upload_max_filesize = 200M
    max_file_uploads = 20
    default_socket_timeout = 60
    post_max_size = 250M
    file_uploads = On:使能文件上传
    upload_max_filesize = 200M: 上传文件的大小限制
    post_max_size = 250M: POST的数据最大字节长度, 一般要大于等于max_file_uploads,才能实现大文件上传

PHP配置文件未加载的问题

phpinfo()提示:Loaded Configuration File => (none)

  1. 确认configure有配置--with-config-file-path=/xxx/xxx
  2. strace跟踪:strace php-fpm -i 2>test.log, 加载配置文件的路径不是我们配置的
  3. 最后make clean下重新编译解决。。。

解决html网页有显示,但执行老8531的PHP报错(500)的问题:

PHP相关插件未编译安装,比如json,zip等

参考

https://notes.z-dd.online/2019/08/05/Android内嵌web服务器/
https://notes.z-dd.online/2019/06/19/嵌入式Web服务器/