CacheStorage

简介

https://developer.mozilla.org/zh-CN/docs/Web/API/Cache
Cache 接口为缓存的 Request / Response 对象对提供存储机制,例如,作为ServiceWorker 生命周期的一部分。请注意,Cache 接口像 workers 一样,是暴露在 window 作用域下的。尽管它被定义在 service worker 的标准中, 但是它不必一定要配合 service worker 使用.

使用场景

  • 从文档介绍来看CacheStorage主要是为接口请求缓存提供的存取方式,可以用来缓存一些静态文件和接口数据,达到缓存后不再请求网络的目的
  • 接口能力都是异步的
  • 该标准在ServiceWorker下面,但是也可以不再ServiceWorker的上下文内使用

API

该API分为两部分

存储大小

可以参考IndexedDB的存储大小说明
https://iwiki.woa.com/display/~feiyugao/IndexedDB

兼容性

本地存储

前言

这里会从以下几个维度来分析本地存储各项技术的能力和利弊

  •  使用场景
  •  API介绍
  •  可存储的大小限制
  •  兼容性

相关技术

安全性

  • 关于安全性这边的存储方案都采用了同源可操作的存储策略
  • 若要避免DNS欺骗攻击,可以使用TLS(HTTPS)

推荐使用的组件

  • LOCALFORAGE:https://localforage.docschina.org/
    • 前端推荐使用这个,使用方式和localStorage差不多,但是要注意这个是异步的
    • 支持多方案驱动,并支持降级为localStorage
    • 源码比较少,简单易懂
  • 全栈和后端同学推荐:https://github.com/erikolson186/zangodb
    • 拟mongodb的非关系型数据库,语法使用比较相似
    • 仅支持indexedDB

大学同学毕业十年聚会总结

已经工作了的人,生存到现在应该都有相对难忘的时光,之所以难忘,可能是因为在一段时间里受到强烈的刺激,而过后却又无法再回到这段时间的状态。

大学对我算是一段难忘的时光,现在已经毕业十年了,在同学的提议下,我们决定纪念这个十年,组织一次同学聚会。

当年毕业的时候我是班长,所以组织和策划的工作就落到了我的身上,组织策划活动对我这个程序员来说是个不小的挑战。
这个文章算是一个总结,提炼了以下我这次活动的规划、思路、所使用的工具和一些遇到的问题,有需要的同学可以自行食用。

提议聚会这件事,是在2018年的11月份。
一些仍然在长春生活的同学,可能是最近小聚了一下,提到了这件事就找到了我。
虽然性格上比较抗拒这件事,但是既然找到我了,我觉得我也算是有一定的责任做这个事,因此就答应了下来。
类似的经验不多,但工作十年了,做过的项目也不算少,应该可以将一些工作的场景举一反三,学以致用。

分析可行性

咱们开发做事情可不能拍完脑袋拍胸脯,还是得分析一下的。

是否有能力组织这个活动

冷静分析,量力而行。

  • 时间 
  • 因为启动的比较早,所以合理安排的话总是能挤出时间组织的。
  • 精力 
  • 还算年轻、还有激情、老婆乖巧、工作比较顺利,那么问题不大。
  • 能力 
  • 个人比较低调,不是很善于张罗的人,这里可能是个瓶颈。
  • 责任心算是个驱动力,硬着头皮应该也可以搞
  • 资源 
  • 人不在长春,所以筹备起来有一定的不确定性
  • 有同学在长春的学校工作,应该可以缓解这个问题

综上,我觉得还是可以往下进行。

收集同学的参与意向

聚会之所以叫聚会,最低前提也是一群人聚在一起。

  • 先在微信群里询问大家意向,确定参与的人员。
  • 对所有回话的同学做记录,标识可以联系到的人。
  • 对没有在群里回话的同学,一一私聊,确认是可以联系到的,并加到群中。
  • 对没有办法直接联系到的,通过关系网想办法联系到,并加入到群中。

最终,我的班级在毕业的时候是37人,联系到了35人。

这里提到的关系网,主要用到了QQ微信人人网
另外,这种沟通工作充满了不确定性,比如,其中一名同学执意不加群,说是确实什么群都不加,尊重其想法,单独联系。
而对于我,这个环节已经是很顺利了。

调研同学情况,确定聚会时间及细

谁、什么时间、在哪里、干什么。

人员基本确定后,就是确当时间。
比较简单的办法是设计一个投票,让大家投。
我这边是做了一个问卷,一次性确定时间和大家对细节的想法。

