2024年12月8日 星期日

優化 Laravel 多資料庫查詢性能的策略

 在 Laravel 中,多資料庫的查詢性能優化是一個常見且重要的議題。以下是一些實用的策略,可幫助您提升應用程式的性能:

1. 索引優化

  • 建立適當的索引: 對於經常用於查詢條件或排序的欄位,建立索引可以顯著提高查詢速度。
  • 避免過度索引: 過多的索引會增加寫入操作的負擔,因此需要仔細評估索引的必要性。
  • 複合索引: 對於複合查詢條件,可以建立複合索引。

2. 查詢優化

  • 限制查詢結果: 使用 limitoffsettakeskip 方法限制查詢返回的資料量。
  • 避免 select * 只選擇需要的欄位,減少資料傳輸量。
  • 使用 Eager Loading: 避免 N+1 問題,一次性載入相關的資料。
  • 利用查詢建構器: 充分利用 Laravel 的查詢建構器,寫出高效的查詢。
  • 緩存查詢結果: 對於頻繁且結果不常變動的查詢,可以將結果緩存起來。

3. 連線池

  • 使用連線池: 減少建立和關閉連線的開銷,提升連線效率。
  • 配置連線池: Laravel 的配置檔案中可以設定連線池的相關參數。

4. 讀寫分離

  • 將讀取操作和寫入操作分開到不同的資料庫: 減輕主資料庫的負擔,提高寫入性能。
  • 利用 Laravel 的讀寫分離功能: 可以方便地配置讀寫分離。

5. 資料庫配置

  • 優化資料庫配置: 調整緩衝區大小、連線數、事務隔離級別等參數。
  • 使用快取引擎: 選擇適合的快取引擎,如 InnoDB,可以提高查詢性能。

6. 中間件優化

  • 減少中間件數量: 過多的中間件會增加請求處理時間。
  • 優化中間件邏輯: 避免在中間件中進行耗時操作。

7. 其他優化

  • 批量插入: 對於大量資料插入,使用批量插入可以提高性能。
  • 分頁: 對於大數據集,使用分頁可以減少一次性載入的資料量。
  • 索引優化: 定期檢查和優化索引。
  • 查詢分析: 使用資料庫提供的工具分析慢查詢,找出性能瓶頸。

注意事項

  • 具體優化方案需要根據您的應用場景和資料庫類型進行調整。
  • 注意平衡: 優化性能的同時,也要考慮開發效率和程式碼可讀性。
  • 持續監控: 定期監控系統性能,及時調整優化策略。

額外建議

  • 使用 Laravel 的查詢緩存: 可以緩存查詢結果,減少對資料庫的查詢。
  • 考慮使用 ORM 擴展: 一些 ORM 擴展提供了更強大的查詢功能和性能優化。
  • 利用資料庫提供的性能分析工具: 分析查詢執行計劃,找出性能瓶頸。

總結

優化多資料庫查詢性能是一個系統工程,需要綜合考慮多個方面。通過合理的索引設計、優化查詢語句、使用緩存等手段,可以顯著提升應用程式的性能。

Laravel Design Pattern:讓你的 Laravel 應用程式更優雅、更可維護

 Laravel Design Pattern,簡單來說,就是將軟體設計模式應用在 Laravel 框架上,以提升程式碼的可讀性、可維護性、以及可擴展性。這些模式提供了一套經過驗證的解決方案,幫助開發者面對常見的軟體設計問題。

為什麼要使用 Design Pattern?

  • 提高程式碼可讀性: 透過統一的命名方式和結構,讓其他開發者更容易理解你的程式碼。
  • 增強程式碼可維護性: 當需求變更時,可以更輕鬆地修改程式碼,減少錯誤發生的機率。
  • 促進程式碼重用: 將常見的解決方案封裝成模式,可以重複利用,減少重複開發的工作量。
  • 提升程式碼可測試性: 設計良好的模式有助於將程式碼分隔成獨立的單元,方便進行單元測試。

Laravel 中常見的 Design Pattern

Laravel 框架本身就整合了許多設計模式,例如:

  • MVC (Model-View-Controller): 將應用程式分為模型 (Model)、视图 (View) 和控制器 (Controller) 三個部分,實現關注點分離。
  • Dependency Injection: 將依賴關係從類別內部移出,提高類別的可測試性和可替換性。
  • Facade: 提供一個靜態接口,簡化對底層類別的訪問。
  • Repository: 提供一個抽象層,隔離資料存取邏輯,方便替換不同的資料存取方式。
  • Service Container: 管理應用程式中的物件,實現依賴注入。

