深入理解PHP之:@错误抑制符的实质

Posted by jintang on 2014-02-21

相信很多php都用过”@”这样一个错误抑制符,用来屏蔽不想看到的错误。

但是治标不治本,错误或告警信息一样是存在的,只不过是屏蔽了不输出而已。

我们通过opcode代码查看神器来探索错误抑制符的实质

关于vld的安装就不多说了,自行下载:https://pecl.php.net/package/vld

测试

首先编写一段代码

1
2
<?php
file_get_contents("./test.log");

./test.log故意不存在的,执行会有如下结果:

1
2
root@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
2
<?php
@file_get_contents("./test.log");

vld使用

使用vld来查看一下:

1
php -dvld.active=1 -dvld.execute=0 test.php

可以看出, 函数执行的前后,多了BEGIN_SILENCE和END_SILENCE两个指令,说明@错误抑制符会导致opcode层面上增加指令,性能会有一定的影响