PHP奇怪的行为。在服务器和本地主机上的结果不同

PHP奇怪的行为。在服务器和本地主机上的结果不同,php,Php,我在使用php时遇到了奇怪的问题。我有一个检查文件夹中文章的脚本(和检查文件夹中图像的非常类似的脚本),并基于该脚本创建文章菜单(或图库) 在我的本地主机上,这工作正常,可以找到所有文件并按预期处理它们。 但在真正的服务器上,两个脚本在几个文件之后意外中断 图像检查脚本是这样的吗 function GalleryList() { echo ' <div class="GalleryGrid"> <ul>'; error_reporting(

我在使用php时遇到了奇怪的问题。我有一个检查文件夹中文章的脚本(和检查文件夹中图像的非常类似的脚本),并基于该脚本创建文章菜单(或图库)

在我的本地主机上,这工作正常,可以找到所有文件并按预期处理它们。 但在真正的服务器上,两个脚本在几个文件之后意外中断

图像检查脚本是这样的吗

function GalleryList() {
echo '
    <div class="GalleryGrid">
      <ul>';
      error_reporting(E_ALL);

      $thumbs = array_diff(scandir('images/Thumbs'),array ('..','.','Thumbs.db'));
      foreach ($thumbs as $key => $current) {
      $imagelist[filectime('images/Thumbs/'.$current)] = $current;
      }
      krsort($imagelist);


      foreach ($imagelist as $key => $thumb) {
        $fullImage = substr($thumb,6);


       echo '<li><a href="images/'.$fullImage.'"><img src="images/Thumbs/'.$thumb.'"> </a> </li>'.PHP_EOL;

      }
      echo '</ul>';




}
函数GalleryList(){
回声'
    ”; 错误报告(E_全部); $thumbs=array_diff(scandir('images/thumbs')、array('..'、'thumbs.db'); foreach($key=>$current的拇指){ $imagelist[filectime('images/Thumbs/'。$current)]=$current; } krsort($imagelist); foreach($key=>$thumb的图像列表){ $fullImage=substr($thumb,6); echo'
  • '.PHP\u EOL; } 回声“
”; }
文章检查几乎是相同的脚本,只是不同的文件夹和不同的输出HTML。权限没有差别。
不用说,我没有收到任何错误。

如果不知道当您说它“中断”时实际发生了什么,我猜您遇到了文件权限问题。也许Apache是以您的用户名运行的,或者在您的本地主机上具有广泛的权限,而在您的服务器上,它的限制更大

如果更改此选项,会发生什么情况:

echo '<li><a href="images/'.$fullImage.'"><img src="images/Thumbs/'.$thumb.'"> </a> </li>'.PHP_EOL;
echo'
  • '.PHP\u EOL;
    为此(代码特意超级简化):

    $fullImagePath=“images/$fullImage”;
    $fullThumbPath=“images/Thumbs/$thumb”;
    如果(是否可读($fullImagePath)){
    echo“
  • $fullImagePath可读”
  • ; }否则{ echo“
  • $fullImagePath不可读”; } if(是否可读($fullThumbPath)){ echo“
  • $fullThumbPath可读”
  • ; }否则{ echo“
  • $fullThumbPath不可读”; }

  • 现在,您至少可以知道是否存在文件可读性问题。

    您一定会遇到错误。你能访问服务器上的目录吗?它们是否包含文章和图像?启用错误报告
    错误报告(~0)并告诉我们错误。什么PHP版本?另外,当你说它“意外中断”时,是崩溃还是刚刚退出循环?您是否尝试过对数组执行
    打印\u r()
    ,以证明它符合您的预期?您说没有错误,但您确定正在记录或显示它们吗?错误报告本身不会显示任何错误如果显示错误为false当我打印数组时,它只返回正确使用的文件。php版本是5.4.6。试着调试它,输出scandir('images/Thumbs'),看看它是否包含您想要的内容,并检查您是否在您认为您所在的文件夹中。运行此脚本(谢谢您,顺便说一句,我不会想到这一点)告诉我,正常工作的文件是可读的。没有其他文件。我的意思是,我没有“不可读”输出。但它们都具有相同的权限设置。古怪。那么,当它破裂时到底会发生什么呢?执行停止了,你会看到5个左右的缩略图吗?脚本的其余部分是否执行?页面是否呈现?页面上是否有关闭HTML之类的内容?当它中断时,它会退出循环。它看起来甚至不像是一个实际错误,只是没有获取数组中的所有文件。我是否会错误地排除它们?页面的其余部分通常呈现为关闭HTML和所有内容。filectime()是否有问题?这是否会失败,因为文件可能具有相同的创建时间戳,因为我一次上载了所有文件?您可以(并且应该)删除
    filectime
    ,以进行测试。filectime返回文件上次更改的时间,或者失败时返回FALSE-因此,如果文件未更改,则可能不会将其添加到数组中。
    $fullImagePath = "images/$fullImage";
    $fullThumbPath = "images/Thumbs/$thumb";
    
    if (is_readable($fullImagePath)) {
        echo "<li>$fullImagePath is readable</li>".PHP_EOL;
    } else {
        echo "<li>$fullImagePath is not readable</li>".PHP_EOL;
    }
    
    if (is_readable($fullThumbPath)) {
        echo "<li>$fullThumbPath is readable</li>".PHP_EOL;
    } else {
        echo "<li>$fullThumbPath is not readable</li>".PHP_EOL;
    }