1. 程式人生 > >開發規範-PHP

開發規範-PHP

1、編碼規範

1.【強制】程式碼中的命名不允許中英文混合命名,純拼音的命名也要儘量避免。

2.【強制】類名使用駝峰式命名,UpperCamelCase風格。(一些通用的大寫風格可以例外,但要易於閱讀,比如PHPExcel類)。

Yii生成的Model都要統一帶上Model字尾,避免與其他業務場景的類命名衝突。比如points_history表對應的model名稱應該是PointsHistoryModel。

特定業務或者功能的類,儘量增加功能描述的字尾,易於理解。比如一個專門請求庫存介面的類,屬於Stock服務的客戶端,命名為StockClientProxy,帶上Proxy字尾,表示用於代理請求;比如庫存的資料庫操作類命名為StockDao,帶上Dao字尾,表示用於資料庫操作。

3.【強制】方法名、引數名、成員變數、區域性變數都統一使用lowerCamelCase風格,必須遵從駝峰形式。(首字母小寫)。

專門對常量的描述的靜態陣列例外。

4 .【強制】陣列中的key如果要對應資料庫的欄位名,統一使用全小寫加下劃線風格。不允許不同風格的key混用。

5.【強制】常量命名全部大寫,單詞間用下劃線隔開,力求語義表達完整清楚,不要嫌名字長。

【推薦】Model類中的欄位表達列舉型別意義的,在model類中把意義用常量定義出來,並增加靜態陣列變數解釋,使用大寫,並使用ARR_做字首。

例如對應的欄位叫做reg_from,欄位含義可以常量列舉(不是跨表動態關聯),含義為1=PC端,2=M端,3=APP端:

const REG_FROM_PC  = 1;

const REG_FROM_MOB =2;

const REG_FROM_APP =3;

$ARR_REG_FROM = [

    self::REG_FROM_PC  => 'PC端',

    self::REG_FROM_MOB => 'M端',

    self::REG_FROM_APP => 'APP端',

];

這種方式在業務中使用時,要列舉該欄位的可選內容時,要遍歷這裡的ARR_中的內容,而不是使用if ($regFromItem==1) {echo 'PC端';} elseif($regFromItem==2) {...}這種方式。

Proxy類,Dao類等其他業務類中可能也有類似的場景。可同樣應用。

6.【強制】抽象類命名使用Abstract開頭;異常類命名使用Exception結尾;測試類命名以它要測試的類的名稱開始,以Test結尾;工廠類使用Factory結尾;Interface宣告使用Interface結尾。

如果使用到了設計模式,建議在類名中體現出具體模式。 將設計模式體現在名字中,有利於閱讀者快速理解架構設計思想。

7.【推薦】模組名統一使用小寫,使用單數形式,但是類名如果有複數含義,類名可以使用複數形式。

8.【強制】不允許出現任何魔法值(即未經定義的常量)直接出現在程式碼中。

9.【推薦】不要使用一個常量類維護所有常量,應該按常量功能進行歸類,分開維護。如:快取相關的常量放在類:CacheConsts下;系統配置相關的常量放在類:ConfigConsts下。

10.【強制】大括號的使用約定。如果是大括號內為空,則簡潔地寫成{}即可,不需要換行;如果是非空程式碼塊則:

 1) 左大括號前不換行。

 2) 左大括號後換行。

 3) 右大括號前換行。

 4) 右大括號後還有else等程式碼則不換行;表示終止右大括號後必須換行。

11.【強制】 左括號和後一個字元之間不出現空格;同樣,右括號和前一個字元之間也不出現空格。詳見第5條下方正例提示。

12.【強制】if/for/while/switch/do等保留字與左右括號之間都必須加空格。

13.【參考】運算子左右加一個空格,但表示負責的邏輯判斷,關係緊密的邏輯判斷可以沒有空格,但是儘量使用括號把關係緊密的邏輯包起來。

14.【強制】縮排採用4個空格,禁止使用tab字元。

15.【強制】字串儘量使用'',以提高效率,需要複雜格式時,再使用""。

例子【9-15】:

