guiyumin 发布的文章

比如说,你新增了一个文件,hello.js,还对world.js文件进行了一些修改,但后来你又不想要这些变动了,于是执行git checkout -- .命令。

好,world.js恢复了原样,所有修改都丢弃了,但你发现hello.js文件还在。这咋办?

- 阅读剩余部分 -

最近一直在考虑开源产品的问题。

全新建立一个自己的开源产品简直太难,但如果做一个基于某个已经非常成功的开源产品来改造,为某一方面的需求提供特别定制,会不会有回报呢?

wordpress显然已经非常成功了,那么,这个时候要考虑的问题就是怎么样满足某一部分用户的需求。

比如,基于woocommerce做的电商插件很好,能否改造为高性能而进行一些改造?

Typecho改造为一个电子商务程序的想法,其实有一定的合理性。毕竟考虑到普通用户一键安装的需求,不需要composer,不需要下载任何东西,即可。

这个思路其实有一定的合理性的,比如说,wordpress有一个woocommerce插件。wordpress本身就是一个CMS,然后加个插件,即可把CMS转化为电商。然而这是美国的思路,美国的思维方式。中美在建站的方法上有着非常巨大的差异。

而且受限于个人水平,其实还是太慢了。如果有团队协作,这个方法肯定还是非常靠谱的。

当然,首先这个是用PHP实现的。
然后呢,本质上是获取$_SERVER这个超全局变量,解析为key-value对,然后再对path进行解析 ,用到一个所谓UrlParser
最后根据解析出来的参数,返回对应的内容。

这里可以搞得很复杂。
比如说,你可以内部对URL进行redirect,而不是通过Nginx或者Apache。当然,你仍然需要设置Apache或者Nginx,把所有请求都转发到index.php,然后再把所有请求进行内部解析。

还比如说,你可以对解析URL之后的事做OOP,加一层controller,搞成MVC pattern。反正吧,要想搞的非常复杂,可以尽管搞。再加一个DAO层,再加一个Service层。加吧,一直往上加。

加着加着,你就发现你开始写PHP框架了。咦,我要干什么来着?哦,对了, 写电商啊。

今天来说说install.php这个文件里的一行,大概是52行,ob_start();

首先,看看这个ob_start函数做什么的。在执行某个函数之后,如果会有echo等操作,这些echo出来的内容会立刻返回给浏览器,所以可以让这些内容暂时存放在buffer里, 也就是缓冲区,然后等到合适的时候,手动发送(flush)这些内容到浏览器。

好,为什么Tyecho要用到这个函数呢,因为有报错,在这里,
http://forum.typecho.org/viewtopic.php?f=24&t=10481
https://github.com/typecho/typecho/issues/644
然后就有了一个修复,https://github.com/typecho/typecho/commit/f2dc80592e20b4ddaff7079cce9ac4ff8aaffbeb

但问题来了,这个fix会删去对ob_end_flush函数的调用,至于为什么,因为文档里有这么一段话:

https://www.php.net/manual/en/function.ob-end-flush.php
ob_end_flush() isn't needed in MOST cases because it is called automatically at the end of script execution by PHP itself when output buffering is turned on either in the php.ini or by calling ob_start().
简单翻译就是,这个ob_end_flush会在php脚本结束的时候自动调用,只要这个缓冲(output buffering)被开启了。
注意,这个output buffering可以在php.ini里开启,也可以在代码里用ob_start()开启。

但这个评论被downvote了,不知道为什么。

但不管怎样,这个install.php只有ob_start,这个也正说明了会有一个自动的发送buffer到浏览器的过程,不用你手动发送(flush,send)的。

这个问题,困扰了我两天。

至于这个install.php的处理方式是否是最好的,我觉得怎么说呢,这个文件是一次性用品,所以粗糙一点也未尝不可,只要一切顺利。写代码还是要看个费效比的。
我会对这个安装流程做修改,但这现在不是最优先的事项。

最后,这个install文件有漏洞,所以最终还是需要考虑重构这个安装过程的。