这里工具使用的是问卷网
我是从问卷星问卷网中选择出了问卷网,忘记当时为啥没用腾讯问卷了,可能是百度搜索不在前面,也可能是精神集中到问卷本身,而忘记细想腾讯问卷的事了,=。=

问卷问题

  • 姓名
  • 可参与的时间,多选
  • 你希望统一安排住宿么:是 否
  • 聚会的时间段:上去、下午、晚上
  • 希望聚会举办的形式:聚餐、联欢会+聚餐、其他
  • 座位分布的形式:自由就做、以寝室为单位、由主办人员随机分配
  • 你希望聚会资金的承担方式:AA制、我发财了,这次聚会我包了
  • 当年在学校最怀念的馆子:开放题
  • 聚会上想见到的老师:开放题
  • 如果可以你想在聚会上见到谁?(班级之外,学校之内):开放题
  • 关于出席同学聚会你有什么困难?(如果时间上选择不参与才会展示此题目):开放题
  • 关于这次聚会你有其他的想法和建议么?:开放题

对同学填写问卷积极性不高的这个情况,我早有了心里准备,所以我预期有60%的人填写了问卷的时候就形成结论,而这个60%的量,用了整整一个月,而这还是我每周提醒全群一次,同时一个个单独提醒一次才达到的,还是让我有点挠头的。

分析问卷结果

问卷问题很丰富,但是重点只有一个,时间。

虽然选择五一、十一的同学较多,但是大家反应节假日可能都不行,所以问卷这里的时间设定有些问题,但也从数据看出了倾向,于是我最终定在了5月25日星期六这个时间。

后来我总结大家在时间的安排上有着十分复杂的背景在后面,而且各不相同。
另外不选节假日,而且选择普通周末的人最多,是一个很有意思的事。

后面的结论我就不贴图了,简单描述一下

  • 住宿:是 – 9 | 否 – 14
  • 聚会时间段:上午 – 2 | 下午 – 14 | 晚上 – 7
  • 聚会形式:仅聚餐 – 13 | 联欢会+聚餐 – 10
  • 座位分布:自由就坐 – 14 | 以寝室为单位 – 6 | 主办人员分配 – 3
  • 资金承担方式: 没人发财AA制

很多东西是我想多了,住宿、聚会形式、座位分布、老师、想见的人这些事情后面几乎就没有安排了。

从调查结果来看,已经超过半数人有意向参与聚会,那么十年聚会项目正式启动。

规划

人员跟踪

我在 语雀 上对班级人员列了一个名单,根据意向情况分为三类。

  • 参加
  • 可能参加
  • 不参加

并将名单放到 微信 群里公示。

这样做除了有条理,还想给可能参加的同学一定的心里压力,引导他们改变为参加。
而结果告诉我没产生实际效果。

后面根据这个名单,对人员,一个月一次的提醒,以免大家忘了这件事,在聚会当天安排别的事。

群聊天除了公告外,不能艾特所有人对我这种活动组织者还是有点蛋疼。

聚会一个月前,提醒大家请假,并再次确认可能参与的同学意向。

参与人数在接近聚会的时间呈收敛且稳定的状态,我会在半个月前根据这个状态,订制最终的活动方案。

虽然人员越少,组织的难度越小。
但是在临近活动的一个月,大家纷纷表示来不了的时候,心里还是有点难受的,而最后从23人变成了12人。

事前筹备

在等待期间,没有对聚会的内容做直接的筹备,主要就是联系了在校工作的同学和导员,希望他们可以帮助操办。
而因为一些状况,在学校工作的同学退出,并且没有对聚会做任何工作。

有点措手不及,还好我在聚会前一周安排了探亲假,这样聚会的具体事项最终也要我来筹备了。

聚会前三天我先去学校踩点,安排以下事项:

  • 借教室:最好两间,一个放置行李和休息,一个给大家活动,一个也可以。
  • 安排领导见面,主要是以前的系主任
  • 通过院系管理人员联系任课老师,试探是否可以参加
  • 订饭店
  • 因为剩下的同学没有住宿要求,这方面我省心了

这里没想到的是,学校很热情,不但超额满足了以上的请求还为我们安排了其他活动

  • 参观校史馆
  • 见学校董事长(83岁)
  • 理工学院安排接待
  • 纪念品。

这行程一下就丰富了起来,就很开心。

订饭店的时候老板加了我的微信,然后我发现老板在朋友圈每天都发饭店的实况,对于我这种只是了解,但是还没有实际消费的有着不错的宣传效果,订金也是微信付。
对微信使用的开发还挺深的…