public staticgetMemberName($memberId) {

    // 縮排4個空格

    $name = '';

    // 運算子的左右必須有一個空格

    // 關鍵詞if與括號之間必須有一個空格,括號內的$與左括號,0與右括號不需要空格

    // 左大括號前加空格且不換行;左大括號後換行

    if ($memberId == 0) {

        Yii::log('illegal memberId:'.$memberId,'error', __METHOD__);

        // 右大括號前換行,右大括號後有else,不用換行

    } else {

        $name = MemberModel::getMemberNameByMemberId($memberId);

    // 在右大括號後直接結束,則必須換行

    }

    return $name;

}

16.【推薦】單行字元數限不超過 120 個,超出需要換行時,換行遵循如下原則:

 1) 第二行相對一縮排一層,從第三行開始不再繼續縮排參考示例。

 2) 運算子與下文一起換行。

 3) 方法呼叫的->符號與下文一起換行。

 4) 在多個引數超長,逗號後進行換行。

 5) 在括號前不要換行。

例如:

    if ($isLegalA && ....

        || $isLegalM || $isLegalN... //比上一行縮排一層,連結的運算子放到本行

        || $isLegalP || $isLegalQ... //與上一行保持一樣的縮排

        || $isLegalU || $isLegalV) { //與上一行保持一樣的縮排

        $bizObj->checkA() ... ->checkB()

            ->checkM()->checkN();//比上一行縮排一層

    }

17.【推薦】陣列宣告時,其中欄位較多時(超過3個),使用每行一個'key'=>'val'。(key下有陣列的使用同樣的規則)

18.【強制】IDE的text file encoding設定為UTF-8; IDE中檔案的換行符使用Unix格式換行符(LF),不要使用windows格式(CR+LF)。

19.【強制】不要使用位元組序標記(BOM),和 UTF-16 和UTF-32 不一樣, UTF-8 編碼格式的檔案不需要指定位元組序。而且 BOM 會在 PHP 的輸出中產生副作用, 它會阻止應用程式設定它的頭資訊。

PHP 起始標籤的前面和結束標籤的後面都不要留空格,輸出是被快取的,所以如果你的檔案中有空格的話,這些空格會在框架輸出它的內容之前被輸出,從而會導致錯誤,而且也會導致框架無法傳送正確的頭資訊。

20.【強制】註釋

通常情況下,應該多寫點註釋,這不僅可以向那些缺乏經驗的程式設計師描述程式碼的流程和意圖, 而且當你幾個月後再回過頭來看自己的程式碼時仍能幫你很好的理解。註釋並沒有強制規定的格式,但是我們建議以下的形式。

DocBlock 風格的註釋,寫在類、方法和屬性定義的前面,可以被 IDE 識別:

/**

 * Super Class

 *

 * @package Package Name

 * @subpackage Subpackage

 * @category   Category

 * @author Author Name

 * @link   http://example.com

 */

class Super_class {

/**

 * Encodes string for use in XML

 *

 * @param  string  $str    Input string

 * @return string

 */

functionxml_encode($str)

/**

 * Data for class manipulation

 *

 * @var array

 */

public $data =array();

單行註釋應該和程式碼合在一起,大塊的註釋和程式碼之間應該留一個空行。大的程式碼塊之間也應該留空行,形成程式碼段落。

21. 【強制】對外暴露的介面簽名,原則上不允許修改方法簽名,避免對介面呼叫方產生影響。

22.【推薦】對於覆蓋了父類的方法,函式頭註釋中增加@Override或適當說明。

23.【強制】對返回值進行比較以及型別轉換

有一些 PHP 函式在失敗時返回 FALSE ,但是也可能會返回 "" 或 0 這樣的有效值, 這些值在鬆散型別比較時和 FALSE 是相等的。所以當你在條件中使用這些返回值作比較時,一定要使用嚴格型別比較,確保返回值確實是你想要的,而不是鬆散型別的其他值。

在檢查你自己的返回值和變數時也要遵循這種嚴格的方式,必要時使用=== 和 !== 。

24.【強制】不要在你的提交中包含除錯程式碼,就算是註釋掉了也不行。像 var_dump() 、 print_r() 、 die() 和 exit() 這樣的函式,都不應該包含在你的程式碼裡, 除非它們用於除除錯之外的其他特殊用途。

25.【強制】一個類一個檔案

除非幾個類是*緊密相關的*,否則每個類應該單獨使用一個檔案。

26.【強制】PHP錯誤處理

執行程式碼時不應該出現任何錯誤資訊,並不是把警告和提示資訊關掉來滿足這一點。 例如,絕不要直接訪問一個你沒設定過的變數(例如,$_POST 陣列), 你應該先使用 isset() 函式判斷下。

當前測試環境和beta環境報錯設定為:E_ALL &~ E_NOTICE &~ E_WARNING。

除了入口檔案,程式碼中不允執行ini_set,display_errors等修改系統配置的方法。

27.【強制】預設的函式引數

適當的時候,提供函式引數的預設值,這有助於防止因錯誤的函式呼叫引起的PHP錯誤,另外提供常見的備選值可以節省幾行程式碼。

28.【強制】每行只有一句程式碼。

29.【強制】構造方法裡面禁止加入任何業務邏輯,及任何有可能出錯的邏輯,例如資料庫執行sql,如果有初始化邏輯,請放在init方法中。因為無法判斷構造方法不允許錯誤。

30.【參考】註釋掉的程式碼儘量要配合說明,而不是簡單的註釋掉。

歡迎補充。

2、業務設計規範

2.1 業務設計思路

