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 中的性能模式可以幫助您調試這些東西。
- 1 回答
- 0 關注
- 105 瀏覽
添加回答
舉報