2010-02-10 103 views
1

下面的代碼片怎麼可能打印出「不可讀的」? afaik a die()應該立即停止一切嗎?php 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); 
    } 
+0

我不認爲問題在於代碼的和平......你能提供一個更大的切片嗎? – anthares 2010-02-10 16:32:39

+4

您是否嘗試將其他項目更改爲「確定」?以防萬一還有另一個'ok'在某處迴響? – 2010-02-10 16:35:13

回答

7

我要去上肢體,並說:

這是不可能的。

除非:你echodie()之前荷蘭國際集團「OK」別的地方或者是在析構函數/關機功能。

從手動on exit()這是作爲die()相同:

終止腳本的執行。即使調用了exit(),關閉函數和對象析構函數也會一直執行。

但是發佈的代碼本身不會導致輸出'okok'。

要解決

  • 更改呼應線更多的東西可追溯。包括文件名(__file__)和行號(__line__)只是爲了確保它確實是執行相同的行。
  • 添加一個調試器(如xdebug)給你一個堆棧跟蹤。函數被調用兩次(通過析構函數或關閉鉤子)?
+0

完全同意......但這仍然發生:( – stef 2010-02-10 17:10:17

+0

@ stef:那麼也許你應該在構造函數的調用周圍發佈代碼?向我們展示如何/在哪裏實例化這個類,並且我們可能會看到問題 – Narcissus 2010-02-10 17:13:51

+0

已添加一些故障排除思路 – 2010-02-10 18:03:03

3

die()觸發關閉掛鉤的執行,所以第二個調用可能是屬於shotdown掛鉤的代碼路徑的一部分。

1

一個答案可能是您的腳本中有一些內容導致違規代碼運行兩次(即未終止的http重定向,或者您的類正在實例化兩次)。

從你的類實例化的點(或點)追溯並尋找可能的重複。或者,設置一個單元測試/腳本,除了用最少量的測試所需的數據來實例化類之外,別的什麼都不做。