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 a <code>wp-config.php</code> file. I need this before we can get started." ) . '</p>';$die .= '<p>' . __( "Need more help? <a href='http://codex.wordpress.org/Editing_wp-config.php'>We got it</a>." ) . '</p>';$die .= '<p>' . __( "You can create a <code>wp-config.php</code> file through a web interface, but this doesn't work for all server setups. The safest way is to manually create the file." ) . '</p>';$die .= '<p><a href="' . $path . '" class="button">' . __( "Create a Configuration File" ) . '</a>';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前端资源汇总
- 下一篇: myisam 表锁优化参考