作为一个深厚的phper,如果我要hack我们的php,就等于说我的母校不好,所以请不要向外看。个人博客地址:https://mengkang.net/1368.html故事开头这几天观察错误日志,发现有数据反序列化的通知错误。实际情况是我从缓存中读取数据,然后反序列化。因为反序列化失败,实际上每次都是从数据库中取值。背后的性能影响还是挺大的。缺少异常当我刚开始写代码时,我不明白为什么要使用异常。之前觉得如果else就可以搞定,何必呢,但是现在觉得PHP的异常太少了。对比两种序列化场景,一种是json,一种是serialize。json在jsonencode/decode时,如果有异常,可以通过json_last_error()获取。https://www.php.net/manual/en...这样的设计只能说勉强够用,也不符合面向对象的套路。serialize/unserialize在使用自己的序列化和反序列化时,比json处理更简单粗暴。没有获取最终错误的函数,只会由一个自定义的错误处理器接管,然后再做一些相应的处理。为什么我们需要捕获异常?例如,我的代码很乱。有的key是json序列化的,有的key是序列化的。我们可以对键进行分类。我不能确定别人配置的对应关系是正确的,还是有些人忘记了,所以我需要用捕获异常的方式来覆盖底线,让我们的代码更加健壮。当unserialize失败时,我们可以尝试json_decode而不是立即返回false,从而将请求传递给数据库。代码显示error_reporting(E_ALL);$a=["a"=>1];classUnSerializeExceptionextendsErrorException{}set_error_handler(function($severity,$message,$file,$line){$info=explode(":",$message);if($severity==E_NOTICE){if($info[0]=="unserialize()"){thrownewUnSerializeException($message);}returntrue;}else{thrownewErrorException($消息,0,$severity,$file,$line);;}});try{$b=unserialize(json_encode($a));}catch(ErrorException$exception){var_dump(get_class($exception),$异常->getMessage(),$异常->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():Erroratoffset0of7bytes"string(181)"#0[内部函数]:{closure}(8,'unserialize():...','/Users/mengkang...',34,Array)#1/Users/mengkang/PhpstormProjects/xxx/test.php(34):unserialize('{"a":1}')#2{main}"注意:unserialize():/Users/mengkang/PhpstormProjects/xxx/中7个字节的偏移量0处出错test.phponline42后记所以php代码的异常设计还有很长的路要走,而这些已经定下的“旧规范”需要“勇气”去推翻,毕竟会影响到很多群体的所有用户总是有语言纠纷的聊天。我通常只是看着他们,不参与。类似的例子太多了,以后会继续输出一些php自攻的博客,希望php代码更加健壮和安全。也希望大家看到的不仅仅是php运行速度快,其背后还隐藏着无数潜在的风险。php虽好,但不可贪心。也欢迎大家关注我的公众号,不骚扰,只干原创文章
