php cli include_once错误

时间:2011-12-20 18:53:19

标签: command-line-interface require php

我正在编写一个php cli脚本,我的包含和要求会产生错误。

  

“PHP警告:include_once(SCRIPT FOLDER):无法打开流:   第XX行“SCIPT路径中的设备不适当的ioctl”

我使用

将工作目录设置为脚本的位置
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 个答案:

答案 0 :(得分: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你需要为错误处理程序使用实际函数。

答案 1 :(得分:1)

更改文件的所有权以匹配您所包含的文件

答案 2 :(得分:0)

在if语句中,您需要将()放在include_once函数之后。喜欢:

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

答案 3 :(得分: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;
  }
}