相信很多php都用过”@”这样一个错误抑制符,用来屏蔽不想看到的错误。
但是治标不治本,错误或告警信息一样是存在的,只不过是屏蔽了不输出而已。
我们通过opcode代码查看神器来探索错误抑制符的实质
关于vld的安装就不多说了,自行下载:https://pecl.php.net/package/vld
测试
首先编写一段代码
1 |
|
./test.log故意不存在的,执行会有如下结果:1
2root@hostname www]# php test.php
PHP Warning: file_get_contents(./test.log): failed to open stream: No such file or directory in /data/www/test.php on line 3
如果加上@, 就没有错误输出了
1 |
|
vld使用
使用vld来查看一下:
1 | php -dvld.active=1 -dvld.execute=0 test.php |
可以看出, 函数执行的前后,多了BEGIN_SILENCE和END_SILENCE两个指令,说明@错误抑制符会导致opcode层面上增加指令,性能会有一定的影响