今晚把这个网站的 VPS 服务器升级到 PHP7,感觉网站在 PHP7 下的响应速度比 5.4、5.6 时快了稍许,再配合 pagespeed 速度优势明显,要是再加上 cloudflare 估计会更快。我的 VPS 是 256M 的 OpenVZ,探针显示 PHP7 下服务器内存占用相比 5.x 时有降低。

WordPress 升级 PHP7

上面说的都是好处,其实问题也很多。

兼容性问题

WordPress 程序本身完全兼容 PHP7,但是,有部分插件或主题可能会有不兼容的问题。

在用的 WP Super Cache、Akismet、Google XML Sitemaps 和 Comment Email Reply 这几个插件暂未发现兼容性问题。倒是上面一个同学的网站使用了国内的开源 PHP 程序不兼容 PHP7,直接挂掉了。

由于是刚发布的新版本,部分模块/扩展可能短时间无法及时跟进,技术文档相对欠缺,升级、调试甚至恢复必然要花费时间精力等成本。

昨天早上曾试图升级 PHP7,无奈有一处错误一直过不去,不能耽误孩子的周末,作罢,结果昨晚回家重启了一下 VPS 数据库死活启动不了…

综上,如果不是非升不可,建议等上一段时间,待条件成熟相对稳定了再升级。

特定条件下 Home 键失灵:

表现为:屏幕锁定隔一段时间后按下 home 键无法激活(点亮)屏幕,第二次再按一切正常:亮屏、解锁…

少数情况无法自动锁定:

设定一分钟自动锁定,奇怪的是有个别时候静置很久却没有自动锁定,哪怕是在主屏幕。

偶尔无法清除通知栏消息:

出现通知栏消息无法清除的频率很低,一共遇到三次:IFTTT、QQ 和 inbox 各一次,重启系统后可正常清除。

现在看来,除了权限控制还是 moto x 用的顺手。

这个博客自开始使用无限滚动至今已有好长时间了。最开始用的是 infinite-scroll 这个插件来实现无限滚动,这个插件有很长时间没有更新了,jQuery 在这期间都迭代几个版本了,作者大概也不想花心思在这个插件上面了,说实话尽管如此它仍能很好地忠于本职工作,最近偶然用了一次 IE8,无限滚动竟然不能正常工作了,这可不行。并不打算弄清楚具体是什么原因导致的了,只是想换一种实现方式。

于是,找到了 JScroll,这个比 infinite-scroll 要轻一些,功能和使用方法类似,有一个不好地方是 JScroll 在实现分页的时候会在每页容器内另加一层 div 包围,同时 IE8 上扔然有些小不完美,勉强也可以接受,在本地调试成功。谁知上传到服务器后特么的死活不滚了,还找不原因,看代码啥的也没问题,到底是肚子痛还是四肢麻木无从知晓,真是有缘无分(后来用了接下来的这个插件才找出来原因:问题出在 nginx 配置的一个插件的设置上),这给了我认识下面这个插件的机会。

周二晚上回家的路上,无意找到了 infinite ajax scrollgithub地址),简称 ias,这是个商业插件,非盈利性网站可免费使用,最新版本是v3.0.1,用法跟前面两个相似:

第一步:

1、下载 jquery-ias.min.js,把jquery-ias.min.js文件放到主题目录下的 js 文件夹里。

2、查看主题是否已经加载了 jQuery 库,如果没有那么打开主题目录下的footer.php文件,把下面一行代码粘贴在</body>标签之前,这是 cloudflare 免费提供的 jQuery 公共库,好处是支持 https:

<script type='text/javascript' src='//cdnjs.cloudflare.com/ajax/libs/jquery/1.11.1/jquery.min.js'></script>

3、接着加载jquery-ias.min.js:把下面一行代码放到上面代码的下面。

<script src="<?php echo get_template_directory_uri(); ?>/js/jquery-ias.min.js" type="text/javascript"></script>

第二步:

查看页面的 div 结构,目的是为第三步做准备:

<div id="content">
	<div class="post">日志一</div>
	<div class="post">日志二</div>
	<div class="post">日志三</div>
</div>
<div class="pagination">
	<a href="/page2/" >next</a>
</div>

第三步:

infinite ajax scroll 共有4个必要的配置参数,分别是:containeritempaginationnextdelaynegativeMargin可选,不建议修改)
并且需要和第二步 html 代码里的 id 或 class 做如下的映射关系方可正常工作:

container 对应 #content
item 对应 .post
pagination 对应 #pagination
next 对应 .next

映射完毕,得到如下的代码,放到第一步<script src="<?php echo get_template_directory_uri(); ?>/js/jquery-ias.min.js" type="text/javascript"></script>所在行的后面:

<script type="text/javascript">
	var ias = $.ias({
		container: "#content",
		item: ".post",
		pagination: ".navigation",
		next: ".navigation a",
	});
</script>

添加完毕,刷新一下即可无限滚动了。

这个插件还支持扩展

半自动加载,更改手动加载提示文字

启用后默认一滚到底,如果想搞点个性的也是可以的,如从第五页开始手动加载offset: 5,手动加载的提示文字为加载更多...,那么代码如下

ias.extension(new IASTriggerExtension({
	offset: 5,
	text: '加载更多&hellip;',
	html: '<div class="ias-trigger ias-trigger-prev bee"><a>{text}</a></div>'
}));

更改 gif 图片:

ias.extension(new IASSpinnerExtension({
	src: "gif图片地址",
	html: '<div class="ias-spinner bee"><img src="{src}"/></div>'
}));

更改末尾的提示文字:

ias.extension(new IASNoneLeftExtension({
	text: '已到结尾',
	html: '<div class="ias-trigger ias-noneleft bee">{text}</div>'
}));

把上面的扩展代码添加到第三步</script>前面就成了。

除了滚动日志列表,还可以滚动评论,滚动文章内容。

参考插件网站获取更多个性设置:http://infiniteajaxscroll.com

将 gif 转换成代码内嵌到代码中

上面更改 gif 图片时会用到 gif 的路径地址,特别是在 js 文件中是很不方便的,可以把 gif 图片通过 base64 编码转换成一串代码(data URI)内嵌到代码中,通过浏览器访问的时候,会把代码解读还原成图片,很方便,这里有一个在线转换服务,可以转换 JPG、PNG、GIF 或 BMP 格式的图像文件:
https://www.base64-image.de

优点:自然是免去更改文件位置带来的麻烦,减少 http 请求。
缺点:IE8 以下(IE6、7,不包括IE8)的浏览器不支持,IE8 只能支持最多 32KB 的 data URI。

上周启用了 https,昨天偶然使用 IE8 竟然打不开我的网站了,连链接都没有建立,刷新、清缓存、InPrivate 都不行,换 Chrome 也不行,还好 Chrone 有错误提示:
ERR_SSL_VERSION_OR_CIPHER_MISMATCH

唯有我常用的 Firefox 可以正常打开,忘了说,我的操作系统是 Windows XP。

我的主题对 IE 家族做了特殊照顾,向下兼容到 IE6,如果单单是 IE8 以下的浏览器打不开这还能接受,但是 Chrome 也打不开,这就不能接受了。Google 一下ERR_SSL_VERSION_OR_CIPHER_MISMATCH这个错误,在 nginx 网站找到一个答案,说要启用 SNI。然而,这并不是造成以上问题的原因,真正的原因是 cloudflare 的免费CDN 对使用 TLS 协议封装加密的 https 做了限制,要求客户端浏览器必须支持 TLS 的 SNI 扩展,而 XP 系统上 IE、chrome 都不支持 SNI。

SNI 是什么

简单来说 SNI 是 TLS 的一个功能扩展,有了 SNI 就可以在单个 IP 上启用多个 SSL 证书,现实一点说就是可以在只有一个 IP 地址的 VPS 上建立两个或更多的 https 网站了。

关于 SNI 这里有详细介绍:
http://blog.layershift.com/sni-ssl-production-ready

支持 SNI 的浏览器

当今地球上支持 SNI 的主流浏览器如下:

  • Opera 8.0 及更新版本;
  • MSIE 7.0(Windows Vista 或更新版本,XP 下的 MSIE 不支持 SNI);
  • Firefox 2.0 或使用 Mozilla 1.8.1 及更新平台的其它浏览器(的确牛逼);
  • Safari 3.2.1(Windows Vista 或更新版本);
  • Chrome(Windows Vista 或更新版本)。

