php中的readdir()似乎无法正常工作

时间:2014-02-04 05:19:27

标签: php http archlinux

我正在处理以下代码:

<?php
$dir=opendir("docs/recipes");
$files=array();
while (($file=readdir($dir)) !== false)
{
    if ($file != "." and $file != ".." and $file != "index.php")
    {
        array_push($files, $file);
    }
}

closedir($dir);
sort($files,SORT_STRING | SORT_FLAG_CASE);
print "<div class=\"blocktext\">";
foreach ($files as $file)
print "<A href=\"docs/recipes/$file\">$file</a><br>";

print "</div>";
?>

我在我的raspberry pi网络服务器上工作了,但是我把我的服务器移到了arch linux,它似乎没有用。当我加载页面时,它会旋转,但文件列表为空。

我已经检查过httpd与systemd一起运行,因为我的网页加载了。我知道php正在运行,因为我的phpinfo测试页面有效。

在包含此文件的文件夹中,我有一个名为docs的符号链接,我知道路径是正确的。我将目标中的所有文件都可读。这个文件是可执行的。

我还缺少其他什么吗?

2 个答案:

答案 0 :(得分:0)

不一定是解决方案,但有些帮助可以通过良好做法以及找到脚本上发生的事情的方法

<?php
    // initialize variables first
    $dir = false;
    $files = array();

    // assign the handler
    $dir = opendir( "docs/recipes" );

    // work only if necessary
    if ( $dir !== false ) {
        while ( ( $file = readdir( $dir ) ) !== false )     {
            if ($file != "." and $file != ".." and $file != "index.php") {
                array_push($files, $file);
            }
        }
        closedir( $dir );
        sort( $files,SORT_STRING | SORT_FLAG_CASE );
        print "<div class=\"blocktext\">";
        foreach ( $files as $file ) {
            print "<A href=\"docs/recipes/$file\">$file</a><br>";
        }
        print "</div>";
    } else {
        // get informed that something is wrong, print anything that helps you
        echo( 'problems opening' );
        exit( __FILE__.' '.__LINE__ );
    }
?>

答案 1 :(得分:0)

来自php.net/readdir的

出现警告:此函数可能返回布尔值FALSE,但也可能返回非布尔值,其值为FALSE。

您尚未指定使用的是哪个版本的PHP,也未指定在本地安装/编译的PHP版本。这会有所帮助。我的猜测是你没有打开所有错误,而readdir正在抓住其中一个角落案例。

试试这个:

  $cycle = true;
  while ( $cycle !== false ) {
    $file = readdir( $dir );
     print ( "GOT a FILe or a FALSE:". $file ."br>" );
    // do your stuff here
    $cycle = $file;
  } 

然后在php.ini中将错误设置为E_ALL。如果使用PHP&gt; = 5.4(我猜你是,因为你正在使用arch :)你可以启动内置服务器,所以所有错误/日志/消息都直接发送到STDERR。只需从index.php所在的文件夹中执行命令:

 $ php -S <local ip>:<some port>  

在浏览器中像往常一样打开(或卷曲,或其他)。输出转到浏览器,错误直接进入控制台,没有中间人来掩盖任何消息。

这应该可以让你抓住真正的问题。和/或,你可以把它全部包装在try-catch中,看看是否弹出了什么东西。