         Yii框架為我們提供了基礎的MVC結構,並提供Module用於封裝公用模組。

         在日益增長的業務需求下,我們的業務需要擴充套件性,可維護性,所以我們引入應用分層概念。

         如圖,業務上層依賴下層,應當避免跨級呼叫。


頁面顯示層:

         本應用的顯示輸出等。輸出tpl轉換的html,js等。

         只做簡單的引數校驗,登陸狀態,cookie/session等校驗。(不允許汙染$_GET,$_POST等資料。)不處理具體業務,業務交給下層的業務邏輯層處理。

http介面服務層:

         對其他業務或平臺提供基於http的介面服務。輸出json等格式資料。

         不處理具體業務,業務交給下層的業務邏輯層處理。

業務邏輯層:

         處理具體的業務邏輯,會呼叫持久層,按情況呼叫快取層,可以啟用事務,可呼叫第三方資料,並有業務日誌,錯誤時提供適當的錯誤資訊返回。

         比如訂單邏輯,獲取登陸使用者資料和商品資料,生成訂單,返回訂單生成結果。

高階服務層:

         對基礎服務元件進行組裝的一些相對複雜的服務,可提供給業務邏輯層使用。

         比如傳送簡訊服務,該服務實現判斷手機號碼是否正確,是否可疑,是否超過次數,呼叫傳送簡訊的基礎服務,並插入資料庫。業務邏輯層可能是傳送推廣簡訊,可能是註冊驗證碼簡訊。

資料持久層:

         Dao層,Yii自動生成的Model,或者自己封裝的Dao類,或者對Oracle,File等的操作。

基礎服務元件層:

         日誌,第三方介面的client,快取等。

服務或者業務內部,使用的資料必須獨立,不能跨範圍讀別的業務的表,必須通過別的業務提供的公開的方法去訪問。服務或業務內部保持資料的完整性,一致性。

2.2事務性邏輯說明:

         事務使用try-catch語句塊,事務開啟後,必須有commit或rollback處理,不允許中途退出。

         事務中途退出,在try塊中使用throwexception的方式。

         事務失敗後,要有一定的error log,並通過返回值返回,保證錯誤原因可追溯。

         有throw必然要有catch。本類中如不做catch,必須註釋說明呼叫方主動catch。

2.3其他說明:

1.【強制】在一個switch塊內,每個case要麼通過break/return等來終止,要麼註釋說明程式將繼續執行到哪一個case為止;多個case公用一個break的時候必須保持每個case不能有不一樣的程式碼,必須使用公用程式碼;在一個switch塊內,都必須包含一個default語句並且放在最後,即使它什麼程式碼也沒有。

2.【強制】for/switch中不允許return/exit/die

不允許直接在case下return,或者在for/while中return,應該標記結果,在switch/for/while塊外面return。

3.【推薦】迴圈體中的語句要考量效能,以下操作儘量移至迴圈體外處理,如定義物件、變數、獲取資料庫連線,進行不必要的try-catch操作(這個try-catch是否可以移至迴圈體外)。

4.【推薦】介面入參保護,這種場景常見的是用於做批量操作的介面。

5.【強制】基於互不信任原則,控制層呼叫業務層或者服務層方法時,控制層要做引數校驗,服務層也要做引數校驗。

對於嚴格的複雜的基於服務層方法的校驗,可以由服務層校驗。對於校驗方法複雜,時間長,應該由服務層來實現該校驗方法,並由服務層來校驗。

6.【參考】方法中需要進行引數校驗的場景:

 1) 呼叫頻次低的方法。

 2) 執行時間開銷很大的方法,引數校驗時間幾乎可以忽略不計,但如果因為引數錯誤導致中間執行回退,或者錯誤,那得不償失。

 3) 需要極高穩定性和可用性的方法。

 4) 對外提供的開放介面,不管是RPC/API/HTTP介面。

 5) 敏感許可權入口。

7.【參考】方法中不需要引數校驗的場景:

 1) 極有可能被迴圈呼叫的方法,不建議對引數進行校驗。但在方法說明裡必須註明外部引數檢查。

 2) 底層的方法呼叫頻度都比較高,一般不校驗。畢竟是像純淨水過濾的最後一道,引數錯誤不太可能到底層才會暴露問題。一般DAO層與Service層都在同一個應用中,部署在同一臺伺服器中,所以DAO的引數校驗,可以省略。

 3) 被宣告成private只會被自己程式碼所呼叫的方法,如果能夠確定呼叫方法的程式碼傳入引數已經做過檢查或者肯定不會有問題,此時可以不校驗引數。

8.【強制】如果方法返回的是一個固定格式的陣列,或者物件,那不管走到任何if else等都要保證有按照格式或物件的內容返回,不允許只有if有返回,而else沒有返回。

9.【強制】有throw必然要有catch。本類中如不做catch,必須註釋說明呼叫方主動catch。

3、安全規範

1.【強制】隸屬於使用者個人的頁面或者功能必須進行許可權控制校驗。

2.【強制】使用者敏感資料禁止直接展示,必須對展示資料脫敏。

3.【強制】使用者輸入的SQL引數嚴格使用引數繫結或者Model::rules欄位值限定,防止SQL注入,禁止字串拼接SQL訪問資料庫。

4.【強制】使用者請求傳入的任何引數必須做有效性驗證。

 說明:忽略引數校驗可能導致:

 page size過大導致記憶體溢位

 惡意order by導致資料庫慢查詢

 任意重定向

  SQL注入

 反序列化注入

 正則輸入源串拒絕服務ReDoS

5.【強制】禁止向HTML頁面輸出未經安全過濾或未正確轉義的使用者資料。

6.【強制】表單、AJAX提交必須執行CSRF安全過濾。

 說明:CSRF(Cross-site request forgery)跨站請求偽造是一類常見程式設計漏洞。對於存在CSRF漏洞的應用/網站,攻擊者可以事先構造好URL,只要受害者使用者一訪問,後臺便在使用者不知情情況下對資料庫中使用者引數進行相應修改。

7.【強制】在使用平臺資源,譬如簡訊、郵件、電話、下單、支付,必須實現正確的防重放限制,如數量限制、疲勞度控制、驗證碼校驗,避免被濫刷、資損。

 說明:如註冊時傳送驗證碼到手機,如果沒有限制次數和頻率,那麼可以利用此功能騷擾到其它使用者,並造成簡訊平臺資源浪費。

8.【推薦】發貼、評論、傳送即時訊息等使用者生成內容的場景必須實現防刷、文字內容違禁詞過濾等風控策略。

9.【強制】傳送簡訊等大額消耗公司資源的功能,必須新增圖形驗證碼校驗,防止簡訊平臺資源浪費。

4、資料庫設計規範

(一) 建表規約

1. 【強制】表達是與否概念的欄位,必須使用is_xxx的方式命名,資料型別是unsigned tinyint( 1表示是,0表示否),此規則同樣適用於odps建表。

 說明:任何欄位如果為非負數,必須是unsigned。

