wordpress内核揭秘之day4_到底数据库操作是怎么实现的

来源:互联网 发布:linux卸载httpd服务 编辑:程序博客网 时间:2024/06/05 20:12

"年初的承诺,希望这次能写完dAY10  -------  Sidney"

刚才发了一博客

里面有一段是这么写的

/** * Read records from database by specified fields and values * When 1st parameter is an array, it's expected to be an associative array of field => value pairs to read data by  * When 2nd parameter is a scalar, it's expected to be a field name and second parameter - it's value *  * @param string|array[optional] $field * @param mixed[optional] $value * @param string[optional] $orderBy Ordering rule * @param int[optional] $page Paging paramter used to limit number of records returned * @param int[optional] $perPage Page size when paging parameter is used (20 by default)  * @return PMXI_Model_List */public function getBy($field = NULL, $value = NULL, $orderBy = NULL, $page = NULL, $perPage = NULL, $groupBy = NULL) {if (is_array($field) or is_null($field)) { // when associative array is submitted, do not expect second paramter to be $value, but act as if there is no $value parameter at all$groupBy = $perPage; $perPage = $page; $page = $orderBy; $orderBy = $value; $value = NULL;}! is_null($perPage) or $perPage = 20; // set default value for page length$page = intval($page);$sql = "FROM $this->table ";$sql .= implode(' ', $this->joined);if ( ! is_null($field)) {$sql .= " WHERE " . $this->buildWhere($field, $value);}if ( ! is_null($groupBy)) {$sql .= " GROUP BY $groupBy";}is_null($orderBy) and $orderBy = implode(', ', $this->primary); // default sort order is by primary key$sql .= " ORDER BY $orderBy";if ($page > 0) {$sql = "SELECT SQL_CALC_FOUND_ROWS $this->what $sql LIMIT " . intval(($page - 1) * $perPage) . ", " . intval($perPage);} else {$sql = "SELECT $this->what $sql";}$result = $this->wpdb->get_results($sql, ARRAY_A);

刚才博客也说了,这是一个10w行代码里面找出来的一个小片段

(这10万行代码还只是为了实现一个csv上传的功能)

这个小片段来源于一个大mvc框架(非wordpress框架)里面的model层的一个查询数据库的实现

整个片段代码也只有最后一句话有用:

$result = $this->wpdb->get_results($sql, ARRAY_A);

也就是这句话应该彻底解决了所有人的迷思:

“”无论再大的框架,最终还是拼装spl,做数据库查询,通过wordpress的db,wpdb做查询,只是人家做得比较优雅而已“”


别指望写一个什么算法,什么框架就能一次解决所有问题
人家写了10w行代码,也只是封装了个数据库查询,做了一些定制功能,仅此而已,还根本没解决数据库查询问题

我们还是先搞清楚这个wpdb->getresults这个方法到底怎么实现的?
难道还是每次调用都查一次数据库?没有缓存的?缓存又在哪里呢?
估计get_results这个方法里面有可能包含几万行代码,
我不知道,写了10年从未分析过
就让我们来看看里面到底什么鬼吧。。。。

其实好像也没什么秘密
wpdb里面
有一个内部和外部都可以使用的public function query
有一些内部属性,例如:last_result等
用于输出
输出结构包括:
Array,--这个是我唯一知道的,php里面的神器,那些还在研究hashmap和 vector有什么区别的咋不上天,哦不好意思这事java的
ArrayN,--不懂
Object,
ObjectK, --怎么还有k,不懂

db_getresult的方法实在就是这么简单粗暴,没什么秘密
public function query($query){  //...  $query = apply_filters( 'query', $query );  //...重要的原来在后面}

所以难免要了解wordpress更核心的方法:apply_filters和apply_action,其实这个我现在也是不懂的,这个放在day5揭秘
翻查wordpress内核的代码5分钟后,发现完全没有query filter的实现方法
所以可以肯定"apply_filters('query',$query);"和数据库查询并没有什么实际关联
(事实上,apply_filter('query',$query);也只是开放给开发者的接口而已,可能某个天才开发者,用了这个接口就能写出一个完全反转的query查询,但实际开发过程中,只会引入无穷无尽的bug,动则白屏,这也是apply_filters和wordpress内核一直给人诟病的原因,但可能还有人没看出我在吐槽,先想想你是哪种开发者把。。。。)

db_getresult的真正实现方法:
public function query($query){  //...  $query = apply_filters('query',$query);  //...  if ( ! empty( $this->dbh ) && $this->use_mysqli ) {$this->result = mysqli_query( $this->dbh, $query );  } elseif ( ! empty( $this->dbh ) ) {$this->result = mysql_query( $query, $this->dbh );  }}
(记得以前好像还可以支持oracle和mysql,现在明显就是mysql比较好)

wordpress的wpdb秘密就是mysql_query,也就是仅仅是一个查询封装而已。。。。。。。事实还是很骨感的
我上篇说的wp-all-import插件更骨感,10w行左右的代码,仅仅也只是封装wpdb查询而已
我们其实也很骨感,写那么多年程序,也仅仅是封装sql查询而已
最近2年很多程序猿有这种声音
“我肯定不满足于现状,仅仅是insert select做一些简单封装调用。体现不出我的价值”
我真想问,so?
人家写10w行代码,做得这么优雅,这么有经验,也还仅仅是insert select,做一些简单封装调用而已
所以还是面对现实吧,程序猿

其实整个wpdb的秘密就是这么简单的一个结构

0 0