2011-12-20 98 views
2

我正在寫一個php cli腳本,並且我的包含並要求生成錯誤。php cli include_once錯誤

「PHP的警告:include_once(腳本文件夾):未能打開流:在上線XX素文字PATH 不適當IOCTL用於設備」

IM的工作目錄設置爲腳本的位置使用

chdir(dirname(__FILE__)); 

並寫一個包裝函數包含文件本身(只是代碼片段):

$this->_path = rtrim(realpath('./'), '/').'/';  
public function require_file($file) 
{ 
    if (include_once $this->_path.$file === FALSE) 
    $this->fatal_error('Missing config file (config.php)'); 
} 

我在做什麼錯,或失蹤?


:(不能回答我的問題少於100 REP)

比較返回值時,從包括做正確的事情是

if ((include 'file') === FALSE) 

做的錯誤的時尚將評估包括'',導致我的錯誤。

+0

'$ this - > _ path。$ file'的值是什麼?你記錄了檢查它嗎? – 2011-12-20 19:04:04

+0

變量的賦值在代碼片段中。 。 。 – 2011-12-20 19:06:20

+0

我們如何知道你傳遞給'$ file'的文件名?該文件是否存在?它是否可讀? ...? – 2011-12-20 19:11:28

回答

2

那麼,include_once是一個特殊的語言結構,而不是一個函數。因此,您不應該嘗試使用它的返回值(如=== FALSE)。 PHP manual entry on the topic表示「如果include()構造找不到文件」「,則include()構造將發出警告,檢查=== FALSE對您的情況沒有幫助。

我的建議是使用自定義錯誤處理程序,當PHP錯誤引發時拋出異常。然後,您可以將您的include_once包裝在try/catch塊中,以處理由無效包含引起的異常,無論您喜歡。

因此,舉例來說...

function require_file($file) 
{ 
    set_error_handler(function($errno, $errstr) { throw new Exception($errstr); }); 
    try { 
    include_once $file; 
    restore_error_handler(); 
    echo 'woot!'; 
    } catch (Exception $e) { 
    echo 'doh!'; 
    } 
} 
$file = 'invalid_filename.php'; 
require_file($file); // outputs: doh! 

注:我使用的是封閉在這個例子中。如果你使用的是PHP5.3的<,那麼你需要爲錯誤處理程序使用一個實際的函數。

+0

實際上如果include_once找不到文件FALSE是返回並且發出E_WARNING。 – 2011-12-20 19:14:27

+0

我的觀點是,返回FALSE並沒有什麼區別,E_WARNING仍然會生成。 – rdlowrey 2011-12-20 19:17:41

+0

我喜歡你的答案,除了我寧願錯誤拋出回試圖包含文件的範圍。有一天,php會擺脫這種可怕的程序錯誤處理。 – 2011-12-20 19:25:42

1

改變文件的所有權以符合您所包括

+0

我讓這兩個文件都是VIM,而我是他們兩個的所有者。 – 2011-12-20 19:00:32

+0

爲我工作,謝謝:) – jsims281 2013-02-22 14:02:54

0

一個在你的if語句,你需要把你的()功能include_once後。像:

if (include_once($this->_path.$file) === FALSE){ etc.} 
+0

沒有改變任何東西 – 2011-12-20 19:06:42

+0

好吧,我不知道你是否可以用下劃線開始你的變量名。也許嘗試回顯你的路徑變量顯示它重定向到的地方。 – Spikey21 2011-12-20 19:09:04

+0

include_once是一種語言結構,而不是函數,因此您提供的代碼評估爲不起作用,被評估爲include(($ this - > _ path。$ file)=='OK'),即include('')。 – 2011-12-20 19:16:09

0

解決問題的另一種方法是在包裝中測試要包含的文件的可讀性。

$this->_path = rtrim(realpath('./'), '/').'/'; 

public function require_file($file) 
{ 
    $pathFile = $this->_path . $file; 
    if (! is_readable($pathFile)) { 
    $this->fatal_error('Missing file (' . $file . ')'); 
    } else { 
    include_once $pathFile; 
    } 
}