2. 【強制】表名、欄位名必須使用小寫字母或數字;禁止出現數字開頭,禁止兩個下劃線中間只出現數字。資料庫欄位名的修改代價很大,因為無法進行預釋出,所以欄位名稱需要慎重考慮。

 正例:getter_admin,task_config,level3_name

 反例:GetterAdmin,taskConfig,level_3_name

3. 【強制】表名不使用複數名詞。 說明:表名應該僅僅表示表裡面的實體內容,不應該表示實體數量,對應於DO類名也是單數形式,符合表達習慣。

4. 【強制】禁用保留字,如desc、range、match、delayed等,請參考MySQL官方保留字。

5. 【強制】唯一索引名為uk_欄位名;普通索引名則為idx_欄位名。

 說明:uk_ 即 unique key;idx_ 即index的簡稱。

6. 【強制】小數型別為decimal,禁止使用float和double。 說明:float和double在儲存的時候,存在精度損失的問題,很可能在值的比較時,得到不正確的結果。如果儲存的資料範圍超過decimal的範圍,建議將資料拆成整數和小數分開儲存。

7. 【強制】如果儲存的字串長度幾乎相等,使用char定長字串型別。

8. 【強制】varchar是可變長字串,不預先分配儲存空間,長度不要超過5000,如果儲存長度大於此值,定義欄位型別為text,獨立出來一張表,用主鍵來對應,避免影響其它欄位索引效率。

9. 【強制】表必備三欄位:id,gmt_create, gmt_modified。

 說明:其中id必為主鍵,型別為unsigned bigint、單表時自增、步長為1。gmt_create, gmt_modified的型別均為date_time型別。

10. 【推薦】表的命名最好是加上“業務名稱_表的作用”。

 正例:tiger_task / tiger_reader / mpp_config

11. 【推薦】庫名與應用名稱儘量一致。

12. 【推薦】如果修改欄位含義或對欄位表示的狀態追加時,需要及時更新欄位註釋。

13. 【推薦】欄位允許適當冗餘,以提高效能,但是必須考慮資料同步的情況。冗餘欄位應遵循:

 1)不是頻繁修改的欄位。

 2)不是varchar超長欄位,更不能是text欄位。 正例:商品類目名稱使用頻率高,欄位長度短,名稱基本一成不變,可在相關聯的表中冗餘儲存類目名稱,避免關聯查詢。

14. 【推薦】單錶行數超過500萬行或者單表容量超過2GB,才推薦進行分庫分表。 說明:如果預計三年後的資料量根本達不到這個級別,請不要在建立表時就分庫分表。

15. 【參考】合適的字元儲存長度,不但節約資料庫表空間、節約索引儲存,更重要的是提升檢索速度。

 正例:人的年齡用unsigned tinyint(表示範圍0-255,人的壽命不會超過255歲);海龜就必須是smallint,但如果是太陽的年齡,就必須是int;如果是所有恆星的年齡都加起來,那麼就必須使用bigint。

(二) 索引規約

1. 【強制】業務上具有唯一特性的欄位,即使是組合欄位,也必須建成唯一索引。說明:不要以為唯一索引影響了insert速度,這個速度損耗可以忽略,但提高查詢速度是明顯的;另外,即使在應用層做了非常完善的校驗和控制,只要沒有唯一索引,根據墨菲定律,必然有髒資料產生。

2. 【強制】 超過三個表禁止join。需要join的欄位,資料型別保持絕對一致;多表關聯查詢時,保證被關聯的欄位需要有索引。說明:即使雙表join也要注意表索引、SQL效能。

3. 【強制】在varchar欄位上建立索引時,必須指定索引長度,沒必要對全欄位建立索引,根據實際文字區分度決定索引長度。說明:索引的長度與區分度是一對矛盾體,一般對字串型別資料,長度為20的索引,區分度會高達90%以上,可以使用count(distinct left(列名, 索引長度))/count(*)的區分度來確定。

4. 【強制】頁面搜尋嚴禁左模糊或者全模糊,如果需要請走搜尋引擎來解決。說明:索引檔案具有B-Tree的最左字首匹配特性,如果左邊的值未確定,那麼無法使用此索引。

