亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在單個 PHP 腳本執行中顯示所有 SQL 查詢

在單個 PHP 腳本執行中顯示所有 SQL 查詢

PHP
蝴蝶不菲 2022-11-04 16:35:44
PHP 有一個長期存在的大型項目,在其開發過程中,在不同時期涉及了許多不同的開發人員。潛在地,在錯誤修復期間可能存在重復數據庫查詢的地方。一些解決本地問題的開發人員可以編寫并執行查詢,返回先前獲得的數據。現在在項目上存在數據庫性能問題,因此有一個問題:是否有任何工具(除了常規日志)可以讓您查看作為單個 PHP 腳本執行的一部分進行了哪些數據庫查詢?這個問題與項目中有很多API端點有關,僅通過閱讀代碼(有時非常華麗)來檢查它們需要很長時間。
查看完整描述

1 回答

?
紫衣仙女

TA貢獻1839條經驗 獲得超15個贊

大多數 PHP 框架使用單個連接接口 - 某種包裝器 - 這使得通過該接口記錄所有查詢成為可能。


如果不存在另一種方法是在 MySQL 級別啟用日志記錄。但對于某些人來說,可能是合法的,你也不想這樣做。如果您想防止停機,您實際上可以在不重新啟動 MySQL 服務器的情況下啟用查詢日志記錄。


如果上述解決方案均不可行,則您必須弄臟自己的手:-)


一種方法是在 PHP 代碼中添加您自己的日志記錄。如果寫入文件末尾,則向文件寫入新行不是性能問題。


我不確定你如何查詢數據庫,但如果你..


A) ..使用程序 mysqli 函數


如果您使用 mysqli_query() 之類的過程 mysqli 函數來調用數據庫,您可以創建自己的全局自定義函數,該函數寫入日志文件,然后調用真正的函數。


一個例子:


添加新的全局函數:


function _mysqli_query($link, $query, $resultmode = MYSQLI_STORE_RESULT )

{

    // write new line to end of log-file

    file_put_contents('queries.log', $query . "\n", FILE_APPEND);


    // call real mysqli_query

    return mysqli_query($link, $query, $resultmode);

}

在項目范圍內搜索并替換mysqli_query(和_mysqli_query(。


然后是這樣的一行:


$result = mysqli_query($conn, 'select * from users');

搜索和替換后看起來像這樣:


$result = _mysqli_query($conn, 'select * from users');

B) ..使用 mysqli 類(面向對象風格)


如果您通過實例化 mysqli 類來使用面向對象的風格,然后調用查詢方法,例如 $mysqli->query("select * from users") 一種方法可能是創建您自己的數據庫類,它擴展了 mysqli 類,并在內部您在上面的示例中添加日志記錄的具體方法(例如查詢功能)。


在 O'Reilly 的高度推薦書“高性能 MySQL”中,他們通過代碼示例了解如何執行此操作并添加額外的調試信息(時間等)。某些頁面可在 google 圖書中訪問。


一般來說


我會考慮利用這個機會來更好地重構一些代碼庫。


如果您編寫了自動化測試,這是確保重構不會破壞任何東西的好方法。


如果您不練習自動化測試,則必須手動測試整個應用程序。


您說您擔心您的性能問題來自重復的數據庫查詢,這很可能是這種情況。在大多數情況下,我發現它缺少索引或者需要重寫單個查詢。


如果您發現它可能是導致性能問題的其他原因,那么 MySQL 中的性能模式可以幫助您調試這些東西。


查看完整回答
反對 回復 2022-11-04
  • 1 回答
  • 0 關注
  • 105 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號