国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 php教程 php手冊 wordpress外掛bug排查後記(這篇文章是寫給自己的)

wordpress外掛bug排查後記(這篇文章是寫給自己的)

Nov 30, 2016 pm 11:59 PM

這篇文章是寫給自己的。

週三的時(shí)候我在維護(hù)公司的一個(gè)wordpress專案頁面時(shí)發(fā)現(xiàn)了一個(gè)非常奇怪的情況:當(dāng)我嘗試更新網(wǎng)站上的一個(gè)頁面後,在wordpress後臺(tái)的編輯器中發(fā)現(xiàn)其內(nèi)容並沒有按我預(yù)期的將圖片的網(wǎng)址替換下來(網(wǎng)站開啟了百度雲(yún)插件,插件會(huì)抓取文章中的圖片,然後將圖片上傳至百度雲(yún),並將文章中的地址替換),但是,我查看前臺(tái)的頁面卻發(fā)現(xiàn)頁面顯示時(shí)正常的、檢查頁面中的圖片網(wǎng)址也是做過替換的,總之一句話,就是前臺(tái)文章展示頁和後臺(tái)編輯器中的內(nèi)容不一致。這個(gè)bug真詭異,下面就把排查這個(gè)bug的過程記錄下來,以備忘。

1,懷疑網(wǎng)站上有其他外掛程式與百度雲(yún)插件衝突

這個(gè)其實(shí)有可能,因?yàn)榫W(wǎng)站上也安裝了不少wordpress外掛。但想了下,好像也沒有其它插件會(huì)與百度雲(yún)插件起衝突。

2,與技術(shù)老大一起結(jié)合資料庫中的wp_posts表來排查

wp_posts表結(jié)構(gòu)如下:

這個(gè)表格下面幾個(gè)欄位很重要:

post_status(文章狀態(tài))的值可以是:trash(回收站)、publish(發(fā)布)、inherit(繼承)、draft(草稿)、auto-draft(自動(dòng)儲(chǔ)存的草稿)

post_type(文章類型)的值可以是:post(文章)、page(頁面)、revision(修訂版)、attachement(附件)、nav_menu_item(選單)

post_parent(父文章的ID)。

post_status決定了此條是否已經(jīng)發(fā)布,post_type則決定了某筆記錄是草稿、文章、頁面、還是文章的修訂版本。文章可以被修改很多次,所以,它會(huì)有很多個(gè)修訂版本,post_parent儲(chǔ)存的是目前此筆記錄的父文章的ID(這個(gè)只有post_status為inherit或draft時(shí)才會(huì)用到,其他情況下預(yù)設(shè)為0 )。

debug過程基本上就是這樣:每點(diǎn)擊一次“更新按鈕”,就看wp_posts表中的記錄變化,結(jié)果發(fā)現(xiàn):

(1)網(wǎng)站中發(fā)布的頁面(假定ID為1234),在資料庫中對應(yīng)的記錄(post_status為publish,post_type為page)已經(jīng)被正常修改了。這可以說明,編輯器中的內(nèi)容不是取的1234這條記錄,它取的是ID=1234這篇文章的某個(gè)修訂版。檢查了幾次,果然是這樣。

(2)那麼它取得的是哪個(gè)修訂版呢?經(jīng)過幾次排查發(fā)現(xiàn),編輯器總是取得最新revision之前的一個(gè)revision。準(zhǔn)確的描述應(yīng)該是這樣,每點(diǎn)擊一次更新,數(shù)據(jù)表中會(huì)多處一個(gè)revision和一個(gè)auto-draft,最新的revision中的文章內(nèi)容是被替換過img src的正確內(nèi)容,而auto_draft則與編輯器中的一致。在編輯器狀態(tài)下,wordpress頻繁的自動(dòng)儲(chǔ)存,每產(chǎn)生一個(gè)新的auto draft就會(huì)把先前的auto draft刪除。編輯器取得內(nèi)容時(shí)也不是從auto draft中取得的??傊钺嵋矝]弄清楚,它到底取的是哪個(gè)revision。但它應(yīng)該取最新的revision,這樣就可以與ID=1234的post內(nèi)容保持一致了。

3,緩存搞的鬼?