其他常見的 Design Pattern

除了 Laravel 內建的模式外,還有許多其他常見的設計模式可以應用在 Laravel 應用程式中,例如:

  • Observer: 當一個物件的狀態發生變化時,通知其他感興趣的物件。
  • Strategy: 封裝一系列的演算法,讓它們可以互換。
  • Decorator: 在不修改原有類別的情況下,動態地給一個物件添加新的功能。
  • Factory: 封裝物件的建立過程,提高程式碼的靈活性和可擴展性。

如何在 Laravel 中應用 Design Pattern

  • 理解設計模式的原理: 了解每種設計模式的優缺點和適用場景。
  • 從 Laravel 框架學起: Laravel 框架本身就是一個很好的學習範例,可以從中學習各種設計模式的應用。
  • 參考 Laravel 官方文件和社群: Laravel 的官方文件和社群中有許多關於設計模式的討論和示例。
  • 從小處開始: 不要一開始就試圖在整個應用程式中應用所有的設計模式,可以從簡單的模組開始,逐步擴展。

2024年12月7日 星期六

如何透過優化 MySQL 資料庫結構,提升查詢效率

 優化 MySQL 資料庫結構是提升查詢效率的重要一環。以下是一些常見的優化技巧:

1. 索引設計

  • 選擇性高的欄位建立索引: 索引可以加速查詢,但過多的索引也會降低寫入性能。選擇查詢頻率高、且資料分佈均勻的欄位建立索引。
  • 複合索引: 當查詢條件涉及多個欄位時,建立複合索引可以提高查詢效率。複合索引的順序應根據查詢條件的頻率和選擇性來決定。
  • 避免冗餘索引: 冗餘索引不僅佔用空間,還可能降低寫入性能。定期檢查和清理索引是必要的。

2. 資料類型選擇

  • 選擇合適的資料類型: 選擇合適的資料類型可以減少存儲空間,提高查詢效率。例如,對於整數型資料,選擇 INT 比 VARCHAR 更高效。
  • 避免過大的資料類型: 過大的資料類型會佔用更多的存儲空間,降低查詢效率。

3. 正規化與反正規化

  • 正規化: 減少資料冗餘,保持資料一致性。但過度正規化可能會導致查詢次數增加,影響性能。
  • 反正規化: 為提高查詢效率,適當引入冗餘資料。但反正規化會增加維護成本,可能導致資料不一致。

4. 分區

  • 水平分區: 將一個大表拆分成多個小表,根據某個欄位的值進行分區。
  • 垂直分區: 將一個表中的列拆分到不同的表中,根據列的訪問頻率進行分區。

5. 資料庫引擎選擇

  • InnoDB: 支持事務、外鍵、MVCC,適合OLTP應用。
  • MyISAM: 性能較高,不支援事務、外鍵,適合只讀或插入頻率高的表。

6. 查詢優化

  • EXPLAIN: 使用 EXPLAIN 命令分析查詢執行計劃,找出性能瓶頸。
  • 索引覆蓋: 查詢結果只包含索引中的列,可以避免回表查詢,提高效率。
  • 避免全表掃描: 儘量使用索引來縮小查詢範圍。
  • 減少子查詢: 子查詢可能會導致性能下降,嘗試使用 JOIN 或 EXISTS 代替。

7. 其他優化

  • 緩衝池: 調整 InnoDB 緩衝池大小,提高數據訪問速度。
  • 慢查詢日誌: 記錄慢查詢,分析原因並優化。
  • 定期維護: 定期執行 OPTIMIZE TABLE、ANALYZE TABLE 等命令,優化表結構。

8. 應用層優化

  • 連接池: 減少建立和關閉連接的開銷。
  • 批量操作: 將多次查詢合併為一次,減少網絡開銷。
  • 緩存: 緩存查詢結果,減少對數據庫的訪問。

總結

優化 MySQL 資料庫結構是一個系統工程,需要綜合考慮多方面因素。沒有放之四海皆準的最佳方案,需要根據實際業務需求和數據特性進行調整。

建議

  • 收集性能數據: 透過 MySQL 提供的工具(如 slow query log、performance schema)收集性能數據,分析瓶頸。
  • 逐步優化: 優化是一個持續的過程,不要一次性修改過多配置,以免引入新的問題。
  • 權衡利弊: 優化需要權衡性能和成本,選擇最適合的方案。

