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

首頁(yè) php教程 php手冊(cè) wordpress插件bug排查后記(這篇文章是寫(xiě)給自己的)

wordpress插件bug排查后記(這篇文章是寫(xiě)給自己的)

Nov 30, 2016 pm 11:59 PM

這篇文章是寫(xiě)給自己的。

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

1,懷疑網(wǎng)站上有其他插件與百度云插件沖突

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

2,與技術(shù)老大一起結(jié)合數(shù)據(jù)庫(kù)中的wp_posts表來(lái)排查

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

這個(gè)表下面幾個(gè)字段很重要:

post_status(文章?tīng)顟B(tài))的值可以是:trash(回收站)、publish(發(fā)布)、inherit(繼承)、draft(草稿)、auto-draft(自動(dòng)保存的草稿)

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

post_parent(父文章的ID)。

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

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

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

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

3,緩存搞的鬼?

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

解決bug:

在百度云插件更新數(shù)據(jù)庫(kù)的地方增加更新最新的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的緩存和全局變量的相關(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> }

接著問(wèn),$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í)是如何賦值的?或者在類(lèi)中是如何定義的?

<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)接著問(wèn),WP_Object_Cache都緩存了哪些數(shù)據(jù)?是如何緩存的?

先根據(jù)cache.php文件頭注釋的指引(有注釋就是好)來(lái)看下官方文檔的說(shuō)明:

WP_Object_Cache?is WordPress' class for?caching data which may be computationally expensive to regenerate, such as the result of complex database queries. The object cache is defined in?wp-includes/cache.php.

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 data will not be stored persistently across page loads unless you install a?persistent caching?plugin.

注意上面標(biāo)紅的文字,大意是說(shuō):WP_Object_Cache緩存需要重復(fù)生成消耗計(jì)算資源的數(shù)據(jù),比如數(shù)據(jù)庫(kù)查詢結(jié)果。默認(rèn)情況下,WP_Object_Cache不是可持續(xù)的,它只是在某次請(qǐng)求的時(shí)間內(nèi)存在(一旦請(qǐng)求結(jié)束,緩存也會(huì)被刪除),如果要想跨頁(yè)面(跨請(qǐng)求)使用這些緩存,那就需要安裝一個(gè)可持續(xù)的緩存插件。

(3)網(wǎng)站上安裝了什么緩存插件呢?memecached,但在插件列表中沒(méi)有找到。

然后百度了下,發(fā)現(xiàn)了這篇文章wordpress如何啟用Memcached內(nèi)存緩存,結(jié)果發(fā)現(xiàn)它被安裝到wp-content目錄下面。

看來(lái),wordpress還有很多要學(xué)的東西呢。

?

參考:

wordpress官方參考手冊(cè)

wordpress如何啟用Memcached內(nèi)存緩存

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系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脫衣機(jī)

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集成開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

熱門(mén)話題

Laravel 教程
1601
29
PHP教程
1502
276