PHP glob():中至少有一个传递的标志无效或在此平台上不受支持



我有这样的代码来显示目录中的.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

最新更新