乐趣区

关于php:惊魂一夜有福新闻UfqiNews升级到PHP8

有福新闻 UfqiNews 的老版本仍然运行在 GWA2 PHP (https://ufqi.com/dev/gwa2/)上,去年底 PHP 编程语言自身降级到了 PHP8, 获得好评,咱们即打算择日降级 GWA2 PHP 到 PHP8 版本。

思考到之前对于降级的经验教训,任何开源软件,可能在生产线部署的,肯定是以后稳固版本(latest stable release)的上一个版本,也就是上一个稳固版本的最新小版本。所以咱们思考将 有福新闻 UfqiNews 的 GWA2 PHP 降级的话,也不会间接去 PHP8,而是先应用 PHP8 之前的一个稳固版本 PHP7.4.

又因为软件开发和应用,尤其是系统软件的开发和应用,另外一个黄金法令是可能运行就尽量不要去做任何批改(包含降级、优化等)。所以如果没有肯定的能源的话,咱们是不会去批改(降级、优化)一个运行失常的零碎。

可怜的是,时过境迁,物换星移,人们对软件系统的改良冀望是无止境的。很快咱们就遇到一个须要通过降级来解决的问题:以后的 UfqiNews (https://ufqi.com/news/) 零碎里在解决图片水印时,无奈在 WebP 格局的图片上打水印。这也不是大问题,要求图片另存为其余格局也能够绕过去,毕竟 WebP 格局的图片还是新事物。可是看到 WebP 的发展势头,仿佛遍及起来也只是工夫问题,加上对 PHP8 的神乎其技的“飞速”传言,咱们就依仗“艺高人胆大”的脑门一热的开启了在 UfqiNews 上降级 PHP8 的操作了,从而遇上了惊魂一夜,PHP8 有不兼容的问题,尤其是看起来像是走进路的 NULL 值问题和数据类型谬误抛出 TypeError/ValueError。

PHP Built-in function count() Changelog ¶
Version Description
8.0.0 count() will now throw TypeError on invalid countable types passed to the value parameter.
7.2.0 count() will now yield a warning on invalid countable types passed to the value parameter.

PHP Built-in function explode() Changelog ¶
Version Description
8.0.0 explode() will now throw ValueError when separator parameter is given an empty string (“”). Previously, explode() returned false instead.

另一个受影响较为重大的 PHP 内置函数是 implode ,
PHP 7 及之前,
$str = implode(“-“, $array);
“# 能吃屎,不论 $array 是啥料,都失常返回,持续程序 …
PHP 8 及之后,
$str = implode(“-“, $array);
”# 开始硬怼了,$array 类型不对时,间接抛出谬误,撂挑子不干了!

PHP 之所以雄起的“初心”之一就是有种“能吃屎”的精力,一个变量不论啥类型,都能顺利执行跑通,即使后果是非预期的,断然不至于将程序退出来,间接硬怼调用者说,“傻货,你输出的数据有问题!”

通常只有那些强类型的、预编译的语言的才有那么硬刚硬怼的底气,PHP 之前是断然不会的。真是因为这种“有事私下说,有问题日志里打小报告”的平易近人,取得了很多小白高级程序员的喜爱,遇上互联网的东风,逐步成燎原之势。PHP7 及之前的程序代码,只有没有模式上谬误,基本上都能顺利运行、跑出后果(或可能非预期)。繁琐简单的编译、类型查看、内存申请与销毁、垃圾回收、数组越界、空指针、Nnll 对象等等一些列问题,语言类库及 API 自身都做了一系列的致力,使之尽可能不终止程序的运行。

这种平易近人其本质是语言自身的类库及 API 对程序开发者、对程序使用者提供了异常情况解决工具,是某种容纳精力的体现。程序员会搞错类型,终端用户也会手抖,网络也不稳固,操作系统也偶然异样,输出的数据类型有问题仿佛在劫难逃。

语言开发者这么降级改良长脾气地硬怼程序开发者,如果程序开发者不做异样解决,则就一路硬怼到终端用户那里。这显然是不行的,让终端用户吃瘪,程序员是无奈交代的,程序员能够往回找语言开发者吗?纵有理由千千万,简单易行的 PHP,不该忘了初心,将这些繁琐的、根本的查看抛出来(而不是兼容解决打消消化掉问题),把强类型语言的“毛病”学来,作为“出息”。

这些背地可能是简单和漫长的决策、衡量与博弈,其自身是某种方法论的比照,其自身都没有对与错,而是一些取舍和边际抉择。这让我想起了咱们在设计 GWA2 的 API 接口时的一些思考,同时也在阿里巴巴和 Google 的一些 Java 语言标准(https://ufqi.com/news/ulongpa… 開發手冊 - 阿里巴巴 - 嵩山版 -2:編程規約)中呈现过。

比方在 GWA2 的主体办法与接口中,如果办法的返回值是根本类型(primitive scalar types),应该是有个默认返回值,以下面 PHP 的 count 函数为例,咱们预期的写法:
function int count($list){
int c = 0; # default or on failure
if(!isset($list)){} # a waring
else if($list == null){} # another warning
else if(!is_array($list)){} # 3rd warning
else{
“# count based on some rule…
c++;
}
return c;
}

如果是非根本数据类型的,如数组、列表或者 Hash 表、资源描述符等返回值(non-primitive compound types),则应该是两个返回字段,一个字段标注是否胜利解决,另外一个字段则是解决的理论后果值。以下面 PHP 的 explode 函数为例,咱们预期的写法:
function array explode($separator, $string){
$rtnArray = array(); $rtnList = array;
$isSucc = false;
if(!isset($string)){} # a waring
else if($string == null){} # another warning
else if(!is_string($string)){} # 3rd warning
else if($string ==“”){} # 4th warning
else{
”# split based on some rule…
$rtnList[$i] = function($string, $i);
$isSucc = true;
}
if($isSucc){$rtnArray[0] = true; $rtnArray[1] = $rtnList; }
else{$rtnArray[0] = false; $rtnArray[1] = $rtnList; }
return $rtnArray;
}

GWA2 Manual Book

GWA2 Return Values of Methods

附记 1.

为了使得零碎可能反对 WebP 格局的图片文件反对水印性能,咱们打算降级 PHP 语言环境。

起初,咱们并不打算降级到 PHP8,而是打算降级到 PHP7.4 这个版本,在理论编译 PHP 源代码时,以后零碎上报错说短少 oniguruma 类库,即使通过 yast/zypper 装置了 oniguruma-devel 之后,依然报错说无奈找到,而雷同配置的另外其余服务器则可能顺利找到 & 通过编译。Linux 还有很长的路要走。
既绕无奈装置 PHP7.4,那就试试 PHP8,后果还是相似谬误,预计只好针对 oniguruma 这个类库下点功夫,通过一番折腾,终于通过手工下载 https://github.com/kkos/onigu… 一份源代码,手工编译 & 装置之后才通过。

解决了 oniguruma 这个问题之后,在编译 PHP8 的时候,还遇到 ext/geoip 无奈编译通过的状况,起初通过手工下载 https://github.com/rlerdorf/g… 一份从新放入 ext/geoip 才算通过。

只管解决了那么多问题,具体 PHP8 兼容性问题,还没有浮现。因为放心会出现异常,咱们抉择在深夜流量较小的时候找一台服务器进行试装,后果就遇上重启之后大面积报错的状况,举凡遇到 count 和 implode /explode 等中央,都须要手工减少相应类型或数据安全检查代码。

顺带的昨晚还未被 Hanjst (https://ufqi.com/dev/hanjst/) 替换掉的 PHP Smarty 模板引擎,一样随着 PHP8 的降级,触发一团糟的问题,服务被迫终止了一会。庆幸咱们在后续的 GWA2 中将逐步解耦模板引擎,应用 Hanjst 替换掉 Smarty,与服务器端开发语言不再绑定。

再一次的惊魂一夜!再次印证了,不要就近降级到软件的最新的 latest stable release,惊魂大于惊喜。
再次印证了,能跑的零碎,尽量避免降级,各种问题 ui 导致业务被迫中断。智者千虑,必有一失。

—-

附记 2.

这是应用 WordPress 的 PHP8 兼容版,创作的第一篇 Blog,WordPress 的 PHP8 的版本升级比预期的快,体验好!值得学习。

WordPress 的新版降级过程大抵为:
1)备份原程序和资源文件,备份原数据库;
2)查看备份的可还原性;
3)新创建 WordPress 子目录,或者将现有目录转移为 old 目录;
4)下载并解压 WordPress 的新版本,解压到相应子目录,通过拜访 blog/wp-admin/install.php 启动程序;
5)输出原数据库的拜访账号,WordPress 主动查看;
6)主动抉择降级数据库,此前程序文件曾经降级结束;
7)应用原账号登录到降级后的 WordPress 后盾,所有就绪;
8)还差原 WordPress 下的主题文件和资源文件,通过 cp -rf blog/wp-content/themes/xxx-theme 复制过去主题文件;
9)通过 cp -rf blog/wp-content/uploads 复制过去资源文件,上传文件;
10)WordPress 提供了在线降级原主题的服务,顺利施行。
11)降级主题及相干文件之后,原先如果对主题模板文件进行了相应批改的话,须要从新在降级后的模板文件中进行再次有针对性的批改,比方特色链接,插图或者广告链接之类的插件。


