>本文將涵蓋大多數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的企業應用程序體系結構的模式
工具”。實際上,有很多工具可以幫助您自動化測試,這是一個稱為連續集成的整體實踐。
>在PHP社區中廣泛使用的一種工具稱為Jenkins,它是CI服務器,不僅可以測試應用程序。塞巴斯蒂安·伯格曼(Sebastian Bergmann)為詹金斯(Jenkins)創建了一個出色的模板。
如果您發現這太壓倒了,則至少使用phpunit,behat或phpspec為應用程序編寫單元測試。起初似乎有很多工作,但是從長遠來看,測試可以幫助項目。
不審查 /審核代碼
在團隊中工作的
>在每個團隊成員都習慣不同風格的編程風格的情況下,並且如果沒有良好的規範,項目就可以迅速進行側面。審核和審核之間的區別是您檢查代碼的時間。審查通常發生在將代碼庫合併到代碼庫並合併後進行審核之前。
審核是一件更好的事情,因為您有機會談論代碼,建議改進或修復,然後再與其他團隊成員的代碼合併。
評論的缺點是它正在阻止開發,因為在每次合併(在所有測試均為綠色的測試均為綠色之後)之前,至少有兩個開發人員需要討論代碼,這是審計發揮作用的地方。
審核發生後進行了合併,但它是無障礙的,但功能大大降低,因為它錯過了早期捕捉蟲子的機會。
審核比根本不檢查代碼還要好。
>為了幫助此過程盡可能平滑,您可以使用稱為Phabricator的工具,該工具是由Facebook的優秀工程師專門為此目的而創建的。它支持兩種代碼檢查策略。
>曾經發現自己或聽說過一些無關緊要的樣板代碼並融入了所有地獄的情況?我當然做到了。
大多數情況下,這是因為開發人員很懶惰,並且為理想方案編寫代碼,在此情況下,數據庫失敗,PHP致命錯誤和服務器黑客攻擊是不存在的。代碼應以完全相反的情況編寫,開發人員應為他們能想到的最糟糕的情況編寫代碼,即使這樣,該代碼也不會涵蓋某些晦澀的角案例簽名並具有即時的完整管理員訪問。
>假設您的服務器不會被黑客入侵,否則您的代碼不會在某個時候斷開,並且您的數據庫始終啟動並運行是錯誤的。生產代碼應涵蓋這些方案和日誌錯誤。
在PHP中,甚至沒有意識到錯誤,就很容易提出錯誤。這主要是因為過去做出的不良語言設計決策,而不是由於時間而糾正。 PHP希望使開發人員不必考慮安全性,編碼和角落案例,實際上開發人員應該非常了解這一點,並始終練習防禦性編程。
不正確使用OOP原理
> PHP新的PHP開發人員在其代碼中沒有使用面向對象的編程,因為首先,該概念很難掌握。 OOP在1960年代首次使用,多年來一直在不斷完善,網絡上有大量有關它的信息。
>對象,屬性,方法,繼承,封裝等的概念都是OOP的組成部分。
>正確使用這些原則的開發人員了解了OO設計模式,堅實的原則(單一責任,開放式,Liskov替代,接口隔離和依賴性反轉)以及如何在一般而言編寫清潔代碼,靈活的代碼,沒有't具有硬編碼的依賴性,並且易於擴展和建立。
>>了解OOP並開始編寫不依賴硬依賴性的干淨代碼永遠不會太晚(查看您,PHP Frameworks)。
“即時”編碼
大多數開發人員在
上大喊大叫時要做什麼實時服務器。這稱為在線編碼或牛仔編碼。>與其他每個行業一樣,在軟件開發中,工作流程和理智流程也應實施,以使項目取得成功。
通常,PHP和動態語言一般會鼓勵對代碼庫進行快速更改,立即查看修改的結果,但是這些更改應在生產環境中受到限制。
>
>要注意的另一件事,不要將連續交付與牛仔編碼和混亂管理混淆。持續交付恰好是實施和優化開發工作流程,因此可以盡快將代碼部署到生產環境中。>數據庫級別的監督
不區分讀 /寫查詢
>您確定將使用許多人使用Web應用程序,例如公司內部數百名員工使用的企業應用程序,您可以做出必要的步驟,以使項目更輕鬆地縮放。
>為什麼要分開讀 /寫查詢?
>請記住,如果您知道最終需要設置主人 - 從>>>
僅編碼一個數據庫連接
這與上述監督密切相關,但是有時開發人員可能有其他理由連接到多個數據庫。例如,如果您將用戶日誌,活動流,分析或其他知道讀/寫操作經常發生的數據保留,則可以將此流量卸載到其他數據庫服務器中。
>確保使用數據庫庫,該數據庫庫允許您連接到多個數據庫服務器,並且在它們之間很容易切換。一個好的解決方案是實現PDO並使用aura.sql擴展PDO。
不測試exploits的查詢>如果您不測試數據庫(和應用程序)的漏洞利用,則某些黑客會成功,他可能會成功。
>數據庫容易受到一系列漏洞的影響,最常見的是SQL注入攻擊。
>使用此備忘單,並通過應用程序的數據庫訪問庫運行查詢。在您的前端字段中寫下這些語句,例如用戶名,登錄頁面上的密碼字段。如果疑問都沒有通過,您可以購買啤酒並慶祝。
不將索引添加到表
索引就像表的TOC一樣,它是性能提升,應將其添加到每個表格中,並將其執行查詢的列(例如,Whewh where子句之後的列)。>數據庫索引背後有一個完整的理論,何時創建它,在哪些列和涵蓋的內容上。寫了一個整個單獨的文章系列。
>>
>您將交易用於處理的相關數據,持續或刪除在一起。>
例如,您保存有關用戶的數據,例如:電子郵件,表1中的用戶名密碼以及諸如名稱,姓氏,性別年齡等的個人資料數據。>表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·
>您不開心,因為您不知道發生了什麼。為您的應用程序實施智能監控框架確實很重要。監視回答以下問題:
結論
備份非常重要,始終練習防禦性編程並為最糟糕的情況做好準備,這就是Web開發的運作方式。編程很難,但是做對了,很有趣。
>清單
在下面,您會找到本文中發現的所有監督的清單。看看您現在可以越過多少人,並始終嘗試將它們全部弄清楚。改進網站的SEO涉及多個步驟。首先,確保您的網站很容易通過搜索引擎爬網。這涉及使用適當的HTML標籤,創建站點地圖和使用robots.txt文件。接下來,通過使用相關關鍵字,創建高質量內容並使用元標籤來優化內容。另外,請考慮使用模式標記為搜索引擎提供更多信息。
>>
>我如何避免使用常見的Web開發監督?>版本控制系統在Web開發中的作用是什麼?諸如Git之類的版本控制系統使您可以跟踪代碼的更改,從而更容易與他人協作,並在必要時恢復到代碼的先前版本。這是現代Web開發的必不可少的工具。
> npm或YARN這樣的軟件包管理器允許您管理和安裝軟件包。 ,這是可重複使用的代碼。它在Web開發中很重要,因為它使管理依賴項變得更容易,並確保您的項目具有所需軟件包的正確版本。
>什麼是任務跑步者,為什麼在Web開發中很重要?
>諸如Gulp或WebPack之類的任務跑步者會自動化重複任務,例如縮小,編譯,單位測試和絨毛。這在網絡開發中很重要,因為它可以節省您的時間並幫助您維護一致的代碼庫。以上是Web開發中的18個關鍵監督的詳細內容。更多資訊請關注PHP中文網其他相關文章!