Web開發中的18個關鍵監督
>本文將涵蓋大多數PHP開發人員在處理中和大型項目時所做的最大的編碼監督。諸如開發環境之間沒有區別或不實施緩存和備份等監督。
>以下示例在PHP中,但是每個問題背後的想法是通用的。 這些問題的根源主要在於開發人員的知識和經驗,尤其是缺乏它。我不是要抨擊任何人,我不認為自己是了解一切的完美開發人員,所以請忍受我。
根據我的經驗,我們可以將這些問題分為三個主要組:設計級別,應用程序級別和數據庫級別的監督。我們將分別分解每個。
鑰匙要點
始終啟用開發過程中的錯誤報告以儘早捕獲和解決問題,以確保魯棒的應用功能。
>
>在各個級別(服務器,應用程序,數據庫)上策略性地實施緩存,以增強性能和用戶體驗。- 遵守最佳實踐和建立的設計模式,以避免重新發明輪子並將不必要的風險引入您的應用。
- >合併自動測試和連續集成以保持代碼質量並促進更順暢的部署過程。
- >在您的團隊內進行定期的代碼審查和審核,以確保一致性並抓住潛在的錯誤。 >通過編寫防禦性代碼來預測和處理可能的錯誤,漏洞和失敗,為最壞的場景做好準備。
- >
- >應用程序級別的監督
- 開發隨著錯誤報告
>我唯一可以問的問題是:為什麼?為什麼在開發應用程序時不打開錯誤報告?
> PHP有許多級別的錯誤報告,應在開發階段打開所有級別。
>如果您認為錯誤永遠不會發生,那麼您正在編碼理想的情況,這僅在理想的世界中發生。
>
>錯誤報告應始終處於開發中的最高設置:error_reporting(e_all);和ini_set('display_errors',true);注意:E_ALL是自PHP 5.4以來最高的,因為E_strict錯誤成為PHP 5.4中E_ALL的一部分。如果使用較舊的PHP版本,則使用error_reporting(e_all | e_strict);也包括嚴格的錯誤警告。
抑制錯誤
>使用@運算符抑制錯誤,甚至比根本不打開它更糟糕,因為您有意識地在地毯下掃了污垢。您知道錯誤正在發生,您只想隱藏它,關閉任務並提早回家。您沒有意識到的是,在搖搖欲墜的基礎上建造一些東西將在以後會產生更大的後果。
>>您可以在此處閱讀有關此的深入解釋。
> 中的任何地方都沒有記錄開發一個項目必須從一開始就考慮登錄。您不能只是在末尾登錄時螺栓。
>大多數開發人員確實使用一種或另一種方式來記錄,但幾乎沒有時間實際驗證這些日誌是否存在錯誤。如果沒有人看日誌,記錄的意義是什麼?
> PSR建議確實存在用於記錄,PSR-3是準確的,這篇出色的文章說明瞭如何實現PSR-3記錄。
可以在應用程序中的多個級別上以多種不同的方式進行緩存,例如服務器級別,應用程序級別,數據庫級別等。
> 也應從一開始就實現緩存。您總是可以在開發中將其禁用,但是一旦將所有內容都推向生產環境,請確保一切都可以。
在服務器級別上,您可以使用varnish,這是反向http代理,它將文件存儲在內存中,應安裝在Web服務器的前面。
您可以在本文中深入閱讀:SitePoint PHP - 未播放的Opcache。
php 5.5之前,您可以使用APC,它也具有用戶緩存功能。
在應用程序中實現緩存時,有幾種技術。一個好的做法是緩存數據,該數據不會經常變化,但會反複查詢。
>高速緩存數據庫對數據庫進行了重大查詢,因為數據庫始終是每個PHP應用程序中最大的瓶頸。忽略最佳實踐和設計模式
您看到有人實現了自己的密碼加密算法多少次?可悲的是,這仍然發生在今天,因為缺乏知識或更危險的是,因為“我知道更好”的態度。
好吧,我不想給您帶來壞消息,但是有99%的時間您不了解它。
這些最佳實踐和設計模式被認為是由軟件工程師的原因比您和我更明智的原因,開發人員的唯一工作是為這項工作選擇正確的模式。
Martin Fowler的企業應用程序體系結構的模式
-
Matt Zandstra
- 不使用自動測試 應為Web應用程序的每個功能添加測試,但是測試對於一無所有,就像日誌一樣,如果沒有人看著它們並實際運行測試代碼以查看是否有任何破壞。
>手動運行測試是一個令人討厭的過程。幸運的是,“有一個
app工具”。實際上,有很多工具可以幫助您自動化測試,這是一個稱為連續集成的整體實踐。
>在PHP社區中廣泛使用的一種工具稱為Jenkins,它是CI服務器,不僅可以測試應用程序。塞巴斯蒂安·伯格曼(Sebastian Bergmann)為詹金斯(Jenkins)創建了一個出色的模板。
如果您發現這太壓倒了,則至少使用phpunit,behat或phpspec為應用程序編寫單元測試。起初似乎有很多工作,但是從長遠來看,測試可以幫助項目。
不審查 /審核代碼
在團隊中工作的
>在每個團隊成員都習慣不同風格的編程風格的情況下,並且如果沒有良好的規範,項目就可以迅速進行側面。如果您在團隊中並且不檢查彼此的代碼,那麼您應該真正做到這一點。就像單位測試一樣,它有助於項目保持清潔和一致。
>審核和審核之間的區別是您檢查代碼的時間。審查通常發生在將代碼庫合併到代碼庫並合併後進行審核之前。
審核是一件更好的事情,因為您有機會談論代碼,建議改進或修復,然後再與其他團隊成員的代碼合併。
評論的缺點是它正在阻止開發,因為在每次合併(在所有測試均為綠色的測試均為綠色之後)之前,至少有兩個開發人員需要討論代碼,這是審計發揮作用的地方。
審核發生後進行了合併,但它是無障礙的,但功能大大降低,因為它錯過了早期捕捉蟲子的機會。
審核比根本不檢查代碼還要好。
>為了幫助此過程盡可能平滑,您可以使用稱為Phabricator的工具,該工具是由Facebook的優秀工程師專門為此目的而創建的。它支持兩種代碼檢查策略。
為理想方案編碼
>曾經發現自己或聽說過一些無關緊要的樣板代碼並融入了所有地獄的情況?我當然做到了。
大多數情況下,這是因為開發人員很懶惰,並且為理想方案編寫代碼,在此情況下,數據庫失敗,PHP致命錯誤和服務器黑客攻擊是不存在的。代碼應以完全相反的情況編寫,開發人員應為他們能想到的最糟糕的情況編寫代碼,即使這樣,該代碼也不會涵蓋某些晦澀的角案例簽名並具有即時的完整管理員訪問。
>假設您的服務器不會被黑客入侵,否則您的代碼不會在某個時候斷開,並且您的數據庫始終啟動並運行是錯誤的。生產代碼應涵蓋這些方案和日誌錯誤。
在PHP中,甚至沒有意識到錯誤,就很容易提出錯誤。這主要是因為過去做出的不良語言設計決策,而不是由於時間而糾正。 PHP希望使開發人員不必考慮安全性,編碼和角落案例,實際上開發人員應該非常了解這一點,並始終練習防禦性編程。
不正確使用OOP原理
> PHP新的PHP開發人員在其代碼中沒有使用面向對象的編程,因為首先,該概念很難掌握。 OOP在1960年代首次使用,多年來一直在不斷完善,網絡上有大量有關它的信息。
>>此外,OOP不僅僅是課堂上組織的程序代碼。
對象,屬性,方法,繼承,封裝等的概念都是OOP的組成部分。
>正確使用這些原則的開發人員了解了OO設計模式,堅實的原則(單一責任,開放式,Liskov替代,接口隔離和依賴性反轉)以及如何在一般而言編寫清潔代碼,靈活的代碼,沒有't具有硬編碼的依賴性,並且易於擴展和建立。
>>了解OOP並開始編寫不依賴硬依賴性的干淨代碼永遠不會太晚(查看您,PHP Frameworks)。
“即時”編碼
大多數開發人員在
上大喊大叫時要做什麼實時服務器。這稱為在線編碼或牛仔編碼。>與其他每個行業一樣,在軟件開發中,工作流程和理智流程也應實施,以使項目取得成功。
通常,PHP和動態語言一般會鼓勵對代碼庫進行快速更改,立即查看修改的結果,但是這些更改應在生產環境中受到限制。
>
>要注意的另一件事,不要將連續交付與牛仔編碼和混亂管理混淆。持續交付恰好是實施和優化開發工作流程,因此可以盡快將代碼部署到生產環境中。>數據庫級別的監督
不區分讀 /寫查詢
為了支持一個長期運行的複雜項目,縮放需要在每個開發人員的腦海中。 99%的時間不需要擴展,因為它不會達到這種流量。
>>您確定將使用許多人使用Web應用程序,例如公司內部數百名員工使用的企業應用程序,您可以做出必要的步驟,以使項目更輕鬆地縮放。
>為什麼要分開讀 /寫查詢?
>數據庫始終是每個應用程序中的第一個瓶頸。這將是第一個在巨大流量下失敗的人。為了將流量卸載到多個數據庫服務器,開發人員使用Master -Slave或Master - Master Replication。 Master - Slave是最受歡迎的一個,它說每個選擇語句都需要路由到從數據庫服務器,而其他選擇則需要將其路由到主服務器,以平衡流量。 >
如果您的應用程序不知道讀取和寫查詢之間的分離,則不會知道要連接哪個數據庫服務器。 >請記住,如果您知道最終需要設置主人 - 從>>>
僅編碼一個數據庫連接
這與上述監督密切相關,但是有時開發人員可能有其他理由連接到多個數據庫。例如,如果您將用戶日誌,活動流,分析或其他知道讀/寫操作經常發生的數據保留,則可以將此流量卸載到其他數據庫服務器中。
>確保使用數據庫庫,該數據庫庫允許您連接到多個數據庫服務器,並且在它們之間很容易切換。一個好的解決方案是實現PDO並使用aura.sql擴展PDO。
不測試exploits的查詢>此監督與上面的“理想場景編碼”有關。同樣的事情,不同的平台。
>如果您不測試數據庫(和應用程序)的漏洞利用,則某些黑客會成功,他可能會成功。
>數據庫容易受到一系列漏洞的影響,最常見的是SQL注入攻擊。
>使用此備忘單,並通過應用程序的數據庫訪問庫運行查詢。在您的前端字段中寫下這些語句,例如用戶名,登錄頁面上的密碼字段。如果疑問都沒有通過,您可以購買啤酒並慶祝。
不將索引添加到表
索引就像表的TOC一樣,它是性能提升,應將其添加到每個表格中,並將其執行查詢的列(例如,Whewh where子句之後的列)。>數據庫索引背後有一個完整的理論,何時創建它,在哪些列和涵蓋的內容上。寫了一個整個單獨的文章系列。
>不使用交易
數據完整性對於Web應用程序非常重要。如果錯誤處理數據,整個網站可能會破壞。>
>您將交易用於處理的相關數據,持續或刪除在一起。>
例如,您保存有關用戶的數據,例如:電子郵件,表1中的用戶名密碼以及諸如名稱,姓氏,性別年齡等的個人資料數據。現在,如果用戶想刪除其帳戶,則使用交易,這應該是運行SQL查詢的操作。如果您不使用交易,則可能會失去數據完整性,因為數據的操作正在單獨運行。
>如果從>表1
中刪除數據成功,但失敗了>表2
,則用戶的配置文件數據將保留在數據庫中,更糟糕的是不會連接到任何東西,它將是孤兒。>
>通過使用交易不會發生這種情況,因為只有在交易中所有單獨的操作(例如,從表1和表2中刪除數據)成功的整個操作才能成功,否則數據庫將返回到先前的狀態。不固定敏感數據
>以純文本存儲密碼,或者在2014年滾動您自己的加密算法是不可接受的。 PHP社區現在已經足夠成熟,可以更好地了解。
>仍然,大概有成千上萬的數據庫,其中敏感的數據被存儲了未加密乞討被黑客偷走。
>>
$hash = password_hash( $password, PASSWORD_BCRYPT );
>注意:如果您沒有PHP 5.5(您現在應該現在應該),則可以使用password_compat庫,該庫實現了完全相同的方法。
處理財務數據要棘手,因為您需要對服務器,應用程序和數據庫級別具有PCI合規性。此處已經寫了一篇更深入的文章:SitePoint PHP - PCI合規性和PHP開發人員。應用程序設計監督
if ( password_verify( $password, $hash ) ) { ... }
>我看到許多開發人員甚至小型團隊為自己建立了糟糕的開發環境。
例如,處理新功能或修復錯誤並直接在實時網站上ft ft的文件。這在許多層面上都是錯誤的。>有團隊可以創建的無限數量的工作流程,但是網絡開發的經典是使用至少三個環境:開發,分期和生產。
>
>開發環境可以是每個程序員的本地,分期和生產通常是遙遠的,並且它們之間共享一些部分。開發是用於編碼的,分期用於測試,最後生產用於消費。猜猜會發生什麼?你說得對。一切都將在開發甚至分階段中工作,當您將其推到生產服務器上時,所有地獄都會鬆散,導致漫長的夜晚和很多咖啡因。
>難怪開髮圈中最常見的短語是:
由於創建了Vagrant,Docker和VirtualBox,因此現在非常容易地創建每個具有相同精確配置的環境。如果您以前從未使用過這些工具,則應停止您正在做的任何事情,並立即開始使用它們。
>no Backup
>一切都很好,網站是直播的,按時啟動,一切都啟動並運行,用戶消耗了美麗的數據。 nom,nom,nom…直到您在凌晨3點收到電子郵件。
>
備份,就像日誌記錄,緩存,安全性和防禦性編程一樣,在開發Web應用程序時應該是不可或缺的一部分,但是大多數開發人員(或sysadmins)忘記了。
>備份也應自動化,或者如果不可能,則至少應該每週手動備份。任何備份總比沒有備份好。
>>將代碼庫存儲在版本控制中,並使用分佈式版本控制系統(例如git或mercurial)。此設置使代碼庫非常多餘,因為每個從事該項目的開發人員都有代碼庫的版本。同樣,將代碼基庫存儲在github或bitbucket上,它們具有備份。
>備份數據庫更為重要,因為它是用戶創建的內容。始終將實際數據和備份存儲在不同的位置。
不備份數據可能會破壞業務,這將做到這一點 - 參見Ma.gnolia的著名案例,Ma.gnolia是當天更好的社交書籤網站之一。有線在整個災難上都有一個封面故事。
>無監視
“一切都很棒,沒有人快樂。” - 路易斯·C·K·
>您不開心,因為您不知道發生了什麼。為您的應用程序實施智能監控框架確實很重要。監視回答以下問題:
- 有人訪問了主應用服務器嗎? >
- 服務器是重載下方嗎? >
- 我們需要擴展到另一台數據庫服務器嗎? 應用程序在哪裡失敗?
- > 是脫機還是不適合我?
- > 在任何給定的時刻,了解這些問題的答案很重要,並且通過實時監控,您會的。為了實現這一目標,Nagios或New Relic之類的工具應成為您應用程序基礎架構的一部分。
結論
>使用此知識成為更好的程序員。記住這些疏忽,並儘量不要犯下這些疏忽。應用程序和數據庫級別的監督是最重要的記憶。
備份非常重要,始終練習防禦性編程並為最糟糕的情況做好準備,這就是Web開發的運作方式。編程很難,但是做對了,很有趣。
>清單
在下面,您會找到本文中發現的所有監督的清單。看看您現在可以越過多少人,並始終嘗試將它們全部弄清楚。
- 是否在開發和生產中顯示錯誤並顯示錯誤?
請勿抑制代碼中的錯誤。 -
實現一個記錄框架。 -
使用緩存策略。 -
請記住並使用編程設計模式和最佳實踐。 >
- 在代碼中使用測試,並嘗試在代碼庫中發生更改時運行這些測試的自動化。
>
審查或至少審核團隊成員的代碼。 -
練習防禦編程。 -
正確地學習和使用OOP原則。 -
有一個可靠的工作流程和用於開發和部署代碼的過程。 >
- 區分讀 /寫數據庫查詢。
>
- 使用可以連接到多個數據庫的堅固數據庫庫。
>
測試sql查詢的漏洞。 -
在數據庫表上學習和使用索引-
>使用數據庫事務。 -
>數據庫中的安全敏感數據。 -
使用不同的編碼環境:開發,分期,生產。
- 實施備份和監視策略。
-
經常詢問有關網絡開發監督的問題(常見問題解答)-
> Web開發中有哪些常見的監督? - Web開發是一個複雜的過程,很容易忽略某些方面。一些常見的監督包括不對移動設備進行優化,忽略SEO,忽略網站速度和性能,不設置適當的開發環境,也不考慮跨瀏覽器的兼容性。這些疏忽會導致較差的用戶體驗,並可能對網站的性能產生負面影響。
>>我如何設置現代網絡開發環境?開發環境涉及多個步驟。首先,您需要安裝一個好的文本編輯器,例如Visual Studio代碼或崇高的文本。接下來,安裝Node.js和NPM,這對於現代JavaScript開發至關重要。您還應該設置像Git這樣的版本控制系統。最後,考慮使用YARN或NPM等軟件包管理器,以及像Gulp或WebPack這樣的任務跑步者。
>移動優化在Web開發中的重要性是什麼?隨著越來越多的用戶從其移動設備訪問網站,開發。未針對移動設備進行優化的網站可能會導致較差的用戶體驗,從而導致參與度和轉化率較低。移動優化涉及設計網站的響應迅速,這意味著它可以調整以適合不同的屏幕尺寸,並確保在移動設備上迅速加載。
>如何改善網站的SEO?
改進網站的SEO涉及多個步驟。首先,確保您的網站很容易通過搜索引擎爬網。這涉及使用適當的HTML標籤,創建站點地圖和使用robots.txt文件。接下來,通過使用相關關鍵字,創建高質量內容並使用元標籤來優化內容。另外,請考慮使用模式標記為搜索引擎提供更多信息。
>為什麼網站速度和性能很重要?
網站速度和性能對於用戶體驗和SEO至關重要。緩慢加載的網站會使用戶感到沮喪並導致更高的跳出率。此外,像Google這樣的搜索引擎將網站速度視為排名因素。您可以通過優化圖像,縮小CSS和JavaScript文件以及使用內容輸送網絡(CDN)來提高網站的速度和性能。
>什麼是跨瀏覽器兼容性,為什麼重要? 🎜>跨瀏覽器兼容性意味著您的網站正常工作,並且在不同的Web瀏覽器中看起來一致。這很重要,因為您的用戶可能正在使用不同的瀏覽器,並且在特定瀏覽器上無法正常工作的網站會導致用戶體驗差。您可以通過使用符合標準的代碼並在不同的瀏覽器上測試您的網站來確保跨瀏覽器的兼容性。 >
>我如何避免使用常見的Web開發監督?避免避免進行常見的Web開發監督涉及仔細計劃和測試。確保為移動和SEO優化您的網站,建立適當的開發環境,並考慮跨瀏覽器的兼容性。定期在不同的設備和瀏覽器上測試您的網站,並使用Google Lighthouse之類的工具來檢查您的網站的性能和SEO。
>版本控制系統在Web開發中的作用是什麼?諸如Git之類的版本控制系統使您可以跟踪代碼的更改,從而更容易與他人協作,並在必要時恢復到代碼的先前版本。這是現代Web開發的必不可少的工具。
什麼是軟件包管理器,為什麼在Web開發中很重要?
>> npm或YARN這樣的軟件包管理器允許您管理和安裝軟件包。 ,這是可重複使用的代碼。它在Web開發中很重要,因為它使管理依賴項變得更容易,並確保您的項目具有所需軟件包的正確版本。
>什麼是任務跑步者,為什麼在Web開發中很重要?
>諸如Gulp或WebPack之類的任務跑步者會自動化重複任務,例如縮小,編譯,單位測試和絨毛。這在網絡開發中很重要,因為它可以節省您的時間並幫助您維護一致的代碼庫。以上是Web開發中的18個關鍵監督的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