2023年1月13日 星期五

JavaScript text to hyperlink 和 自動換行

nl2br() 函數在字符串中的每個新行(\n) 之前插入HTML 換行符(<br />)。 


function nl2br (str, is_xhtml) {

    var breakTag = (is_xhtml || typeof is_xhtml === 'undefined') ? '<br ' + '/>' : '<br>';

    var regex = /(https?:\/\/([-\w\.]+)+(:\d+)?(\/([\w\/=\/_\.]*(\?\S+)?)?)?)/ig

    var str = str.replace(regex, "<a href='$1' target='_blank'>$1</a>");

    return (str + '').replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1' + breakTag + '$2');

}

2022年9月12日 星期一

設定 Apache 的 mod_reqtimeout 避免 DDOS 攻擊

如何緩解Slowloris 攻擊?

對於易受Slowloris 攻擊的Web 服務器,有一些方法可以減輕某些影響。易受攻擊的服務器的緩解措施可以分為3 大類:

增加服務器可用性- 增加服務器在任何時間允許的最大客戶端數量,這將增加攻擊者使服務器過載前必須建立的連接數。實際上,無論增加多少,攻擊者都可以擴展攻擊數量以攻克服務器容量。

限制傳入請求的速率- 基於某些使用因素限制訪問,這將有助於緩解Slowloris 攻擊。限制單個IP 地址允許建立的最大連接數,限制慢速傳輸速度,以及限制客戶端允許保持連接的最長時間,這些技巧都是限制慢速攻擊的有效方法。


在 Apache 2.4 中已經內建 mod_reqtimeout,只需要先在 httpd.conf 中把 # 拿掉啟用即可

LoadModule reqtimeout_module modules/mod_reqtimeout.so


例子

等待5秒以完成TLS握手,等待10秒以接收請求標頭,等待30秒以接收請求正文:

RequestReadTimeout handshake=5 header=10 body=30

至少等待10秒鐘以接收請求正文。如果客戶端發送數據,則每接收1000個字節,將超時增加1秒,沒有超時上限(除非間接限制為 LimitRequestBody):

RequestReadTimeout body=10,MinRate=1000

至少等待10秒鐘以接收請求標頭。如果客戶端發送數據,則每接收500個字節將超時增加1秒。但請求標頭的時間不得超過30秒:

RequestReadTimeout header=10-30,MinRate=500

通常,服務器應同時配置標頭超時和主體超時。如果將通用配置用於http和https虛擬主機,則超時不應設置得太低:

RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500


接下來就是設定

<IfModule reqtimeout_module>

RequestReadTimeout header=20-30,MinRate=256 body=100-120,MinRate=512

</IfModule>

2022年9月5日 星期一

什麼是反惡意軟件服務可執行文件(antimalware service executable)?

 什麼是反惡意軟件服務可執行文件(antimalware service executable)?

反惡意軟件服務可執行文件(antimalware service executable)是Windows 10 系統內建 Windows Defender 防火牆下的一個後台進程。此程序也稱為MsMpEng.exe,是Windows操作系統的一部分,始終在後台運行。當用戶訪問檔案時, Windows Defender 負責掃描檢查是否夾帶病毒軟體、安裝病毒定義檔等工作,因此需要使用到磁碟資源、記憶體RAM和CPU。您可以從Windows 10附帶的Windows Defender安全中心應用程序配置Windows Defender,執行掃描並檢查其掃描歷史記錄。

它是病毒嗎?

目前,還沒有任何證據與報告來假裝模仿反惡意軟件服務可執行文件。Windows Defender本身就是一個防病毒軟件。常規後台掃描對於任何防病毒程序都是正常的。因此我們可以相信antimalware service executable這個後台進程對我們來說是安全的。

它為什麼佔用CPU或磁盤資源?

突然的大量使用到CPU或磁盤資源使用表示它可能在掃描您的計算機以查找惡意軟件或定期安裝包含新惡意軟件信息的更新。所有這些程序都需要使用一些系統資源來檢查您的PC並保護您的安全。

怎麼解決antimalware service executable 對於CPU/記憶體使用率過高呢?

