我正在编写一个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)
以错误的方式执行此操作将评估为包含''
,从而导致我的错误。
答案 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;
}
}