[僅限PaaS]{class="badge informative" title="僅適用於雲端專案(Adobe管理的PaaS基礎結構)和內部部署專案的Adobe Commerce 。"}
Adobe Commerce的除錯最佳實務
本主題說明系統和有效地偵錯Adobe Commerce架構的方式。 目標是協助您快速找到問題的根源,並將調查時間縮到最短。
疑難排解:常見問題
本節說明您在開發期間可能遇到的最常見問題。
快取
- 在進一步調查之前排清快取
- 請考慮APC快取、CDN、Varnish、產生的程式碼以及
var/view_preprocessed
和pub/static/
目錄 - 排清快取或修改程式碼後,停止並重新啟動佇列處理常式
以下程式碼範例提供與管理快取相關的實用命令(請勿在生產環境中執行):
# restart php-fpm to flush APC
sudo service php-fpm restart
# restart varnish to force full flush
sudo service varnish restart
# clear generated files
rm -rf generated/*
# clear static file cache
rm -rf var/view_preprocessed/*
rm -rf pub/static/*
# flush redis cache
redis-cli -n <db_number> FLUSHDB
# flush redis cache and sessions
redis-cli FLUSHALL
# flush redis cache with telnet
telnet <ip_or_host> 6379
SELECT <db_number>
FLUSHDB
Ctrl + ]
quit
# flush redis cache and sessions with telnet
telnet <ip_or_host> 6379
FLUSHALL
Ctrl + ]
quit
# find consumers
pgrep -af queue:consumers:start
# kill all queue consumers (they will restart by cron job)
sudo pkill -f queue:consumers:start
# kill a specific queue consumer (it will restart by cron job)
sudo kill <process_id>
索引資料
如果問題可能與索引相關,請重新索引所有內容。 除錯索引資料通常發生在非生產環境中。 在生產環境中,您可能需要在重新索引之前調查索引未對齊的原因。 故障狀態的特徵可以告訴您問題的起源。
作曲者
由於分支變更或在先前的偵錯工作中編輯的核心檔案,因此您的程式碼可能已過時。 若要消除潛在問題,請執行以下命令:
rm -rf vendor/*
composer clear-cache
composer install
產生的內容
在偵錯JS、CSS、影像、翻譯和其他檔案中產生的內容之前,請先重新建置前端檔案。
rm -rf generated/* var/cache/* var/page_cache/* var/session/* var/view_preprocessed/* pub/static/*
bin/magento setup:static-content:deploy
bin/magento cache:flush
開發人員模式
請確定您的本機安裝處於developer
模式。
新模組
如果您已建立模組,請檢查下列問題:
-
模組是否已啟用?
code language-bash bin/magento module --enable Your_Module
檢查新模組的
app/etc/config.php
檔案。 -
檢查檔案和目錄結構巢狀。 例如,配置檔案是在
view/layout/
目錄中而非view/frontend/layout
目錄中嗎? 範本是在view/frontend/template
目錄中而非view/frontend/templates
目錄中嗎?
疑難排解:半分割
如果通常的疑犯沒有提供問題的解決方案,最快速的繼續方法是將問題分割成一半(或二分)。 透過此方法,您會排除大區塊,並分割剩餘的部分,以找出根本原因,而非以線性方式瀏覽程式碼。
請參閱下列圖表:
雖然有數種等分方法,但Adobe建議依照此順序進行:
- 按主題二分
- 由認可二等分
- 按檔案平分
步驟1:依主題對等
如果問題可能與程式碼無關,請先消除大區塊。 要考慮的一些大型區塊包括:
- Adobe Commerce架構 — 問題是否與Adobe Commerce有關,或是否與其他連線系統有關?
- 伺服器和使用者端 — 清除瀏覽器快取和儲存空間。 問題已解決嗎? 這可能會排除與伺服器相關的原因。 問題是否仍然存在? 不需再浪費時間進行瀏覽器偵錯。
- 工作階段 — 問題是否對每個使用者都發生? 如果沒有,您的問題可能僅限於工作階段或瀏覽器相關主題。
- 快取 — 停用所有快取會變更任何專案嗎? 若是如此,您可以專注於快取相關主題。
- 資料庫 — 每個執行相同程式碼的環境是否會發生問題? 如果沒有,請尋找組態中的問題以及其他資料庫相關主題。
- 程式碼 — 如果上述任何專案都無法解決問題,請尋找程式碼問題。
步驟2:依認可二分
如果問題從現在到兩個月前開始,請將程式碼復原到兩個月前。 確認問題是否仍然存在。 請再往前一個月。 問題是否在那裡發生? 如果沒有,請繼續兩週。 現在發生嗎? 返回上一週。 還在嗎? 回到四天。 在某個時候,您只剩下一項認可,該認可可能包含與問題相關的程式碼。 您的根本原因現在可能僅限於在該認可中編輯的檔案。
您可以使用認可來取代周和天。 例如,回覆100個認可、回覆50、回覆25、回覆12。
步驟3:依檔案對等
- 將Adobe Commerce除以檔案型別(核心與非核心)。 首先,停用所有客戶和市集模組。 問題是否仍然存在? 這很可能是非核心問題。
- 再次啟用
app/etc/config.php
檔案中一半的模組。 請注意相依性。 最好一次啟用具有相同主題的模組叢集。 問題是否仍然存在? - 啟用剩餘模組的四分之一。 問題是否仍然存在? 停用一半的已啟用專案。 此方法可協助您將根本原因隔離至單一模組。
節省時間
除了疑難排解技巧之外,本節還提供一些一般規則,有助於在偵錯期間節省時間。
限制資料
考慮您是需要完整目錄還是所有存放區檢視來復寫問題。 您可以偵錯資料庫複製的索引問題,其中您在開始偵錯之前已移除目錄的95%。 此方法可在索引過程中節省相當多的時間。 建立具有減少的存放區計數和目錄的使用者端資料庫復本。 根據您偵錯的區域,這可能也適用於其他實體(例如客戶)。
要求更多資訊
有時,在所有程式碼和技術工作中忘記的一個簡單步驟是:要求更多資訊。 全熒幕擷取、影片、與識別問題者的視訊會議聊天、復寫步驟、關於有問題事件是否發生其他看似不重要的事情的問題。 詢問某人預期會發生什麼事。 這真的是一個錯誤,還是只是對程式碼運作方式的誤解?
語言和口譯
問題的描述是否清楚? 您確定沒有任何辭彙或說明可以透過多種方式解譯。 如果是這樣的話,請確定您談論的是相同的事情。
網際網路搜尋
使用與問題相關的詞匯進行網際網路搜尋。 其他人可能已經遇到相同問題的機率。 搜尋Adobe Commerce GitHub問題。
休息一下
如果問題解決時間過長,要找到解決方案會很困難。 放下工作,選擇其他工作或散步。 當您暫時忘記問題時,可能會找到答案。
工具
n98 magerun CLI工具(https://github.com/netz98/n98-magerun2)提供從命令列使用Adobe Commerce的實用功能。 尤其是下列指令:
n98-magerun2.phar dev:console
n98-magerun2.phar sys:cron:run
n98-magerun2.phar db:console
n98-magerun2.phar index:trigger:recreate
程式碼片段
下列主題提供的程式碼片段可用來記錄或識別Commerce專案中的問題。
檢查Commerce是否使用XML檔案
在XML檔案中新增明顯的語法錯誤,以檢視它是否被使用。 開啟標籤,請勿針對例項關閉標籤:
<?xml version="1.0"?>
<test
若使用此檔案,則會產生錯誤。 如果沒有,您的模組可能無法使用或未針對例項啟用,或XML檔案可能位於錯誤的位置。
記錄
code language-php |
---|
|
code language-php |
---|
|
code language-php |
---|
|
低層級記錄
在任何PHP檔案中始終可用的兩個範例:
file_put_contents('/var/www/html/var/log/example.log', "example line\n", FILE_APPEND);
file_put_contents('/var/www/html/var/log/example.log', print_r($yourArray, true) . "\n", FILE_APPEND);
對於棧疊追蹤:
try {
throw new \Exception('example');
} catch (\Exception $e) {
file_put_contents('/var/www/html/var/log/example.log', $e->getTraceAsString() . "\n", FILE_APPEND);
}