详情请参见:
http://nginx.org/en/docs/http/configuring_https_servers.html

OpenSSL 对 SNI 的支持

OpenSSL 自 0.9.8f 开始支持 SNI(选配),选配参数--enable-tlsext
OpenSSL 0.9.8j 开始默认启用 SNI。

检测 nginx 是否启用 SNI

nginx -V
出现:
TLS SNI support enabled
即表明 SNI 已启用。

多个SSL证书报错

在有 SNI 之前,以往一个 IP 地址只能存在一个 SSL 证书,否则会提示证书错误。

cloudflare 的免费CDN 只适用于支持 SNI 的浏览器

用了 cloudflare 的免费CDN,速度确实快了很多很多,但是,上面说了 cloudflare 的免费 CDN 限制采用 TLS 封装的 https 只有在支持 SNI 扩展的浏览器才能正常访问。

表现为:

  • IE(6、7、8)无法建立连接。
  • chrome 提示:
    ERR_SSL_VERSION_OR_CIPHER_MISMATCH

本可以不对客户端的浏览器做 SNI 限制,这样做很大一部分原因可能是从成本或产品策略考虑。结合上面说的支持 SNI 扩展的浏览器,也就是说在 Windows XP 下的 IE全线、chrome 浏览器都无法通过 https 方式访问,这恰恰是企业无法忽略的。

这个不该成为问题的问题困扰了我两天时间,一直到当我怀疑这是 cloudflare 免费CDN的限制的时候,停掉 cloudflare 的免费CDN,问题才不解自破。

回头再看,cloudflare 的页面上有这方面限制的明确说明,只能怪自己做事不仔细。

如果同一服务器启用多个 https 网站后无法访问,可能有以下原因:

  1. 服务器只有一个IP地址(有多个IP需做配置);
  2. 服务器没有启用 SNI;
  3. cloudflare 的免费CDN 对使用 TLS 协议加密的 https 做了限制,要求浏览器必须支持 TLS 的 SNI 扩展。

还有多少人使用 Windows XP

有多少人使用 Windows XP 这个问题无从知晓,但Google 统计显示在访问我博客的Windows用户中,Windows XP约占36%,以实际访问量来换算,除了我自己之外,大概很少很少有其他人了,所以,目前不用急着去解决启用 SNI 后 Windows XP 的兼容问题。

同事的 iPhone 6 plus 屏幕摔坏了,虽然尚能正常显示,实际却已伤及内屏致使触摸失灵,不得不花钱换屏。本想搜索下就近提供换屏服务的维修点,谁知前排跳出来上门维修的信息,毫无疑问这是推广广告,还是电话过去:说明情况,得到报价,确认维修,约定时间。前后两分钟不到,一气呵成。

接近下午五点,同事的电话响了,无法完成接听操作,乖乖回过去,原来是早上约的维修人员按时上门…

架上行车记录仪,摆好工具,开始询问和检测手机,说明保修政策和范围(所换屏幕非人为损坏一年),拆-换-测-装,搞定,同事检查确认没问题,总费用530,支持现金、支付宝和微信付款,付款后给了凭据,转发一条他们上门维修手机的微博,可以免费给屏幕贴膜,同事死皮赖脸不肯发,那小哥也没强求,还是免费贴了。

维修过程中我们跟维修小哥交谈,他在这家手机维修公司上班,专修苹果手机,平均每天要修6部手机,各种问题都有,多半是屏幕故障。这次换的屏幕不是原厂的,是他们公司认证的屏幕。也提供内存升级128G服务,因条件限制无法上门,必须回公司完成。

维修小哥在认真检查手机
维修小哥在认真检查手机

这次手机维修,从上门到离开,前后不到四十分钟,500块到手,一天修6部,我都想去学修手机了。乔布斯的伟大之处在于不但能让自己的企业赚大钱,同时还能让周边产业人员赚大钱,这是核桃终结者诺基亚所不能及的。

这位同事是去年购买的这部 iPhone 6 plus,至此已是第三次人为损坏,三次全是换屏,第一次换屏花费1400元,第二次换屏400+(维修小哥拆机时发现第二次换的屏质量不行),加上这次的维修费,这部 iPhone 6 plus 已经让他花掉一万块钱了。

算完上面这笔帐,我毫不犹豫地电话购买了 Apple care+ 服务。