開始懷疑是瀏覽器緩存,嘗試清除瀏覽器快取後,發(fā)現(xiàn)問題還存在。那就是服務(wù)端的快取了,重新啟動(dòng)下伺服器上的memcached: service memcached restart,然後發(fā)現(xiàn)編輯器中的內(nèi)容正常了。果然是緩存搞的鬼。

解決bug:

在百度雲(yún)端插件更新資料庫的地方增加更新最新的revision和刷新快取的程式碼,這個(gè)bug才算解決。

<span style="color: #008080;">1</span>             <span style="color: #008000;">//</span><span style="color: #008000;"> 更新最新的revision的posts表中的post_content字段</span>
<span style="color: #008080;">2</span>             <span style="color: #800080;">$revisions</span> = wp_get_post_revisions( <span style="color: #800080;">$post_id</span><span style="color: #000000;"> );
</span><span style="color: #008080;">3</span>             <span style="color: #008080;">krsort</span>( <span style="color: #800080;">$revisions</span><span style="color: #000000;"> );
</span><span style="color: #008080;">4</span>             <span style="color: #800080;">$newest_id</span> = <span style="color: #008080;">reset</span>( <span style="color: #008080;">array_keys</span>( <span style="color: #800080;">$revisions</span><span style="color: #000000;"> ) );
</span><span style="color: #008080;">5</span>             <span style="color: #800080;">$flag</span> = <span style="color: #800080;">$wpdb</span>->update( <span style="color: #800080;">$wpdb</span>->posts, <span style="color: #0000ff;">array</span>('post_content' => <span style="color: #800080;">$post</span>->post_content), <span style="color: #0000ff;">array</span>('ID' => <span style="color: #800080;">$newest_id</span><span style="color: #000000;">) );
</span><span style="color: #008080;">6</span>             <span style="color: #008000;">//</span><span style="color: #008000;"> 更新posts數(shù)據(jù)表的post_content字段</span>
<span style="color: #008080;">7</span>             <span style="color: #800080;">$wpdb</span>->update( <span style="color: #800080;">$wpdb</span>->posts, <span style="color: #0000ff;">array</span>('post_content' => <span style="color: #800080;">$post</span>->post_content), <span style="color: #0000ff;">array</span>('ID' => <span style="color: #800080;">$post</span>-><span style="color: #000000;">ID));
</span><span style="color: #008080;">8</span>             <span style="color: #008000;">//</span><span style="color: #008000;"> 刷新緩存</span>
<span style="color: #008080;">9</span>             wp_cache_flush();

下面是惡補(bǔ)的wordpress的快取和全域變數(shù)的相關(guān)知識(shí):

(1)wp_cache_flush()函數(shù)是如何定義的??

<span style="color: #008080;"> 1</span> <span style="color: #008000;">/*</span><span style="color: #008000;">*
</span><span style="color: #008080;"> 2</span> <span style="color: #008000;"> * Removes all cache items.
</span><span style="color: #008080;"> 3</span> <span style="color: #008000;"> *
</span><span style="color: #008080;"> 4</span> <span style="color: #008000;"> * @since 2.0.0
</span><span style="color: #008080;"> 5</span> <span style="color: #008000;"> *
</span><span style="color: #008080;"> 6</span> <span style="color: #008000;"> * @see WP_Object_Cache::flush()
</span><span style="color: #008080;"> 7</span> <span style="color: #008000;"> * @global WP_Object_Cache $wp_object_cache Object cache global instance.
</span><span style="color: #008080;"> 8</span> <span style="color: #008000;"> *
</span><span style="color: #008080;"> 9</span> <span style="color: #008000;"> * @return bool False on failure, true on success
</span><span style="color: #008080;">10</span>  <span style="color: #008000;">*/</span>
<span style="color: #008080;">11</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> wp_cache_flush() {
</span><span style="color: #008080;">12</span>     <span style="color: #0000ff;">global</span> <span style="color: #800080;">$wp_object_cache</span><span style="color: #000000;">;
</span><span style="color: #008080;">13</span> 
<span style="color: #008080;">14</span>     <span style="color: #0000ff;">return</span> <span style="color: #800080;">$wp_object_cache</span>-><span style="color: #008080;">flush</span><span style="color: #000000;">();
</span><span style="color: #008080;">15</span> }

接著問,$wp_objecg_cache->flush()函數(shù)是如何定義的?

