guiyumin 发布的文章

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文件有漏洞,所以最终还是需要考虑重构这个安装过程的。

在网络环境日益复杂的今天,就连Chrome浏览器都强制要求HTTPS了,否则就会把你的网站标记为不安全网站。所以需要强制设置HTTP请求到重定向到HTTPS。

如果使Cloudflare的话,其实他们有这个选项,所以你其实什么都不用做,开启这个选项即可。

如果在Nginx端做设置的话,就需要用到一个配置:

- 阅读剩余部分 -

我这个博客就是用Typecho搭建的。刚才把var改为了core,把usr改为了exts,。

这俩目录其实在第三篇分析文章里讲过,分别是Typecho的核心类,以及插件和主题的目录,那么既然是核心类,那就是core里;既然是插件和主题,那就是对这个核心类的改进和增强,便于开发者进行二次开发,所以就是扩展exts

其实这个exts里,还有隐藏的设置,包括语言包(langs),备份(backups)和上传目录(uploads)。这些都是在改这个目录名的时候发现的隐藏设置,如果不看代码,是不知道的。这个对开发者是真的不太友好。

我会考虑增加一个vendors目录,把一些优秀的第三方库涵盖进来。

鑫鑫小店这个项目里,我走得更远,更激进,把core目录下的三个目录也改为lowercase了。然后,我发现了一个神奇的事,就是所有的class仍然可以正确加载。

Typecho的类加载机制是这样的,Typecho_Common::init这个函数,把所有的类名都做了处理,下划线(_)都被\替代了,就把className转换为php文件的路径了。我使用print_r函数把所有加载的className和转化之后的路径都打印出来过,都是首字母大写的,比如Typecho_Common,路径就是Typecho/Common.php。但仍然可以在typecho这个lowercase的目录里找得到这个Common.php文件。

但是,同样的事,如果在本博客的项目代码里做,就会报错。

所以到此为止,事情就变得非常因吹斯听了。

- 阅读剩余部分 -