聚会

万事俱备

前一天

为了做到宾至如归,我询问了所有同学的行程,还有可以到学校的时间,以保证同学到学校有人接待。
在这个时候我还不知道学校要怎么接待我们,所以我第二天要第一个到学校,至少有我接待老同学。

聚会当天

  • 早上10点到学校,学院竟然安排了迎宾的小妹妹(00后),还有专门摄影的小妹妹,人还挺多,让我感觉回学校倍有面子……
  • 学院提供了两个教室:一个访客室,用来座谈聊天;一个我们上过课的教室,还画了欢迎我们的黑板报。
  • 同学陆续到达,学院给大家准备水和水果,还有签名册、签字海报。
  • 中午安排大家在学校食堂自行点餐,感受下学校生活。
  • 午休后闲聊到2点,跟学院接待的老师比较严肃的聊了一下,还用 NOW 做了直播。
  • 3点游览校园一角,大家看了以前住过的寝室。
  • 3点半大家看望之前的系主任,也是院长。
  • 4点半看望学校董事长
  • 5点观看校史馆
  • 5点半步行移至饭店

整个流程因为由学院的老师跟着,过程还是很顺利的。

聚餐

东北人对吃饭喝酒这种事很是有一套。
在东北聚餐离不开酒,不过现在好的是开车的同学不喝酒,也不会有人劝了,只劝他们喝雪碧可乐,这边喝多少酒,那边喝多少雪碧可乐。
喝了酒以后,大家的话匣子彻底是打开了,劝酒的劝酒,忆当年的忆当年,这里就不展开了。

这里本来也想直播,但是手机电力不足了,而且也怕这帮家伙说话不靠谱,再把我封号了。

正式的聚会餐吃完后,大家觉得意犹未尽,又去撸了个串,再之后就一一挥别,各回各的床了,而此时已是第二天凌晨了。

聚会是AA制 付款使用了微信群付款,感觉还是很舒服的,付款卡里面会提醒谁没有交钱,一定程度上给人拖延付款带来了心理压力,让用户能更及时付款,让我在聚会后不到半天就收齐了款项。

收尾

做事情不能虎头蛇尾,虽然聚会结束了,还是要确认大家安全的。
随后几天,确认了大家各自安全回到了自己的生活,这次聚会才算是彻底结束。

总结

整理一下这次活动的过程,就如文中的大纲一样

  • 分析可行性
  • 是否有能力组织这个活动
  • 收集同学的参与意向
  • 调研同学情况,确定聚会时间及细节
  • 分析问卷结果
  • 规划
  • 人员跟踪
  • 事前筹备
  • 聚会
  • 前一天
  • 聚会当天
  • 聚餐
  • 收尾

得到的收获

  • 将项目的一些东西,运用到了这次活动中,让我在统筹上很顺手,没有遇到太多问题。
  • 没有半途而废。
  • 将一些统计学的知识和生活做了结合,这个有点上瘾。
  • 成就感。

做的不足的地方

  • 直播的计划不够充分,如果弄好直播,多和没参加的同学互动效果可能会更好。不过 NOW 还是比较方便的。
  • 对老师的邀请不够主动,本来是想周末的时间不想折腾老师,让老师以自愿的方式参与,但是事后感觉还是考虑的不够周到,可能会让老师觉得学生没有这份师生情谊,来了会尴尬才不会来。

用到的工具

  • 问卷:问卷星
  • 社交:微信(东北人微信全程语音,我很不习惯)
  • 直播:NOW直播
  • 文档:语雀
  • 付款:微信
  • AA制收款:微信

最后

同学多年后的聚会还是很有意义的,希望大家有机会也可以组织或参与这样的聚会,对比一下你还是不是从前的你,兄弟还是不是从前的兄弟,前女友还是不是从前的前女友(对出轨说不)。

PMP考试总结

惊心动魄的等待

19年3月份的国内pmp考试成绩让人等的心急,本来说1个月就下来了,结果5月末才下来。
一般来说也就是我这种对成绩不是很有信心的人才会这么焦虑。
不过结果是过了,2A2T1B,没太看懂分析,可能是侥幸考过。
考过了自然还是开心的,但因为从成绩来讲是侥幸,所以没啥好骄傲的,对我来说更重要的是这次没有半途而废。

错误的开始

