php die()运行两次?

时间:2010-02-10 16:30:34

标签: php zend-framework

下面的代码段如何打印出“可读性不可读”? afaik a die()应该立即停止一切吗?

编辑:发布了完整的功能。这是Zend_Search_Lucene_Storage_File_Filesystem的函数。我们总是得到“文件不可读”的错误。该文件看起来似乎是可读的,但下面的代码段打印出“可读性不可读”

编辑2:对不起,我发布的信息有些错误;一切都正确了。

public function __construct($filename, $mode='r+b')
    {
        global $php_errormsg;

        if(strpos($mode, 'w') === false) {
            die('not readable');
        }
        else die('readable');

        if (strpos($mode, 'w') === false  &&  !is_readable($filename)) {
            // opening for reading non-readable file
            require_once 'Zend/Search/Lucene/Exception.php';
            throw new Zend_Search_Lucene_Exception('File \'' . $filename . '\' is not readable.');
        }

        $trackErrors = ini_get('track_errors');
        ini_set('track_errors', '1');

        $this->_fileHandle = @fopen($filename, $mode);

        if ($this->_fileHandle === false) {
            ini_set('track_errors', $trackErrors);
            require_once 'Zend/Search/Lucene/Exception.php';
            throw new Zend_Search_Lucene_Exception($php_errormsg);
        }

        ini_set('track_errors', $trackErrors);
    }

3 个答案:

答案 0 :(得分:7)

我要站出来说:

这是不可能的。

除非:你在echo之前或者在析构函数/关闭函数中die()'确定'其他地方。

来自与die()相同的手册on exit()

  

终止脚本的执行。即使调用exit(),也将始终执行关闭函数和对象析构函数。

但是发布的代码本身不会产生'okok'的输出。

进行问题排查

  • 将回显的线条更改为更具可追溯性的线条。包括文件名(__file__)和行号(__line__)只是为了确保它确实与正在执行的行相同。
  • 添加调试器(类似xdebug)以提供堆栈跟踪。该函数是否以某种方式被调用两次(通过析构函数或关闭钩子)?

答案 1 :(得分:3)

die()触发执行关闭挂钩,因此第二次调用可能是属于击倒钩子的代码路径的一部分。

答案 2 :(得分:1)

答案可能是您的脚本中有一些内容导致违规代码运行两次(即未终止的http重定向,或者您的类被实例化两次)。

从实例化类的点(或点)追溯并查找可能的重复。或者,设置一个单元测试/脚本,除了测试所需的最小数据量之外,它只会实例化一次类。