php cli include_once error - PullRequest
       6

php cli include_once error

2 голосов
/ 20 декабря 2011

Я пишу скрипт php cli, и мои включения и запросы приводят к ошибкам.

"Предупреждение PHP: include_once (ПАПКА СКРИПТА): не удалось открыть поток: Несоответствующий ioctl для устройства в ПУТИ СКИПТА на линии XX "

Я устанавливаю рабочий каталог в местоположение скрипта, используя

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 представителей)

При сравнении возвращаемых значений из include правильнее всего сделать

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

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

Ответы [ 4 ]

2 голосов
/ 20 декабря 2011

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

Примечание. В этом примере я использую замыкание. Если вы работаете с

1 голос
/ 20 декабря 2011

измените владельца файла на тот, который вы включаете

0 голосов
/ 21 декабря 2011

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

$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;
  }
}
0 голосов
/ 20 декабря 2011

В вашем операторе if вам нужно поставить () после вашей функции include_once. Нравится:

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