当然,首先这个是用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文件。

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

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

- 阅读剩余部分 -

这里讲一个非常细致的知识点,就是returnecho的区别。

为什么说这个知识点呢?因为在Widget_Options这个类里面,有7个函数,使用的是echo,而不是return

一开始我还用echo来调试来着,想看看里面的某些变量的值,但发现总报错,然后就意识到,莫非echo会结束这个函数?查文档发现,仅仅说echo会以string的形式输出一些变量的值,而且echo并不是一个真正意义上的函数,因此不需要括号即可。

但echo是否会结束这个函数的执行,类似return呢?答案是肯定的。

再通过google发现,return是返回一个结果,你可以把这个结果储存在某个新的变量里,然后随后调用。这显然是废话。但echo,是直接返回一个结果,你没法把这个结果储存起来,算是一次性的吧。

这俩的区别用通俗的语言来解释就是,你问一个人一个问题,如果是return,你会从他这里拿到结果,然后自行处理,比如保密,比如转告别人,等等,都可以。但echo就是,你问了一个问题,这个人立刻把结果告诉所有人,就不需要你这个中间人了。

总之,用echo肯定不是一个好的practice,因此我把这个Widget_Options里的所有echo都换成return了。

好,这个更改,带来的副作用就是大量的报错,因为在admintheme里,有大量的地方直接用到某个option,所以我还要在这些页面里添加echo,当然最好是用<?= ?>这样的shortcut。

逐个文件搜索,改动,工作量大的一笔。