5. 【推薦】如果有orderby的場景,請注意利用索引的有序性。order by 最後的欄位是組合索引的一部分,並且放在索引組合順序的最後,避免出現file_sort的情況,影響查詢效能。正例:where a=? and b=? order by c; 索引:a_b_c 反例:索引中有範圍查詢,那麼索引有序性無法利用,如:WHERE a>10 ORDER BY b; 索引a_b無法排序。

6. 【推薦】利用覆蓋索引來進行查詢操作,來避免回表操作。 說明:如果一本書需要知道第11章是什麼標題,會翻開第11章對應的那一頁嗎?目錄瀏覽一下就好,這個目錄就是起到覆蓋索引的作用。正例:能夠建立索引的種類:主鍵索引、唯一索引、普通索引,而覆蓋索引是一種查詢的一種效果,用explain的結果,extra列會出現:using index。

7. 【推薦】利用延遲關聯或者子查詢優化超多分頁場景。 說明:MySQL並不是跳過offset行,而是取offset+N行,然後返回放棄前offset行,返回N行,那當offset特別大的時候,效率就非常的低下,要麼控制返回的總頁數,要麼對超過特定閾值的頁數進行SQL改寫。正例:先快速定位需要獲取的id段,然後再關聯: SELECT a.* FROM 表1 a, (select id from 表1 where 條件 LIMIT 100000,20 ) b where a.id=b.id

8. 【推薦】 SQL效能優化的目標:至少要達到range 級別,要求是ref級別,如果可以是consts最好。說明: 1)consts 單表中最多隻有一個匹配行(主鍵或者唯一索引),在優化階段即可讀取到資料。 2)ref 指的是使用普通的索引(normal index)。 3)range 對索引進行範圍檢索。反例:explain表的結果,type=index,索引物理檔案全掃描,速度非常慢,這個index級別比較range還低,與全表掃描是小巫見大巫。

9. 【推薦】建組合索引的時候,區分度最高的在最左邊。 正例:如果wherea=? and b=? ,a列的幾乎接近於唯一值,那麼只需要單建idx_a索引即可。說明:存在非等號和等號混合判斷條件時,在建索引時,請把等號條件的列前置。如:where a>? and b=? 那麼即使a的區分度更高,也必須把b放在索引的最前列。

10. 【參考】建立索引時避免有如下極端誤解:

 1)誤認為一個查詢就需要建一個索引。

 2)誤認為索引會消耗空間、嚴重拖慢更新和新增速度。

 3)誤認為唯一索引一律需要在應用層通過“先查後插”方式解決。

(三) SQL規約

1. 【強制】不要使用count(列名)或count(常量)來替代count(*),count(*)就是SQL92定義的標準統計行數的語法,跟資料庫無關,跟NULL和非NULL無關。說明:count(*)會統計值為NULL的行,而count(列名)不會統計此列為NULL值的行。

2. 【強制】count(distinctcol) 計算該列除NULL之外的不重複數量。注意 count(distinct col1, col2) 如果其中一列全為NULL,那麼即使另一列有不同的值,也返回為0。

3. 【強制】當某一列的值全是NULL時,count(col)的返回結果為0,但sum(col)的返回結果為NULL,因此使用sum()時需注意NPE問題。 正例:可以使用如下方式來避免sum的NPE問題:SELECTIF(ISNULL(SUM(g)),0,SUM(g)) FROM table;

4. 【強制】使用ISNULL()來判斷是否為NULL值。注意:NULL與任何值的直接比較都為NULL。 說明: 1)NULL<>NULL的返回結果是NULL,而不是false。 2) NULL=NULL的返回結果是NULL,而不是true。 3) NULL<>1的返回結果是NULL,而不是true。

5. 【強制】 在程式碼中寫分頁查詢邏輯時,若count為0應直接返回,避免執行後面的分頁語句。

6. 【強制】不得使用外來鍵與級聯,一切外來鍵概念必須在應用層解決。 說明:(概念解釋)學生表中的student_id是主鍵,那麼成績表中的student_id則為外來鍵。如果更新學生表中的student_id,同時觸發成績表中的student_id更新,則為級聯更新。外來鍵與級聯更新適用於單機低併發,不適合分散式、高併發叢集;級聯更新是強阻塞,存在資料庫更新風暴的風險;外來鍵影響資料庫的插入速度。