<span style="color: #008080;"> 1</span>     <span style="color: #008000;">/*</span><span style="color: #008000;">*
</span><span style="color: #008080;"> 2</span> <span style="color: #008000;">     * Clears the object cache of all data.
</span><span style="color: #008080;"> 3</span> <span style="color: #008000;">     *
</span><span style="color: #008080;"> 4</span> <span style="color: #008000;">     * @since 2.0.0
</span><span style="color: #008080;"> 5</span> <span style="color: #008000;">     * @access public
</span><span style="color: #008080;"> 6</span> <span style="color: #008000;">     *
</span><span style="color: #008080;"> 7</span> <span style="color: #008000;">     * @return true Always returns true.
</span><span style="color: #008080;"> 8</span>      <span style="color: #008000;">*/</span>
<span style="color: #008080;"> 9</span>     <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> <span style="color: #008080;">flush</span><span style="color: #000000;">() {
</span><span style="color: #008080;">10</span>         <span style="color: #800080;">$this</span>->cache = <span style="color: #0000ff;">array</span><span style="color: #000000;">();
</span><span style="color: #008080;">11</span> 
<span style="color: #008080;">12</span>         <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #000000;">;
</span><span style="color: #008080;">13</span>     }

這個(gè)$this->cache初始化時(shí)是如何賦值的?或是在類別中是如何定義的?

<span style="color: #008080;">1</span>     <span style="color: #008000;">/*</span><span style="color: #008000;">*
</span><span style="color: #008080;">2</span> <span style="color: #008000;">     * Holds the cached objects.
</span><span style="color: #008080;">3</span> <span style="color: #008000;">     *
</span><span style="color: #008080;">4</span> <span style="color: #008000;">     * @since 2.0.0
</span><span style="color: #008080;">5</span> <span style="color: #008000;">     * @access private
</span><span style="color: #008080;">6</span> <span style="color: #008000;">     * @var array
</span><span style="color: #008080;">7</span>      <span style="color: #008000;">*/</span>
<span style="color: #008080;">8</span>     <span style="color: #0000ff;">private</span> <span style="color: #800080;">$cache</span> = <span style="color: #0000ff;">array</span>();

$this->cache是??個(gè)數(shù)組,而wp_cache_flush()只是把這個(gè)數(shù)組賦值為空數(shù)組。

(2)接著問,WP_Object_Cache都快取了哪些資料?是如何快取的?

先根據(jù)cache.php文件頭註解的指引(有註解就是好)來看下官方文件的說明:

WP_Object_Cache?is WordPress' class for?WP_Object_Cache?is WordPress' class for?WP_Object_Cache?is WordPress' class for?

WP_Object_Cache

?is WordPress' class for?WP_Object_Cache?is WordPress' class for?

WP_Object_Cache

?is WordPress' class for?WP_Object_Cache?is WordPress' class for?

WP_Object_Cache

?is WordPress' class for?

) data which may be computationally expensive to regenerate, such as the result of complex database queries

. The object inache ache.

Do not use the class directly in your code when writing plugins, but?

use the wp_cache functions listed below

.

By default, the object cache is non-persistent. This means that data stored in the cache resides in memory only and only for the duration of the request

.?Cached page will not be duration of the request

。 caching?plugin.

注意上面標(biāo)紅的文字,大意是說:WP_Object_Cache快取需要重複產(chǎn)生消耗運(yùn)算資源的數(shù)據(jù),例如資料庫查詢結(jié)果。預(yù)設(shè)情況下,WP_Object_Cache不是可持續(xù)的,它只是在某次請求的時(shí)間內(nèi)存在(一旦請求結(jié)束,快取也會(huì)被刪除),如果要想跨頁面(跨請求)使用這些緩存,那就需要安裝一個(gè)永續(xù)的快取插件。

(3)網(wǎng)站上安裝了什麼快取外掛呢? memecached,但在插件列表中沒有找到。

然後百度了下,發(fā)現(xiàn)了這篇文章wordpress如何啟用Memcached記憶體緩存,結(jié)果發(fā)現(xiàn)它被安裝到wp-content目錄下面。
看來,wordpress還有很多要學(xué)的東西。
??? ??參考:?? ??wordpress官方參考手冊?? ??wordpress如何啟用Memcached記憶體快取???????? ????
本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1600
29
PHP教程
1502
276