-GWA2 吉娃兔 是”通用网络应用架构 (General Web Application Architeture, https://ufqi.com/dev/gwa2/)”,基于 -GWA2 能够轻便构建各种网络应用程序,
包含简单的在线购物商城、在线医疗、在线教育、游览交易平台、社群或者社交网站和新闻资讯网站等,
也包含各种企事业单位网上门户,在线交互及服务作业系统等.
还能够包含为 NativeApp 做服务器端反对, 甚至是 WebApp 的全副.
-GWA2 是为数不多的反对跨开发语言的利用框架,目前反对 -Java, -PHP, -Perl, -Aspx and -Python .

-GWA2 is a“General Web Application Architecture”and based on -GWA2 developers can easily build a variety of network applications,
including complex online shopping malls, online medical services, online teaching, travel trading platforms, community or social networking sites and news information sites, etc.
Also the applications include various online portals of enterprises and institutions, online interaction and service operations systems.
Moreover it contains server-side support for Native App, or even all of the WebApp.
-GWA2 is one of the web frameworks which provide cross-language support for -Java, -PHP, -Perl, -Aspx and -Python at present.

-GWA2 is E.A.S.Y
Easy Along, Swift Yield
轻松启动, 疾速产出.

ufqinews logo

有福新闻 UfqiNews
这里出现热点全局, 尺寸间一览所有令人关注的疑点焦点;
这里表白条分缕析, 视线内一睹各个脉络清晰的故事主线.
有福新闻 UfqiNews 带来全新的资讯阅览体验, 不信息过载, 亦不信息茧房.

在寻求最大社会共识和满足千人千面之间谋取均衡,
在满足宽泛涉猎与谋求术业专攻之间谋取均衡.
媒介插上人工智能的翅膀将锦上添花, 与资讯比翼双飞.
新闻爱好者的良心之选, 匠心之作.

UfqiNews presents the hot spots globally, with all interesting points at a glance.
Information is organized here and there is a clear storyline within every single detail.
UfqiNews brings a brand new reading experience, no information overload and no information Cocoons,

In seeking a balance of the maximum social consensus and meeting thousands of people for each interest,
In achieving a balance between satisfying a wide range of hunting and pursuing specialization in the industry.
That media is being born with wings of the artificial intelligence will be even more powerful and the information will fly swifter than ever.
Better choices of newsreaders and the art of work from them.

退出移动版