文章11
标签6
分类3

PHP8挖坑记

最后更新于2021-01-03

灵感来源

本站从Vultr(CHOOPA-Tokyo)迁移到阿里云(深圳)后,重新部署了Linux+Nginx+Mysql+PHP+Apache版本,优化了套件的安全性。恰逢PHP8发布Beta版本,且加入了JIT(Just In Time),遂尝试性进行更新。

P.S. PHP8.0正式版发布后已跟进。

在PHP8正式发布后,本文会更新基准测试 etc.


什么是JIT

在计算机技术中,即时编译(英语:just-in-time compilation,缩写为JIT;又译及时编译、实时编译),也称为动态翻译或运行时编译,是一种执行计算机代码的方法,这种方法涉及在程序执行过程中(在运行期)而不是在执行之前进行编译。通常,这包括源代码或更常见的字节码到机器码的转换,然后直接执行。实现JIT编译器的系统通常会不断地分析正在执行的代码,并确定代码的某些部分,在这些部分中,编译或重新编译所获得的加速将超过编译该代码的开销。

JIT编译是两种传统的机器代码翻译方法——提前编译(英语:ahead-of-time compilation)(AOT)和解释——的结合,它结合了两者的优点和缺点。大致来说,JIT编译将编译代码的速度与解释的灵活性、解释器的开销以及额外的编译开销(而不仅仅是解释)结合起来。JIT编译是动态编译的一种形式,允许自适应优化(英语:adaptive optimization),比如动态重编译和特定于微架构的加速——因此,在理论上,JIT编译能够比静态编译产生更快的执行速度。解释和JIT编译特别适合于动态编程语言,因为运行时系统可以处理后期绑定(英语:Late binding)的数据类型并实施安全保证。

PHP8中JIT的支持是Opcache的一部分,近年来PHP在核心数据结构HashTableZend VM中某些操作码与Opcache的Optimizer组件下了不少功夫。JIT的加入可能意味着其他方法优化已经到达极限了

转自:Wikipedia


安装方法

下载php-8.0.0.tar.gz - php.net代码(截止发文最新的Release版本)。
代码如下(依赖请自行解决)

wget https://www.php.net/distributions/php-8.0.0.tar.gz
tar zxvf https://www.php.net/distributions/php-8.0.0.tar.gz && cd php-8.0.0
./buildconf
./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-config-file-scan-dir=/usr/local/php/etc/php.d --with-fpm-user=www --with-fpm-group=www --enable-fpm --enable-mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-iconv-dir=/usr/local/libiconv --with-freetype --with-jpeg --with-zlib --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-exif --enable-sysvsem --enable-inline-optimization --with-curl=/usr/local/curl --enable-mbregex --enable-mbstring --with-password-argon2 --with-sodium=/usr/local --enable-gd --with-openssl=/usr/local/openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-ftp --enable-intl --with-xsl --with-gettext --with-zip=/usr/local --enable-soap --disable-debug --enable-opcache --enable-calendar
make && make install

cp php.ini-production /usr/local/php/etc/php.ini
cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
chmod +x /etc/init.d/php-fpm
service php-fpm start
systemctl enable php-fpm

Opcache使用配置

cd /usr/local/php/etc/php.d
vim 02-opcache.ini

写入以下内容:

[opcache]
zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=192
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=100000
opcache.max_wasted_percentage=5
opcache.use_cwd=1
opcache.validate_timestamps=1
opcache.revalidate_freq=60
;opcache.save_comments=0
opcache.fast_shutdown=1
opcache.consistency_checks=0
;opcache.optimization_level=0
opcache.jit_buffer_size=128m
opcache.jit=1205

后重启php-fpm

service php-fpm restart

常见问题

  1. PHP7.4与PHP8共存未解决(指定的--with-config-file-scan-dir不生效)(是否解决未知)
  2. configure: error: iconv does not support errno
    解决方案相当玄学,1.16报错可以尝试1.14版本:
    wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
    ./configure --prefix=/usr/local/libiconv
    make && make install
  3. 目前和PHP7最常见的兼容性问题就是PHP8.0报错500,因为PHP8禁用@运算符强制屏蔽致命性错误,请修改相关代码。目前测试Typecho支持良好,OneIndexR Core问题已修复。

基准测试

基准测试可以参考Phoronix的

介绍OneIndexR——低成本全球CSDS服务

CSDS: Cloud Storage Distribute Service

鸣谢原作者

二次开发并使用的背景API,作者:小歪
二次开发并使用的nexmoes模板,作者:dl233,遵循Apache 2.0 License;
二次开发并使用的OneIndex Bottle Edition,作者:SomeBottle
二次开发并使用的OneIndex,作者:Donwa(现已删库);
使用wangziyingwenAutoApiS项目进行续期;
使用字节跳动西瓜播放器
使用Mozillapdf.js

二次开发和使用均已直接或间接获得授权。


最初想法

由于PanDownload事件,想找一个安全且容量大的网盘,恰好想起来自己封存已久的Microsoft A1套餐——
But I want more.
在万能的搜索引擎上得知Microsoft E5套餐的开发者版本,遂申请。(截止2021年1月已延期成功2次)

最初,列目录软件我使用了OneList(也是个不错的项目,基于Java),发现下载速度不尽人意。二次开发也没有头绪,于是转向了OneIndex这个老牌的项目。

在国内高速访问,CDN 是必需的功能。事实上此功能的修改在onedrive.php内可以通过一句话实现。


应用场景

  1. 冷储存(储存稳定,容量大,上传下载速度也可以接受)
  2. 文件同步(2020年初Onedrive实现了差异同步,经vc加密的磁盘文件也可以快速同步)
  3. 图床(事实上,本站的图床就使用了OneIndexR)
  4. 文件分享和在线播放

……


使用技巧

Onedrive客户端同步任意目录(或文件)——
原理:MKLINK创建目录(或文件)符号链接

CMD语法:MKLINK [[/D] | [/H] | [/J]] Link Target
说明:
/D 创建目录符号链接而不是文件符号链接(默认为文件符号链接)
/H 创建硬链接而不是符号链接
/J 创建目录连接点
Link 指定新的符号链接名称
Target 指定新链接引用的路径(绝对路径或者相对路径均可)

RaiDrive挂载Onedrive——
原理:通过Microsoft Graph API进行文件上下传操作
官网:https://www.raidrive.com/download


发展方向

优化缓存机制、优化在线播放、实现CDN加速上传、加快图床速度、实现用量分析、实现多用户盘……