但是很多剛剛更新成windows10的用戶不習慣,他們覺得資源占用的情況太過明顯,想要關閉反惡意軟件服務可執行文件(antimalware service executable)以解決CPU/記憶體使用率過高的問題。到底該怎麼解決antimalware service executable 對於CPU/記憶體使用率過高呢?

 

事實上,如果您沒有安裝任何其他防病毒軟件,我們建議您不要禁用Windows Defender防病毒工具和關閉antimalware service executable。雖然,您無法永久禁用它。因為如果Windows Defender未檢測到安裝的其他防病毒應用程序,它將在短時間後重新啟用。


將antimalware service executable 添加到 Windows Defender 的排除列表中

步驟 1. 同時按住Windows鍵+ I ,打開「設定」。點擊「更新與安全性」。

步驟 2. 點擊「Windows Defender」,點擊添加「排除項目」。

步驟 3. 點擊「排除.exe, .com, .scr 程序」。

添加到Windows Defender - 1

步驟 4. 輸入:MsMpEng.exe ,點擊「確定」。


2022年8月30日 星期二

XAMPP CI3 Git 洩漏?

 許多工程師在撰寫程式時,會使用 Git 來做版本控管,在使用 Git 的時候,目錄底下會產生一個 .git 的隱藏檔案,裡面就是 git repository,會儲存程式的修改、新增、刪除等紀錄。

若工程師直接將含有 .git 目錄的專案放到網頁伺服器的公開目錄,駭客便有可能下載 .git 中的資料,利用 git 的機制將原始碼重建。

因此當工程師開發完成時,可能有兩個方法發佈較為妥當:

額外將網頁程式碼製作一個副本 (不含 .git),再發佈到網頁伺服器。

直接將含 git 目錄的專案放到網頁伺服器,但同時做好網頁的權限控管,也就是當你瀏覽 /.git 底下的全部內容時,會回傳 403。

假如工程師在測試登入功能時,將 admin 的帳密紀錄在程式的註解中,並使用 git 紀錄到歷史版本中,當工程師不小心上傳 .git,並且沒有做權限控管,那麼駭客就能從洩漏的 .git 目錄中拿到帳密。

此外,因為 .git 洩漏是已知且普遍的問題,有眾多工具可以協助駭客下載 .git 目錄並重建原始碼,只要網頁不小心將 .git 上傳,那就有許多人可以將網頁的 .git 下載下來,反倒甚至出現針對這種工具漏洞的攻擊:

攻擊者會構建惡意的 .git 目錄,故意將其中的一些資料路徑修改,例如將文件路徑加上很多 ../../../ ,一旦重建工具沒有檢查路徑,重構資料就可以隨意覆蓋到你的正常檔案。


一般來說,只要網址/.git 可以看到東西,基本上就能將程式還原,但是有時候網址輸入 /.git 會出現 403 (「無權」訪問指定的URL而非 「檔案不存在」,代表 .git 目錄可能是存在的,你可以嘗試 /.git/config,看他有沒有擋),或是用其他方式拿到 .git 的資料,例如下載

網址/.git/logs/HEAD 儲存 git 的 log,可以找到歷史 commit

網址/.git/refs/heads/master 會記錄 master 的 commit hash,可以分解出該 commit 的資料

網址/.git/refs/heads 底下會放所有分支的名字資料夾

網址/.git/refs/stash 用於暫時保存 git 工作進度,可以把做到一半的東西先藏起來(stash),不要 commit 出去

git stash list 顯示 stash 內的所有內容

git stash pop 把剛剛做到一半存在 stash 的資料還原

網址/.git/info/packs packs 的件提取與恢復 (比較少考)

網址/.git/index 會儲存 git add 的資料


<Directory "C:/xampp/htdocs">

    Options Includes FollowSymLinks ExecCGI


    AllowOverride All


    Require all granted

    Header set Access-Control-Allow-Origin *

    RedirectMatch 404 /\\.(svn|git|hg|bzr|cvs)(/|$)

</Directory>


<DirectoryMatch "^/.*/\.git/">

    Order allow,deny

    Require all denied

</DirectoryMatch>

當工程師的價值不再只是寫 Code,公司還看得見你的貢獻嗎?

 最近跟 AI、軟體開發流程轉變相關的討論越來越多。 很多人關注的是: AI 會不會取代工程師? 未來還需不需要寫 Code? 工程師應該學什麼新技能? 但有一個更現實的問題,可能很多工程師每天都正在面對: 當你的工作價值不再只是「寫多少 Code」,公司是...