几年前就花1000多人民币在51CTO上买了pmp的课程,那个时候还是第五版,当时觉得有网课比较自由,而且随时可以回看课程,就觉得问题不大。
然而帅不过几个小时,我就没再去看课程了,只是看了一遍第五版的书。
觉得不一定要考试,看书学知识就好了,最终放弃,没有再去考试。

重新再来

之前花钱没有考试,觉得自己有点蠢,正好18年又有人提起pmp考试的事情,我觉得可以再尝试一下。
这次觉得如果是线下的就更好了,可以强迫自己学习。
选择的机构情况是,大多数是线上课,而会有两次线下课程,最终我就又花了2000多人民币报了名。

犯了同样的错误

这次pmp的书已经到了第六版,工作还是比较忙的,而且刚换工作,为了给自己喘息的机会,我决定6个月后考试。
我在前三个强啃了1遍第六版的pmp的书,真的是太枯燥了,也看了几期视频课程,课程还不错,但是每个视频课程都是一整天的(将近7个小时)也比较难熬。
而三个月过后,第一次考试已经结束,我开始有点退缩了,心里告诉自己,知识学到了,不一定非要考试拿到证书,逐渐想要放弃。

改变状态

人很擅长在心理上把自己的行为合理化。

心里一度陷入十分矛盾的局面。
一方面,这次考试本来一个目的就是挑战一次自己,不想半途而废。
一方面,事情确实太多,又怕考不过,本来就是想学到知识,很想放弃。
这个时候老婆强烈建议我,不管能不能考过,至少去考。
这我才定了心,在开考两个月前正式备考。

重头再来

因为之前看过几回书,自以为学到了知识,为了证明这点,我在备考之前,先去做了模拟题。
结果可以说是什么都没有学会。
此时,我恍然大悟,意识到了我之前的学习方式是错误的,自以为是,让我浪费了大量的时间。
先思考我的问题在哪里

  • 流水账看书,没有笔记,没有形成系统
  • 以完成任务的心态看书(没有兴趣),无法吸收内容
  • 没有跟踪做题,对知识点和考点没有归纳
  • 没有认真看视频,自学可能会走很大的弯路
  • 没有参与线下课程,没有同学对比

而后,我改变了策略。

  • 重读一边书,每章都会记录一下笔记,加深印象
  • 这个看书确实是完成任务,这个心态上没法改变,所以每章看完,会做对应的练习题吸收内容
  • 定期做模拟题,寻找考试的大框架
  • 认真看视频,这里因为时间问题,我还是没有看所有的视频,而是挑了分数多的知识点重点看,其他的内容略看
  • 这个机构最终也没有安排线下课程,也没有什么同学群(也可能是我不够积极),所以最终还是靠自己了

以前是抱着学习知识的心态去学习pmp,然而却什么都没学到,还自以为学到了什么。
如今按照考试的心态去学习,在学习过程中反而觉得收获不少,明明看了两遍书,很多知识却好像是刚了解到,而且收获很大。
让我陷入了沉思。

修成正果

工作繁忙,学习紧张,时间就过得很快。
考试当天整个人还是很紧张的,这种紧张来自于对知识掌握的不扎实,而从另一方面我还是很开心的,因为我坚持到了考试。
后面学习的日子,越学越有心得,我暗暗下决心这次要是没过,后面我还是要继续去考。

考试一开始不太顺利,因为是双语试卷,前面的题都比较绕,导致我不太看得懂题目,一度有点懵,后面才慢慢找回状态。
十年不考试了,看着答题卡也是懵的,很有一种涂个流氓兔上去的冲动。

未来会更好

这次考试的过程远比结果意义深刻,可以说启发了我后面对工作和学习的态度。

  • 对自己学习的知识要验证,而不要停留在自以为可以的状态
  • 拖延症的后面很容易变成半途而废,内心的锻炼很重要

当然,学习上还有很多其他的心得和方法,但因人而异这里就不拓展了。

typescript路径映射踩坑

问题由来

我们通常引用一个npm模块,直接引用模块的名称就可以了,如 import module from 'module' 。
但是如果引用自己开发的模块,往往要使用相对路径的方式找到目标模块,如 import myComponent from '../../../components/myComponent' 。
这种方式可以正常开发,可以完成业务需求,但是维护起来就很难弄了,因为通过这种相对路径的方式你很难一下定位这个组件在哪里,在项目复杂的时候,可能会产生预期外的结果。

别名设置

其实这个问题的解决方案已经很成熟了,从各种构建工具及命令中都有相应的设置。
我这里只针对 typescript 做说明,因为他提供的工具集有点坑。

假如我想实现 import myComponent from '@components/myComponent' 。
而我的目录结构为

