wordpress启动初始化过程 -尊龙游戏旗舰厅官网
2019独角兽企业重金招聘python工程师标准>>>
wordpress是免费开源的用php开发的博客平台,功能十分强大,中文友好,使用mysql数据库,安装非常方便。但是功能强大的同时也带来笨重、繁琐的感觉。
这里尝试分析解读下wordpress的源码,也作为自己学习php的笔记。ps:php开发工具推荐zend studio。
wordpress安装完毕后,在目录文件如下图:
访问wordpress博客,默认定位到index.php文件,打开index.php,代码非常简单,就两行:
define('wp_use_themes', true); require('./wp-blog-header.php');第一行定义wp_usr_themes常量的值为true,第二行包含并运行文件wp-blog-header.php。打开wp-blog-header.php文件,代码也非常简单:
if ( !isset($wp_did_header) ) {$wp_did_header = true;require_once( dirname(__file__) . '/wp-load.php' );wp();require_once( abspath . wpinc . '/template-loader.php' ); }首先检测$wp_did_header是否设置,由于是首次执行,没有设置,进入if语句。定义$wp_did_header变量,然后包含并运行当前目录下的wp-load.php文件。__file__取得当前文件的路径和文件名,然后dirname()函数取得当前路径。这里将剩下代码入栈1->wp-blog-header.php。
进入wp-load.php文件,压入栈方便记忆1.wp-load.php->2.wp-blog-header.php。这个文件主要用于设置绝对路径常量,加载wp-config.php文件,进而加载wp-setting.php文件,来建立起wordpress的变量信息。如果wp-config.php没有找到,会要求安装者手动进行一些设置。看一下wp-load.php源码:
define( 'abspath', dirname(__file__) . '/' ); error_reporting( e_core_error | e_core_warning | e_compile_error | e_error | e_warning | e_parse | e_user_error | e_user_warning | e_recoverable_error ); if ( file_exists( abspath . 'wp-config.php') ) {require_once( abspath . 'wp-config.php' ); } elseif ( file_exists( dirname(abspath) . '/wp-config.php' ) && ! file_exists( dirname(abspath) . '/wp-settings.php' ) ) {require_once( dirname(abspath) . '/wp-config.php' ); } else {// a config file doesn't exist// set a path for the link to the installerif ( strpos($_server['php_self'], 'wp-admin') !== false ) $path = 'setup-config.php';else$path = 'wp-admin/setup-config.php';define( 'wpinc', 'wp-includes' );define( 'wp_content_dir', abspath . 'wp-content' );require_once( abspath . wpinc . '/load.php' );require_once( abspath . wpinc . '/version.php' );wp_check_php_mysql_versions();wp_load_translations_early();require_once( abspath . wpinc . '/functions.php' );// die with an error message$die = __( "there doesn't seem to be awp-config.php
file. i need this before we can get started." ) . '';$die .= '' . __( "need more help? ." ) . '
';$die .= '' . __( "you can create a wp-config.php
file through a web interface, but this doesn't work for all server setups. the safest way is to manually create the file." ) . '
';wp_die( $die, __( 'wordpress › error' ) ); }
设置常量abspath,error_reporting()函数设置php的报错级别。然后尝试加载wp-config.php文件,由于wordpress已经成功安装,该文件一般是存在的。
进入wp-config.php文件,压栈1.wp-config.php-->2.wp-load.php-->3.wp-blog-header.php。这个文件是wordpress的配置文件,包含数据库等一些信息。
设置数据信息:
define('db_name', 'wordpress');//数据库名 define('db_user', 'root');//数据库用户名 define('db_password', 'toor');//数据库密码 define('db_host', 'localhost');//数据库主机 define('db_charset', 'utf8');//数据库字符编码格式随后是define一些身份密钥,不再解释。设置数据库表前缀和wordpress的语言:
$table_prefix = 'wp_'; define('wplang', 'zh_cn');最后开启开发者模式,最后加载wp-setting.php文件。压栈1.wp-setting.php--> 2.wp-load.php->3.wp-blog-header.php。
wp-setting.php主要来设置wordpress运行的一些变量和库文件。
require( abspath . wpinc . '/load.php' ); //加载load.php require( abspath . wpinc . '/default-constants.php' ); require( abspath . wpinc . '/version.php' );wp-setting.php又加载上面三个php文件,分别进去查看。load.php声明了wordpress需要的很多函数,没有什么动作执行。default-constants.php声明了一些可以被重写的函数。version.php定义了wordpress需要的组件的版本信息。
然后是调用load.php,default-constants.php中的函数,如下
后面又加载了一些php文件:
require( abspath . wpinc . '/compat.php' );//兼容之前的版本,声明一些可能不存在的函数 require( abspath . wpinc . '/functions.php' );//声明了大量的函数,wordpress的函数几乎都在里面 require( abspath . wpinc . '/class-wp.php' );//声明wordpress的类,main就是在这里声明的 require( abspath . wpinc . '/class-wp-error.php' );//声明了错误处理的函数 require( abspath . wpinc . '/plugin.php' );//获取插件信息 require( abspath . wpinc . '/pomo/mo.php' );//mo语言库class-wp.php文件中声明的主函数:
function main($query_args = '') {$this->init();//初始化环境$this->parse_request($query_args);//解析请求$this->send_headers();$this->query_posts();$this->handle_404();$this->register_globals();do_action_ref_array('wp', array(&$this));}这些函数都是通过wp-blog-header.php中的wp()函数调用。后面wp-setting.php文件又初始化了一些全局变量,初始化了wp对象,并初始化。
$wp = new wp(); $wp->init();
回到wp-load.php文件。这是wp-config.php文件存在的情况,如果wordpress安装不完全造成该文件不存在,就会进入elseif流程,elseif中首先判断wp-config.php是否存在父目录中,如果父目录不是wordpress的另一个安装版本,就从父目录加载wp-config.php。
最后进入else流程,没有找到wp-config.php文件,因为wp-config.php文件包含了数据库等必不可少的信息,所以程序无法进行下去,就要求用户重新设置wp-config.php文件。
if ( strpos($_server['php_self'], 'wp-admin') !== false )$path = 'setup-config.php';else$path = 'wp-admin/setup-config.php';define( 'wpinc', 'wp-includes' );define( 'wp_content_dir', abspath . 'wp-content' );require_once( abspath . wpinc . '/load.php' );require_once( abspath . wpinc . '/version.php' );wp_check_php_mysql_versions();wp_load_translations_early();require_once( abspath . wpinc . '/functions.php' );首先判断当前路径是否为wp-admin,$_server['php_self']用来取得当前运行脚本的路径和文件名,strpos()函数取得指定字符串的位置。总之这几行代码的作用就是要加载wp-admin/setup-config.php文件,来重新生成wp-config.php文件。setup-config.php文件就是展现安装时让你填写数据库信息的页面:
对于安装过程,不再多说。wp-load.php完毕,回到wp-blog-header.php文件,调用wp()函数,进而调用wp-class.php中的main函数。
$this->parse_request($query_args);上面的函数就是个死循环函数,不断地接受浏览器的请求,进行解析。
转载于:https://my.oschina.net/u/147181/blog/164824
总结
以上是尊龙游戏旗舰厅官网为你收集整理的wordpress启动初始化过程的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: web前端资源汇总
- 下一篇: c#图片上绘制半透明矩形