грешка в php cli include_once

Пиша php cli скрипт и моите включвания и изисквания генерират грешки.

„PHP предупреждение: include_once(SCRIPT FOLDER): неуспешно отваряне на поток: Неподходящ ioctl за устройство в SCIPT PATH на ред 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)

ако го направя по грешен начин, ще се оцени, че включва '', причинявайки моята грешка.


person Eric Pigeon    schedule 20.12.2011    source източник
comment
каква е стойността на $this->_path.$file? записахте ли го, за да го проверите?   -  person    schedule 20.12.2011
comment
присвояването на променливата е в кодовия фрагмент. . .   -  person Eric Pigeon    schedule 20.12.2011
comment
Как можем да знаем кое име на файл предавате на $file? файла съществува ли читава ли е? ...?   -  person    schedule 20.12.2011


Отговори (4)


Е, include_once е специална езикова конструкция, а не функция. Поради това не трябва да се опитвате да използвате върната стойност от него (като === FALSE). PHP ръчният запис по темата казва, че "включването () конструкцията ще издаде предупреждение, ако не може да намери файл" така че проверката на === 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, трябва да използвате действителна функция за обработка на грешки.

person rdlowrey    schedule 20.12.2011
comment
всъщност, ако include_once не може да намери файла FALSE се връща и се издава E_WARNING. - person Eric Pigeon; 20.12.2011
comment
Мисълта ми беше, че няма значение дали получавате обратно FALSE, E_WARNING пак ще бъде генерирано. - person rdlowrey; 20.12.2011
comment
Харесвам отговора ви, освен че предпочитам грешката да бъде върната обратно към обхвата, който се опитваше да включи файла. php ще излезе от това ужасно обработване на процедурни грешки в изключения един ден. - person Eric Pigeon; 20.12.2011
comment
@xxxpigeonxxx Е, в такъв случай все още трябва да използвате персонализиран манипулатор на грешки, но не вътре в тази функция. Когато се излъчва E_WARNING, вашият манипулатор на глобални грешки ще бъде извикан и може да свърши работата по генериране на фаталната грешка. Това напълно премахва необходимостта от вашата функция за обвивка. - person rdlowrey; 20.12.2011

променете собствеността на файла, за да съответства на този, който включвате

person Community    schedule 20.12.2011
comment
Направих и двата файла във VIM и съм собственик и на двата. - person Eric Pigeon; 20.12.2011

В оператора if трябва да поставите () след функцията include_once. Като :

if (include_once($this->_path.$file) === FALSE){ etc.}
person Spikey21    schedule 20.12.2011
comment
добре, не знам дали можете да започнете името на променливата си с долна черта. Може би се опитайте да повторите вашата променлива на пътя в шоуто, към което го пренасочва. - person Spikey21; 20.12.2011
comment
include_once е езикова конструкция, а не функция, поради което кодът, който сте предоставили, няма да работи, оценен като include(($this-›_path.$file) == 'OK'), т.е. include(''). - person Eric Pigeon; 20.12.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;
  }
}
person macjohn    schedule 21.12.2011