7. 【強制】禁止使用儲存過程,儲存過程難以除錯和擴充套件,更沒有移植性。

8. 【強制】資料訂正時,刪除和修改記錄時,要先select,避免出現誤刪除,確認無誤才能執行更新語句。

9. 【推薦】in操作能避免則避免,若實在避免不了,需要仔細評估in後邊的集合元素數量,控制在1000個之內。

10. 【參考】如果有全球化需要,所有的字元儲存與表示,均以utf-8編碼,那麼字元計數方法注意:說明: SELECT LENGTH("輕鬆工作");返回為12 SELECT CHARACTER_LENGTH("輕鬆工作"); 返回為4 如果要使用表情,那麼使用utfmb4來進行儲存,注意它與utf-8編碼的區別。

11. 【參考】 TRUNCATETABLE 比 DELETE 速度快,且使用的系統和事務日誌資源少,但TRUNCATE無事務且不觸發trigger,有可能造成事故,故不建議在開發程式碼中使用此語句。說明:TRUNCATE TABLE 在功能上與不帶 WHERE 子句的 DELETE 語句相同。

5、效能

1.【參考】判斷和賦值,儘量寫入迴圈體外面。

2.【參考】如果在資料庫中查詢某記錄,儘量用sql精確定位,再取資料,而讓sql返回所有資料,再進行遍歷定位。

3.【參考】其他參考方向

         執行效能

         記憶體資源使用率

         io效能(連線池mysql,memcache,redis等,或頻繁請求遠端http介面)

         靜態化(圖片資源,html資源)

相關推薦

開發規範-PHP

1、編碼規範 1.【強制】程式碼中的命名不允許中英文混合命名,純拼音的命名也要儘量避免。 2.【強制】類名使用駝峰式命名,UpperCamelCase風格。(一些通用的大寫風格可以例外,但要易於閱讀,比如PHPExcel類)。 Yii生成的Model都要統一帶上Mo

PHP開發規範,PSR-12開發規範

規範為PSR-12 首先請閱讀以下連結內容: https://www.php-fig.org/psr/ 工欲善其事必先利其器: 用工具來解決編碼問題,協助大家更好的理解及按規範進行書寫 MAC下可以用的工具: php-code-sniffer、phpstorm 安

騰訊PHP開發規範v1.0

1引言 1.1定義及縮略語 縮略詞 說明 海豹平臺 運維中心提供的研發平臺,提供框架、公共基礎元件、公共業務元件加速業務的日常研發工作 1.2參考文件 海豹平臺WIKI:http://wiki.seals.webdev.com/ 1.3目的 本規範由程式設計原則組成,融合並提煉了開發人員長時

php開發規範

一,php程式 1.程式碼第一段一定要先設定錯誤報告等級    error_reporting(8);// 個人建議為7  2.陣列 申明$row[key] = 'value'; // 不推薦 $row = array(); // 變數一定絕對必須要先宣告! $row['k

PHP開發規範】老生常談的編碼開發規範你懂多少?

還在 規範標準 img info 變量 foo ava str clas 【PHP開發規範】老生常談的編碼開發規範你懂多少? 這幾天看了一下阿裏技術發布的一套Java開發規範《阿裏巴巴Java開發手冊》,裏面寫了阿裏內部的Java開發規範標準,寫的很好。這套J

PHP 的一些開發規範

長篇慎入 分以下幾點說明 一些編碼的經驗 PSR-1 PSR-2 PSR-3 PSR-4 一些編碼的經驗 變數命名 不用拼音 駝峰或下劃線風格要一致 單詞要有意義 不用關鍵字 常量全大寫用下劃線連線 程式碼註釋 儘量讓程式碼可讀性提高,減少程式碼上的註釋 函式頭部可以描述引數和返回值及功能的註釋

shell開發規範

及其 維護 每次 出現 put 實現 style 轉載 解釋器 版本1.0版,參考網上的一些文章規整而來。後期打算繼續修改。完成一篇適合自己的shell開發規範。 最新編輯時間:2017.6.25 一、 命名規範 1、 版本和運行參數 1) 腳本開始之前以註釋形式說

