我有这样的代码来显示目录中的.log
文件名和扩展名:
error_2014-11-06.log
代码:
$files = glob("../cache/logs/*.log", 1);
foreach ($files as $filename){
?>
<div><?PHP echo $filename;?></div>
<?PHP } ?>
现在我看到这个错误:
[E_WARNING] [2] glob(): At least one of the passed flags is invalid or not supported on this platform in
$files = glob("../cache/logs/*.log", 1);
-------------------------------------^
这不是一个有效的标志。可用的有效标志在这里
可用标志:
- GLOB_MARK-为返回的每个目录添加一个斜线
- GLOB_NOSORT-返回出现在目录中的文件(否排序)。如果不使用此标志,则对路径名进行排序按字母顺序
- GLOB_NOCHECK-如果找不到匹配的文件,则返回搜索模式
- GLOB_NOESCAPE-反斜杠不引用元字符
- GLOB_BRACE-展开{a、b、c}以匹配"a"、"b"或"c"
- GLOB_ONLYDIR-仅返回与模式匹配的目录条目
- GLOB_ERR-读取错误(如不可读目录)时停止,由默认错误将被忽略
要使用它们中的任何一个,只需执行
glob("path", GLOB_MARK); // example
数字1
对应于在PHP 5.1.0中添加的GLOB_ERR
(请参阅Changelog部分)。如果出现此错误,说明您使用的是过时版本的PHP。
请考虑升级到不是"生命终结"的版本
请注意,如果您首先使用常量,也会出现此错误。PHP并不关心您使用的是标志名称还是值。正如您从OPCodes中看到的,PHP无论如何都会将值发送到glob:
Code: glob('foo', GLOB_ERR);
Finding entry points
Branch analysis from position: 0
Jump found. Position 1 = -2
filename: /in/n0vqf
function name: (null)
number of ops: 4
compiled vars: none
line #* E I O op fetch ext return operands
---------------------------------------------------------------------------------
3 0 E > SEND_VAL 'foo'
1 SEND_VAL 1
2 DO_FCALL 2 'glob'
3 > RETURN 1
之所以要使用常数,是因为它比幻数更可读。此外,在值由于某种技术原因发生变化的情况下,依赖常数更稳定。
您可以使用此代码来获取GLOB_*
常量的值:
foreach (get_defined_constants() as $k => $v) {
if (strpos($k, "GLOB") === 0) {
echo "$k => $v", PHP_EOL;
}
}
输出(PHP 5.6.5):
GLOB_BRACE => 1024
GLOB_MARK => 2
GLOB_NOSORT => 4
GLOB_NOCHECK => 16
GLOB_NOESCAPE => 64
GLOB_ERR => 1
GLOB_ONLYDIR => 8192
GLOB_AVAILABLE_FLAGS => 9303
如需进一步参考,请参阅中glob
的实现
- http://lxr.php.net/xref/PHP_MASTER/ext/standard/dir.c#430
第二个参数(,1)应该是下面列表中的常量,但您可能根本不需要
GLOB_MARK, GLOB_NOSORT, GLOB_NOCHECK, GLOB_NOESCAPE, GLOB_BRACE, GLOB_ONLYDIR, GLOB_ERR.
http://php.net/manual/en/function.glob.php