2011-12-20 2 views
2

Я пишу скрипт php cli, а мои включенные и требующие генерируют ошибки.php cli include_once error

"PHP Warning: include_once (SCRIPT FOLDER): не удалось открыть поток: недопустимом IOCTL для устройства в SCIPT PATH по линии Х-Х"

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 повторений)

Правильная вещь, чтобы сделать при сравнении возвращаемых значений из включают является

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

делать это в неправильный способ оценит включение '', что приведет к моей ошибке.

+0

Что такое значение '$ this -> _ path. $ File'? вы зарегистрировали это, чтобы проверить его? –

+0

назначение varaible находится в фрагменте кода. , , –

+0

Как узнать, какое имя файла вы передаете '$ file'? существует ли файл? это читаемо? ...? –

ответ

2

Ну, include_once специальная языковая конструкция, а не функция. Таким образом, вы не должны пытаться использовать возвращаемое значение из него (например, === FALSE). PHP manual entry on the topic говорит, что «Конструкция 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. –

+0

Мое мнение состояло в том, что не имеет значения, что вы снова получите FALSE, E_WARNING все равно будет сгенерирована. – rdlowrey

+0

Мне нравится ваш ответ, за исключением того, что я предпочел бы, чтобы ошибка была возвращена в область, которая пыталась включить этот файл. php выйдет из этой ужасной процедурной обработки ошибок в исключения в один прекрасный день. –

1

изменение права собственности на файл, чтобы соответствовать одному вы в том числе

+0

Я сделал оба файла im VIM, и я являюсь их владельцем. –

+0

Работал для меня, спасибо :) – jsims281

0

В вашем заявлении, если вам нужно положить () после функции include_once. Как:

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

ничего не менял –

+0

хорошо, я не знаю, можете ли вы начать свое имя переменной с подчеркивания. Может быть, попробуйте повторить вашу переменную path show, куда она перенаправляет ее. – Spikey21

+0

include_once - это языковая конструкция, а не функция, поэтому код, который вы предоставили оценивает, не будет работать, оценивается как include (($ this -> _ path. $ File) == 'OK'), т. Е. Включает (''). –

0

Другой способ решить вашу проблему - проверить готовность файла, который вы хотите включить, в ваш wraper.

$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; 
    } 
} 
Смежные вопросы