./
└── src
    ├── components
    └── views
          └── app.ts

tsconfig.json

{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "@components/*": ["src/components/*"]
    }
  }
}

这里的关键配置是 baseUrl 和 paths 
具体说明可以参见文档
https://www.tslang.cn/docs/handbook/module-resolution.html#virtual-directories-with-rootdirs

webpack

假设有一个 webpack.config.js 文件在 ./ 下面

resolve: {
  alias: {
      '@components': path.resolve(__dirname, './src/components'),
  }
}

这个比较基础,直接查看webpack文档就可以了
https://www.webpackjs.com/configuration/resolve/#resolve-alias

通过tsc编译会产生的问题

该文章并不是要教你怎么使用别名,而是 typescript 的开发中有个坑。

用tsc编译的后,映射的路径不会处理,将导致编译后的代码找不到模块

比如上面的 import myComponent from '@components/myComponent' ,如果你使用 commonjs 模式编译后应该是 const myComponent require('@components/myComponent') ,结果就是找不到这个模块。

解决方案一:使用webpack等构建工具进行编译

可以通过 ts-loader 等组件进行编译,来规避掉这个问题

解决方案二:使用module-alias

我现在的场景是,就想使用 tsc -w 来进行开发,那么经过一番寻找,比较优秀的方案就是 module-alias 了。
https://www.npmjs.com/package/module-alias
最简单的用法就是将 const moduleAlias = require('module-alias') 放到你的项目入口处。
然后设置你的 package.json ,以前面的结构为例。

"_moduleAliases": {
  "@components" : "./src/components"
}

这样就可以达到 tsc 编译后,仍然可以找到设置别名的路径了。
至于 module-alias 的原理是什么可以看一下他的npm模块的描述,我就不擅自翻译,免得误人子弟。 

Linux下手动将php5 升级到 7

注:看这篇文章之前,请先确保你有一定服务器的操作知识和一定的php基础,不然的话清尽量找相对熟悉的人指导操作,如果升级中发生任何不可挽回的问题,本人不对其负任何责任。

下载你需要的php版本并解压

我下载的是7.3.4版本

wget http://cn2.php.net/distributions/php-7.3.4.tar.gz
tar zxvf php-7.3.4.tar.gz
cd php-7.3.4

准备安装

生成配置文件

[root@ php-7.3.4]# ./buildconf
buildconf: checking installation...
buildconf: autoconf version 2.69 (ok)
rebuilding aclocal.m4
rebuilding configure
rebuilding main/php_config.h.in

开始配置

下面这条命令是配置php7的安装明细,你需要关心以下几点:

  • 我升级php7是为了支持wordpress
  • 核心的模块是
  • mysql[可选]
  • mysqli
  • pdo-mysql
  • 当前配置 php-fpm 用户组是www,你可以根据你机器的情况再进行修改
[root@ php-7.3.4]# ./configure --prefix=/usr/local/php --exec-prefix=/usr/local/php --bindir=/usr/local/php/bin --sbindir=/usr/local/php/sbin --includedir=/usr/local/php/include --libdir=/usr/local/php/lib/php --mandir=/usr/local/php/php/man --with-config-file-path=/usr/local/php/etc --with-mysql-sock=/var/run/mysql/mysql.sock --with-mcrypt=/usr/include --with-mhash --with-openssl --with-mysql=shared,mysqlnd --with-mysqli=shared,mysqlnd --with-pdo-mysql=shared,mysqlnd --with-gd --with-iconv --with-zlib --enable-zip --enable-inline-optimization --disable-debug --disable-rpath --enable-shared --enable-xml --enable-bcmath --enable-shmop --enable-sysvsem --enable-mbregex --enable-mbstring --enable-ftp --enable-gd-native-ttf --enable-pcntl --enable-sockets --with-xmlrpc --enable-soap --without-pear --with-gettext --enable-session --with-curl  --with-jpeg-dir --with-freetype-dir --enable-opcache --enable-fpm --enable-fastcgi --with-fpm-user=www --with-fpm-group=www --without-gdbm --disable-fileinfo

该配置执行后,需要结果中没有报错,才算成功(不算warning)。
如果碰到了问题,就根据问题解决问题,我碰到了如下的问题:

  • libzip版本不对

开始编译和安装

执行下面代码

[root@ php-7.3.4]# make clean && make && make install