會話劫持可以通過以下步驟實現:1.獲取會話ID,2.使用會話ID,3.保持會話活躍。在PHP中防範會話劫持的方法包括:1.使用session_regenerate_id()函數重新生成會話ID,2.通過數據庫存儲會話數據,3.確保所有會話數據通過HTTPS傳輸。

PHP8.1中的枚舉功能通過定義命名常量增強了代碼的清晰度和類型安全性。 1)枚舉可以是整數、字符串或對象,提高了代碼可讀性和類型安全性。 2)枚舉基於類,支持面向對象特性,如遍歷和反射。 3)枚舉可用於比較和賦值,確保類型安全。 4)枚舉支持添加方法,實現複雜邏輯。 5)嚴格類型檢查和錯誤處理可避免常見錯誤。 6)枚舉減少魔法值,提升可維護性,但需注意性能優化。

SOLID原則在PHP開發中的應用包括:1.單一職責原則(SRP):每個類只負責一個功能。 2.開閉原則(OCP):通過擴展而非修改實現變化。 3.里氏替換原則(LSP):子類可替換基類而不影響程序正確性。 4.接口隔離原則(ISP):使用細粒度接口避免依賴不使用的方法。 5.依賴倒置原則(DIP):高低層次模塊都依賴於抽象,通過依賴注入實現。

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

RESTAPI設計原則包括資源定義、URI設計、HTTP方法使用、狀態碼使用、版本控制和HATEOAS。 1.資源應使用名詞表示並保持層次結構。 2.HTTP方法應符合其語義,如GET用於獲取資源。 3.狀態碼應正確使用,如404表示資源不存在。 4.版本控制可通過URI或頭部實現。 5.HATEOAS通過響應中的鏈接引導客戶端操作。

在PHP中,異常處理通過try,catch,finally,和throw關鍵字實現。 1)try塊包圍可能拋出異常的代碼;2)catch塊處理異常;3)finally塊確保代碼始終執行;4)throw用於手動拋出異常。這些機制幫助提升代碼的健壯性和可維護性。

匿名類在PHP中的主要作用是創建一次性使用的對象。 1.匿名類允許在代碼中直接定義沒有名字的類,適用於臨時需求。 2.它們可以繼承類或實現接口,增加靈活性。 3.使用時需注意性能和代碼可讀性,避免重複定義相同的匿名類。
