摘要:背后性能影響還是挺大的。缺失的異常剛開始寫代碼的時候一直不明白為什么要用異常,感覺就能搞定了,為什么還要多此一舉,現在反而覺得的異常太少。在的時候,如果出現異常,可以通過來獲取。
作為一名深度 phper,我如果要黑咱們 php,就像說自己母校差一樣,大家不要見外。故事的開始
個人博客地址:https://mengkang.net/1368.html
這幾天觀察錯誤日志發現有一個數據反序列化的notice錯誤,實際情況我是從緩存中讀取數據然后反序列化,因為反序列化失敗,所以實際每次都是去數據庫取的值。背后性能影響還是挺大的。
缺失的異常剛開始寫代碼的時候一直不明白為什么要用異常,感覺if else就能搞定了,為什么還要多此一舉,現在反而覺得 php 的異常太少。
對比兩種序列化場景,一個是json,另一個是serialize。
json在json encode/decode的時候,如果出現異常,可以通過json_last_error()來獲取。
https://www.php.net/manual/en...
這樣的設計只能說勉強夠用,不太符合面向對象的套路。
serialize/unserialize在使用自帶的序列化和反序列化的時候,相比json的處理,則更加簡單粗暴,沒有函數能拿到最后的錯誤,只會通過自定義的error handler來接管,然后自己去做出一些相應的處理。
為什么要捕獲異常比如我的代碼比較亂,有的 key 是 json 序列化,有的 key 是 serialize。我們可以將 key 分類。不能確保其他人配置的對應關系是對的,或者有的人忘記了,所以我需要用捕獲異常的方式來兜底,這樣我們的代碼更加健壯一些。當unserialize失敗之后,我們可以嘗試去json_decode,而不是立即返回一個false,從而把請求傳遞到數據庫。
代碼演示error_reporting(E_ALL); $a = ["a" => 1]; class UnSerializeException extends ErrorException { } set_error_handler(function ($severity, $message, $file, $line) { $info = explode(":", $message); if ($severity == E_NOTICE) { if ($info[0] == "unserialize()") { throw new UnSerializeException($message); } return true; } else { throw new ErrorException($message, 0, $severity, $file, $line);; } }); try { $b = unserialize(json_encode($a)); } catch (ErrorException $exception) { var_dump(get_class($exception), $exception->getMessage(), $exception->getTraceAsString()); // 捕獲到了 } finally { restore_error_handler(); } try { $b = unserialize(json_encode($a)); } catch (ErrorException $exception) { var_dump(get_class($exception), $exception->getMessage(), $exception->getTraceAsString()); // 無法捕獲 }
輸出結果
string(20) "UnSerializeException" string(43) "unserialize(): Error at offset 0 of 7 bytes" string(181) "#0 [internal function]: {closure}(8, "unserialize(): ...", "/Users/mengkang...", 34, Array) #1 /Users/mengkang/PhpstormProjects/xxx/test.php(34): unserialize("{"a":1}") #2 {main}" Notice: unserialize(): Error at offset 0 of 7 bytes in /Users/mengkang/PhpstormProjects/xxx/test.php on line 42后記
所以 php 代碼的異常設計還是任重而道遠的,而這些已經設定的“舊的規范”要推翻,需要“勇氣”,畢竟會影響所有的使用者。
很多群里老是有語言之爭的聊天,我一般都看看罷了,也不參與。類似的例子,不勝枚舉,后面我會持續輸出一些 php 自黑的博客,希望 php 代碼更加健壯、安全。也希望大家不要只看到 php 干活快,快的背后隱藏著無數的潛在風險,php 雖好,但是也不能貪杯哦。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/31739.html
摘要:第一條是關于深度學習的晚宴,討論的是背后的數學支撐,以及未來的方向。大數據與深度學習是一種蠻力盡管當場說了很多觀點,但是最核心的還是援引了愛因斯坦關于上帝的隱喻。不過,我自己并不同意深度學習必須等同于機器蠻力。 Vladimir Vapnik 介紹:Vladimir Vapnik 被稱為統計學習理論之父,他出生于俄羅斯,1990 年底移居美國,在美國貝爾實驗室一直工作到 2002 年,之后加...
摘要:進一步說,如果承認深度學習系統在解決問題時不可思議的表現,那么大數據和深度學習,都有某種蠻力的味道。不過,我自己并不同意深度學習必須等同于機器蠻力。 Facebook去年底挖來了一個機器學習大神Vladimir Vapnik,他是統計學習理論和支持向量機的主要發明者。Vladimir Vapnik被稱為統計學習理論之父,他出生于俄羅斯,1990年底移居美國,在美國貝爾實驗室一直工作到2002...
摘要:大數據與深度學習是一種蠻力盡管當場說了很多觀點,但是最核心的還是援引了愛因斯坦關于上帝的隱喻。大數據與深度學習是一種蠻力在算法和模型上,我們是否能發明所有東西認為,在機器學習的算法和模型上,我們并不能發明所有東西。 Facebook去年底挖來了一個機器學習大神Vladimir Vapnik,他是統計學習理論和支持向量機的主要發明者。Vladimir Vapnik被稱為統計學習理論之父,他出生...
摘要:開放生態計劃,回饋社會阿里巴巴全球運行指揮中心掌門人沈乘黃首先分享了智能運維在阿里巴巴線上故障管理領域的應用經驗。 摘要: 為響應馬老師家國情懷,世界擔當的號召,開放AI+生態計劃,將讓集團內部服務過程中積累下的技術與經驗更好地回饋社會,任何企業或合作伙伴均可以簡單方便的接入阿里巴巴智能故障管理平臺,通過對接入數據的訓練學習實時提供異常檢測、關聯分析、根因定位的能力,使原有的IT管理模...
閱讀 2576·2021-11-23 09:51
閱讀 3124·2019-08-30 15:54
閱讀 1077·2019-08-30 14:14
閱讀 3549·2019-08-30 13:59
閱讀 1406·2019-08-29 17:09
閱讀 1470·2019-08-29 16:24
閱讀 2852·2019-08-29 15:43
閱讀 916·2019-08-29 12:45