该过程根据网速时间可能会比较长。
该安装执行后,结果中没有报错,才算成功。
完成后需要执行 make test 来进行安装检验,这里没碰到问题,所以这里不做深究。
如果碰到了问题,就根据问题解决问题,我碰到了如下的问题:

  • cp: cannot stat `ext/phar/phar.phar’: No such file or directory

验证模块是否安装到对应目录

上面提到了几个核心模块:

  • mysql[可选]
  • mysqli
  • pdo-mysql

如果你没有特殊做配置,文件一般在 /usr/local/php/lib/php/extensions/no-debug-non-zts-xxxxx 下面
可以参考下图:

配置文件

主要需要配置以下文件

  • php.ini
  • php-fpm.conf
  • www.conf
[root@ php-7.3.4]# cp php.ini-production /usr/local/php/etc/php.ini
[root@ php-7.3.4]# cp /root/php-src-master/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
[root@ php-7.3.4]# cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
[root@ php-7.3.4]# cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf

php.ini

需要将上面的核心模块在 php.ini 中设置为开启,将下面代码添加到 php.ini 末尾

[php]
zend_extension=/usr/local/php7/lib/php/extensions/no-debug-non-zts-xxxxx/opcache.so
extension=/usr/local/php7/lib/php/extensions/no-debug-non-zts-xxxxx/mysqli.so
extension=/usr/local/php7/lib/php/extensions/no-debug-non-zts-xxxxx/pdo_mysql.so

这里要注意的是我为了保险起见在这里设置了绝对路径,你可以根据个人习惯选择使用相对路径。

php-fpm.conf

这里主要是添加日志和配置文件,将下面代码添加到 php-fpm.conf 末尾

######设置错误日志的路径
error_log = /var/log/php-fpm/error.log
######引入www.conf文件中的配置
include=/usr/local/php7/etc/php-fpm.d/*.conf

www.conf

这里是 php-fpm 的进程服务扩展配置

######设置用户和用户组
user = www
group = www
listen.owner = www
listen.group = www
listen.mode = 0660

######根据nginx.conf中的配置fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;设置PHP监听
; listen = 127.0.0.1:9000   #####不建议使用
listen = /var/run/php-fpm/php-fpm.sock

######开启慢日志
slowlog = /var/log/php-fpm/$pool-slow.log
request_slowlog_timeout = 10s

######设置php的session目录(所属用户和用户组都是nginx)
php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/session

其他配置

添加php环境变量

[root@ ~]# echo -e '\nexport PATH=/usr/local/php/bin:/usr/local/php7/sbin:$PATH\n' >> /etc/profile && source /etc/profile

设置PHP日志目录和php-fpm进程文件(php-fpm.sock)目录

#######设置PHP日志目录和php-fpm的运行进程ID文件(php-fpm.sock)目录
[root@ ~]# mkdir -p /var/log/php-fpm/ && mkdir -p /var/run/php-fpm && cd /var/run/ && chown -R nginx:nginx php-fpm
#######修改session的目录配置
[root@ etc]# mkdir -p /var/lib/php/session
[root@ etc]# chown -R www:www /var/lib/php

设置PHP开机启动以及测试配置文件是否正确

######配置开机自启动,增加到主机sysV服务
[root@ php-7.3.4]# chmod +x /etc/init.d/php-fpm
[root@ php-7.3.4]# chkconfig --add php-fpm
[root@ php-7.3.4]# chkconfig php-fpm on
######测试PHP的配置文件是否正确合法
[root@ sbin]# php-fpm -t
[03-Apr-2019 17:50:04] NOTICE: configuration file /usr/local/php/etc/php-fpm.conf test is successful

启动服务

[root@ ]# /etc/init.d/php-fpm start
Starting php-fpm  done

通过命令 ps -aux|grep php 查看启动服务是否成功;
通过命令 php -v 查看升级是否成功;
通过查看 phpinfo.php 页面查看模块是否安装成功;

因为wordpress升级的php7

如果你是因为wordpress升级的php7,那么下面的内容你可能会感兴趣。

nginx

如果nginx启动后页面显示502,你就查一下nginx的日志,我碰到了以下几个问题:

  • fastcgi_pass报错
  • 这里可以看一下上面www.conf配置的第10行,看到 listen = /var/run/php-fpm/php-fpm.sock 
  • 那么你的nginx.conf的配置应该让fastcgi_pass也指向这一行
  • fastcgi_pass unix: /var/run/php-fpm/php-fpm.sock 
  • 如果你有另一个配置 fastcgi_pass unix:/tmp/php-cgi.sock 那么请注释掉
  • Call to undefined function mysqli_connect 找不到mysqli_connect方法
  • 查看php里面的mysqli组件是否没有安装好,可以通过 phpinfo.php 查看到

如果你的nginx没问题了,但是进入wordpress提示建立数据库连接错误,那就去检查 wp-config.php 里面数据库里面的主机设置是不是 localhost ,如果是就改为 127.0.0.1 就好了,同样的方法也适用于 phpMyAdmin 。

问题整理

libzip升级

yum remove libzip -y
wget https://nih.at/libzip/libzip-1.2.0.tar.gz
tar -zxvf libzip-1.2.0.tar.gz
cd libzip-1.2.0
./configure
make && make install
ldconfig

cp: cannot stat `ext/phar/phar.phar’: No such file or directory

