有福新闻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/ulongpage.1507.html?tit=Java開發手冊-阿里巴巴-嵩山版-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/oniguruma 一份源代码,手工编译&安装之后才通过。
解决了 oniguruma 这个问题之后,在编译PHP8的时候,还遇到 ext/geoip 无法编译通过的情况,后来通过手工下载 https://github.com/rlerdorf/geoip 一份重新放入 ext/geoip 才算通过。
尽管解决了那么多问题,具体PHP8兼容性问题,还没有显现。由于担心会出现异常,我们选择在深夜流量较小的时候找一台服务器进行试装,结果就遇上重启之后大面积报错的情况,举凡遇到 count 和 implode /explode等地方,都需要手工增加相应类型或数据安全检查代码。
顺带的昨晚还未被 Hanjst ( https://ufqi.com/dev/hanjst/ ) 替换掉的PHP Smarty模板引擎,一样随着PHP8的升级,触发一团糟的问题,服务被迫终止了一会。庆幸我们在后续的GWA2中将逐渐解耦模板引擎,使用 Hanjst替换掉Smarty,与服务器端开发语言不再绑定。
再一次的惊魂一夜!再次印证了,不要就近升级到软件的最新的latest stable release,惊魂大于惊喜。
再次印证了,能跑的系统,尽量避免升级,各种问题会导致业务被迫中断。智者千虑,必有一失。
—-
附记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
这里呈现热点全局, 尺寸间一览所有令人关注的疑点焦点;
这里表达条分缕析, 视野内一睹各个脉络清晰的故事主线.
有福新闻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.
惊魂一夜!有福新闻UfqiNews升级到PHP8 | -UFQI-Blog