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

"年初的承诺,但愿此次能写完dAY10  -------  Sidney"php

刚才发了一博客java

里面有一段是这么写的mysql

/**
	 * 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上传的功能)sql

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

整个片断代码也只有最后一句话有用:缓存

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

也就是这句话应该完全解决了全部人的迷思:oracle

“”不管再大的框架,最终仍是拼装spl,作数据库查询,经过wordpress的db,wpdb作查询,只是人家作得比较优雅而已“”app


别期望写一个什么算法,什么框架就能一次解 决全部问题
人家写了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的秘密就是这么简单的一个结构