进入你的php安装目录

cd  ext/phar/
ls -l
cp ./phar.php  ./phar.phar
make install

Nginx: [error] open() "/usr/local/Nginx/logs/Nginx.pid” failed(2:No such file or directory)

/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

ZendGuardLoader.so: undefined symbol:

php7不再支持该模块,在 php.ini 中移除该模块。

文章安装及配置部分参考:https://typecodes.com/web/centos7compilephp7.html?utm_source=tuicool&utm_medium=referral

手动升级wordpress5.1.x攻略

我之前是4.x版本,虽然用着没啥问题,但是因为习惯了 markdown 的录入,正好又看到 wordpress 5.x 已经默认支持了 markdown 就考虑做一次升级。

升级步骤

  1. 升级前先备份 wordpress 最好也备份一下数据库
  2. 下载安装包到本地 https://wordpress.org/download/
  3. 解压安装包
  4. 如果你是升级,去掉 wp-content 目录,这个目录主要是你的配置文件和主题
  5. 粘贴剩下的文件到线上的 wordpress 目录
  6. 再浏览器输入你的 http://{wordpress_path}/wp-admin/upgrade.php 
  7. 提示需要升级数据库的话,就点击升级wordpress数据库
  8. 完成

升级的问题

升级过程比较简单,我没碰到什么问题,但是升级后发现 5.x 版本推荐使用 php7.x 版本,而我服务器上的是 5.x 版本,然后我就走上了一条艰难的php升级之路。
具体的php升级心得点击这里

接口文档工具横向评测

评测还在继续…

评测对象

评测维度

  • 编写方式
  • UI
  • 与仓库关联
  • 监控仓库状态
  • 导出PDF
  • markdown
  • 兼容性
  • mock
  • 接口调试
  • 开源
  • 自动化测试
  • 插件

评测方式

通过以下方式得出评测结论

  • 网站简介
  • 提交频率
  • 更新频率
  • 产品示例
  • 舆论口碑

注意:因为没有精力一一部署去测试,所以该评测在一定程度上不够客观。

评测结果

APIDOCYAPINEI
录入接口方式
注释/在线编辑在线编辑在线编辑
UI/交互二次开发自带自带
与仓库关联GIT/SVNNN
监控仓库状态YNN
导出PDFhtml,markdown,jsonPDF
markdownYNN
数据兼容性postmanpostman/swagger/json貌似不支持导入
mock根据接口示例生成支持可编程mock支持可编程mock
接口调试Y 需要是可以访问apidoc服务器的机器才可以YY
自动化测试NYN
开源YYY
插件需要自行二次开发Y
社区维护现在仅有我们自己维护持续维护还有维护

评测总结

这里仅是根据上面数据的个人总结

  • 关于录入接口的方式
  • apidoc更全面更方便,更符合开发流程
  • YApi也可以,值得一提的是YApi支持的导入方式比较多,从某个角度来说也可以通过二次开发实现其他的录入方式
  • NEI仅支持在线录入方式
  • UI/交互
  • apidoc完全就是文档管理的界面交互,因为完全是公司的开发,很多细节还有待提高
  • YApi界面也还可以,满足基本需要
  • NEI的页面交互更像是一个项目管理的交互,而不是针对接口的
  • 与代码仓库的关系
  • 除了apidoc其他的平台都没有直接和代码仓库产生联系
  • YApi可以通过插件的方式,自己开发定时任务或者自己二次开发来跟仓库产生联系
  • 导入导出
  • apidoc支持基本的pdf导出和postman及注释文件的导入,正在规划对swagger的支持
  • YApi的导入导出支持的格式比较多
  • NEI仅支持导出PDF
  • mock
  • apidoc仅支持对文档中示例的基本数据mock
  • YApi支持可编程的mock
  • NEI在mock方面支持的非常好
  • 测试
  • apidoc仅支持数据结果的查看
  • YApi支持自动化测试
  • NEI支持单个或批量的接口测试
  • 其他功能
  • apidoc支持markdown的文档输入方式,除了写接口文档,也支持添加技术文档,甚至可以用来记笔记
  • YApi提供二次开发插件的功能,可根据自己的需要自己开发功能
  • NEI仅有当前提供的功能,因为是开源也可以二次开发,但是社区对二次开发的支持度不高
  • 社区维护
  • apidoc因为是个引擎,所以并没有什么社区维护,仅是根据当前的引擎做需要的开发
  • YApi现在的社区相对活跃,官方代码提交的频率也比较高
  • NEI的社区不是很活跃,代码提交频率也不是很高了,不知道会不会后面就没人维护了