前端開發規範

.html 操作 comm pda 前端 ref 移動端 docs action 前端開發規範 github - fork & Pull Request style git commit - comment 必須有意義,不允許單純的 ‘update‘ ‘fi

thinkphp開發規範

內存 描述 控制結構 清晰 用戶輸入 開頭 過程 剔除 scrip 1、編寫目的 ????為了更好的提高技術部的工作效率,保證開發的有效性和合理性,並可最大程度的提高程序代碼的可讀性和可重復利用性,指定此規範。開發團隊根據自己的實際情況,可以對本規範進行補充或裁減

Web前端開發規範收集

mod 流量 idt jquery version 目的 文件夾 -i service 在Web開發中,後端跟前端配合非常easy出現故障。這時我們就須要一些規則來約束前端任意的編寫。 CSS編程規範 1. 屬性書寫基本順序 a. 先位置屬

Python__軟件開發規範

name 絕對路徑 添加 .com mage auth core ges alt #Author wangmengzhuimport sysimport osBASE_DIR = os.path.dirname(os.path.dirname(os.path.abspat

Python 軟件開發規範

腳本 技術分享 所有 要求 pytho src 技術 lib 執行 軟件開發規範旨在規範以及整理合理的代碼進行,讓整個程序看起來結構清晰,層次分明,其中沒有嚴格的要求要按那種規範來執行,只要合適清晰即可,這個規範已成為約定熟成的一種規範了 像上邊的soft的程序下邊 1、

值得你學習的 Android 開發規範(上)

web 數字 文件規範 () base lan 都是 3.5 tsp 前言 AS規範 命名規範 資源文件規範 版本統一規範 第三方庫規範 註釋規範 其他的一些規範 1 前言 為了利於項目維護以及規範開發,促進成員之間Code Revi

項目開發規範,數據庫設計規範

好的 變量 static date 規範 fff 識字 eas 表示 1.命名規範 定義這個規範的目的是讓項目中全部的文檔都看起來像一個人寫的,添加可讀性。降低項目組中由於換人而帶來的損失。(這些規範並非一定要絕對遵守,可是一定要讓程序有良好的可讀性) 1.1

laravel開發之-php artisan命令

更改 control 創建 控制器名 clas 數據庫 create ble 遷移 php artisan :所有的命令列表 php artisan make:controller 文件夾名稱/控制器名稱 :創建控制器的命令以及控制器放置的文件夾 php artisan m

前端開發規範手冊:(一)基本原則

name ges rop scrip 有效 object sel 代碼 charset 1、結構、樣式、行為分離 盡量確保文檔和模版只包含HTML結構,樣式都放到樣式表中,行為都放到腳本裏。 2、縮進 統一兩個空格縮進(總之縮進統一即可),不要使用Tab鍵或者Tab

Git 分支模型與開發規範

work 所有 upload git 分支 -a 最新 push wechat let 01、分支模型 master:長期分支,一般用於管理對外發布版本,每個 commit 對一個 tag,也就是一個發布版本 develop:長期分支,一般用於作為日常開發匯總,

002-數據庫命名開發規範

意義 其它 第三範式 統一 name names 訂單 簡寫 數據庫配置 一、概述   設計規範更多的是為了確保數據庫設計的合理性、為了項目最終的協調穩定性,而命名規範則更多的是為了確保設計的正式和統一。公正的講,數據庫中表字段等等以什麽樣的方式命名、取具體什麽名字,並

實際開發--->php時間函數

del ont mce end sta 函數 第一天 tar -m 當前日期(例:2017-10-04):date(‘Y-m-d‘,time()); 當前時間戳:strtotime(date(‘Y-m-d H-i-s‘,time()); 當前年月(例:2017-10):$n

day4-軟件目錄開發規範

命名 linu 結構 conf pytho tps 文檔 官方 docs 一、背景軟件開發是一個系統工程,當然編碼實現是其中尤其重要的一個環節,關乎到功能需求的實現好壞。這個環節中除了編碼這一硬功之外,與之相關的編碼風格這一柔道,雖然沒有直接決定功能的實現與否,但卻在很大程