自引入WordPress REST API以來(lái),許多插件開發(fā)人員已開始將其插件轉(zhuǎn)換為使用REST API而不是較舊的AJAX API(admin-ajax.php
)。除了REST API只是一種較新的技術(shù)外,有傳言說(shuō)REST API也比舊的端點(diǎn)更快,更可靠,原因是在典型的REST請(qǐng)求期間沒(méi)有加載太多的WordPress。
在本文中,我們將研究典型的REST請(qǐng)求以及提出的類似請(qǐng)求admin-ajax.php
以了解它們之間的比較情況。
- 原文來(lái)源于:詳情

admin-ajax.php請(qǐng)求的壽命
讓我們首先分解一下當(dāng)我們向發(fā)出典型的AJAX請(qǐng)求時(shí)會(huì)發(fā)生什么admin-ajax.php
。當(dāng)您的瀏覽器對(duì)該文件發(fā)出請(qǐng)求時(shí),它會(huì)加載其他一些核心WordPress文件,以便能夠在加載了核心功能的情況下滿足請(qǐng)求:
/wp-load.php
/wp-config.php
/wp-settings.php
?(它會(huì)加載大多數(shù)核心文件,所有活動(dòng)的插件和主題以及REST API)/wp-admin/admin.php
/wp-admin/includes/ajax-actions.php
加載這些文件后,WordPress將調(diào)用該admin_init
掛鉤,幾個(gè)核心功能都將掛鉤。在WordPress 4.5.3的此鉤子上調(diào)用了以下核心功能:
register_admin_color_schemes
send_frame_options_header
_wp_check_for_scheduled_split_terms
_wp_admin_bar_init
_maybe_update_core
_maybe_update_plugins
_maybe_update_themes
調(diào)用完這些函數(shù)后,WordPress最終將調(diào)用$_GET[‘a(chǎn)ction’]
或$_POST[‘a(chǎn)ction’]
變量中提供的AJAX操作。
REST API請(qǐng)求的生命周期
與admin-ajax.php
請(qǐng)求相比,典型的REST請(qǐng)求看起來(lái)略有不同。由于REST端點(diǎn)是由WordPress重寫API處理的,因此請(qǐng)求將傳遞到/index.php
,然后正常加載其余WordPress。
/index.php
/wp-blog-header.php
/wp-load.php
/wp-config.php
/wp-settings.php
?(它會(huì)加載大多數(shù)核心文件,所有活動(dòng)的插件和主題以及REST API)
與發(fā)送過(guò)來(lái)的請(qǐng)求不同admin-ajax.php
,REST API不會(huì)通過(guò)加載WordPress管理部分/wp-admin/admin.php
,也不會(huì)觸發(fā)admin_init
動(dòng)作掛鉤。基于此,任何不依賴于管理員特定功能(但使用admin-ajax.php)的插件或主題都可能會(huì)通過(guò)切換到REST API來(lái)獲得輕微的性能提升。
基準(zhǔn)測(cè)試
既然我們已經(jīng)看到了幕后發(fā)生的事情,那么讓我們建立一個(gè)可以輕松進(jìn)行基準(zhǔn)測(cè)試的場(chǎng)景。為此,我們將創(chuàng)建一個(gè)可以在admin-ajax.php或REST API上運(yùn)行的簡(jiǎn)單函數(shù):
function benchmark_request() {
$result = array( 'time' => time() );
echo json_encode( $result );
exit;
}
add_action( 'wp_ajax_benchmark_request', 'benchmark_request' );
add_action( 'rest_api_init', function() {
register_rest_route( 'benchmark/v1', '/benchmark/', array(
'methods' => 'POST',
'callback' => 'benchmark_request'
) );
} );
上面的函數(shù)只是返回JSON中的時(shí)間-這只會(huì)有助于使您更容易看到請(qǐng)求沒(méi)有被緩存。
為了執(zhí)行實(shí)際的基準(zhǔn)測(cè)試,我們將使用ApacheBench,這是一個(gè)命令行基準(zhǔn)測(cè)試工具,它使您可以一次觸發(fā)多個(gè)請(qǐng)求以了解服務(wù)器的性能。
讓我們admin-ajax.php
先測(cè)試版本。
ab -n 100 -c 1 -p ~/Desktop/post.data -g ~/Desktop/ajax.tsv -T application/x-www-form-urlencoded http://localhost/rest-api/wp-admin/admin-ajax.php
上面的命令將100個(gè)POST請(qǐng)求發(fā)送到該/wp-admin/admin-ajax.php
文件并記錄響應(yīng)時(shí)間。post.data
引用的文件只是一個(gè)文本文件,其中包含要與請(qǐng)求一起發(fā)送的URL編碼的$ _POST值(在本例中為action=benchmark_request
)。

在100個(gè)請(qǐng)求下,在MAMP和PHP 7上全新安裝WordPress且未激活其他插件的情況下,平均響應(yīng)時(shí)間為253ms。這為基于REST API的相同測(cè)試提供了良好的基準(zhǔn):
ab -n 100 -c 1 -p ~/Desktop/post.data -g ~/Desktop/rest.tsv -T application/x-www-form-urlencoded http://loc

毫不奇怪,在此比較中,REST API的速度稍快,在100個(gè)請(qǐng)求中的平均響應(yīng)時(shí)間為217ms。顯然,這并不是一個(gè)很大的差異,REST API僅比傳統(tǒng)的AJAX API快15%,但是在許多請(qǐng)求中,這種微小的差異肯定會(huì)加起來(lái),尤其是當(dāng)添加了更多插件時(shí)。
讓我們運(yùn)行相同的基準(zhǔn)測(cè)試,但激活一些插件。對(duì)于這些測(cè)試,我激活了一些常見的插件,您可能會(huì)在典型的網(wǎng)站上找到它們:
- ACF
- Akismet
- Black Studio TinyMCE小工具
- WP遷移數(shù)據(jù)庫(kù)
- WP超級(jí)緩存
- Yoast SEO
盡管總體響應(yīng)時(shí)間有所增加,但admin-ajax.php和REST API之間的性能差距仍然大致相同。隨著額外的插件加載,REST API,將約16%的速度,并有一個(gè)平均響應(yīng)時(shí)間490ms相比567ms以上admin-ajax.php
:
具有大量插件的網(wǎng)站可以通過(guò)REST API看到更大的性能提升,但這完全取決于正在運(yùn)行哪些插件以及如何對(duì)其進(jìn)行編碼。
因此,您應(yīng)該使用WordPress REST API嗎?
從性能的角度來(lái)看,顯然有一點(diǎn)優(yōu)勢(shì)。添加自定義API端點(diǎn)非常簡(jiǎn)單,并且由于不必加載太多WordPress核心(包括管理區(qū)域和常用admin_init
鉤子),因此它admin-ajax.php
在大多數(shù)情況下可能會(huì)比使用更快。
在可靠性方面,REST API仍取決于活動(dòng)插件或主題的質(zhì)量和完整性。編碼不良的插件仍可能輕易干擾REST請(qǐng)求,尤其是將來(lái)有更多插件采用REST API時(shí)。但是,由于使用REST API的插件較少,因此目前應(yīng)該更可靠。
總體而言,至少考慮使用REST API絕對(duì)是一個(gè)好主意。添加自定義API端點(diǎn)非常簡(jiǎn)單,并且切換現(xiàn)有代碼也不需要很多。