写在最后

如果诉求是对文档进行维护和管理,当前内部开发的apidoc应该是首选,潜力也比较大。
但是要是说对接口本身和接口相关的体系进行管理,从外部开源的项目来看,NEI更优秀。
YApi虽然在两个方面都没有达到最好,但因为对插件开发的支持,以及灵活性,并不输NEI。
所以,如果需求只是对接口文档的管理,建议使用apidoc,同样的投入会得到更高的效果。
但是要对接口这边做全局的管理,可以用YApi+apidoc的方式。
下面提出一个思路以供参考:

  • 从代码中的注释生成文档
  • 然后为apidoc增加一个swagger的文档输出服务
  • 再通过一个定时同步服务,将apidoc输出的swagger直接同步给YApi
  • 这样,所有接口的文档部分由apidoc管理同步给YApi,接口的测试和MOCK能力由Yapi来处理

IME输入判断

原始文档

https://developer.mozilla.org/zh-CN/docs/Web/Events/compositionstart

浏览器一般都兼容,但是移动端没有明示网络上说基本支持,可以一用

VUE

vue的input中集成了这个功能
但是这里要注意
input里面监听值的更换有两种方式

// 该方式是支持IME输入判断的
<input v-model="value" type="text">
// 该方式是不支持IME判断的
<input :value="value" type="text" @input="onInput">

可以看一下vue源码
https://github.com/vuejs/vue/blob/52719ccab8fccffbdf497b96d3731dc86f04c1ce/src/platforms/web/runtime/directives/model.js#L34
https://github.com/vuejs/vue/blob/52719ccab8fccffbdf497b96d3731dc86f04c1ce/src/platforms/web/runtime/directives/model.js#L134

IPhone X 适配

关于底部

~'' 是控制忽略编译,不然css-loader在解析的时候会报错

@supports (bottom: constant(safe-area-inset-bottom)) or (bottom: env(safe-area-inset-bottom)) {
  .bottom-bar {
    bottom: calc(~'1.2267rem +  constant(safe-area-inset-bottom)');
    bottom: calc(~'1.2267rem +  env(safe-area-inset-bottom)');
  }
}

env() 和 constant()

iOS11 新增特性,Webkit 的一个 CSS 函数,用于设定安全区域与边界的距离,有四个预定义的变量:

  • safe-area-inset-left:安全区域距离左边边界距离
  • safe-area-inset-right:安全区域距离右边边界距离
  • safe-area-inset-top:安全区域距离顶部边界距离
  • safe-area-inset-bottom:安全区域距离底部边界距离

这里我们只需要关注 safe-area-inset-bottom 这个变量,因为它对应的就是小黑条的高度(横竖屏时值不一样)。

注意:当 viewport-fit=contain 时 env() 是不起作用的,必须要配合 viewport-fit=cover 使用。对于不支持env() 的浏览器,浏览器将会忽略它。

在这之前,笔者使用的是 constant(),后来,官方文档加了这么一段注释(坑):

The env() function shipped in iOS 11 with the name constant(). Beginning with Safari Technology Preview 41 and the iOS 11.2 beta, constant() has been removed and replaced with env(). You can use the CSS fallback mechanism to support both versions, if necessary, but should prefer env() going forward.

这就意味着,之前使用的 constant() 在 iOS11.2 之后就不能使用的,但我们还是需要做向后兼容,像这样:

padding-bottom: constant(safe-area-inset-bottom); /* 兼容 iOS < 11.2 */
padding-bottom: env(safe-area-inset-bottom); /* 兼容 iOS >= 11.2 */

注意:env() 跟 constant() 需要同时存在,而且顺序不能换。
更详细说明,参考文档:Designing Websites for iPhone X