php函数导致页面挂起

时间:2016-01-19 11:51:05

标签: php laravel memory foreach

我正在试图让我的头发试图在我的测试服务器上运行这个功能。

这会查看一个非常大的文件目录(嵌套文件夹中约有4000个文件)并创建一个文件树。

我已经在我的本地计算机上测试了这个脚本和类似的脚本,它工作正常,但我发现在实时服务器上,如果我取消注释注释掉的行,它将导致页面无限期挂起。没有错误输出,我似乎无法找到任何日志。我已经在服务器上最大化了我的php内存并增加了最大输入变量和处理时间等等。

非常感谢任何帮助。

function read_dir_content($parent_dir, $depth = 0, $rememberFiles = [], $tree = [], $first = 'first', $rand = 0){
    $str_result = "<ul class=\"files {$first}\" id=\"collapse{$rand}\">";
    if ($handle = opendir($parent_dir)) 
    {
        $array = [];

        while (false !== ($file = readdir($handle)))
        {
            if(in_array($file, array('.', '..'))) continue; // ignore . and ..
            if(substr($file, 0, 1) == '.') continue; // ignore invisible files
            $array[] = $parent_dir . '/' . $file;

        }
        closedir($handle);

        if (count($array)) {
            // order the array here...
            foreach($array as $path) {
                $relPath = str_replace(Dataroom::basePath() . '/', '', $path);
                $name = basename($path);
                $checked = false;
                if( is_dir($path) ){ // folders
                    $encoded = base64_encode($relPath . '/');
                    $newrand = mt_rand($rand+1, $rand+1000000); // set random number
                    $state = in_array(md5($encoded), $tree) ? 'true' : 'false';
                    $state2 = $state == 'true' ? 'collapse in' : 'collapse';
                    $folderIcon = $state == 'true' ? 'glyphicon-folder-open' : 'glyphicon-folder-close';
                    $checked = old('folders.'.$encoded) || in_array($encoded, $rememberFiles) ? 'checked="checked"' : '';
                    $str_result .= "<li class=\"folder text-primary\">";
                        $str_result .= "<input type=\"checkbox\" {$checked} id=\"{$encoded}\" name=\"files[{$encoded}]\">&nbsp;"; // folder checkboxes will be ignored without a name attribute
                        $str_result .= "<span class=\"glyphicon {$folderIcon}\" aria-hidden=\"true\"></span>&nbsp;";
                        $str_result .= '<a class="collapse'.$newrand.'" onclick="rememberTreeState(\''.$encoded.'\');" aria-expanded="'.$state.'" aria-controls="collapse'.$newrand.'" data-toggle="collapse" href="#collapse'.$newrand.'">'.$name.'<span class="caret"></span></a>'; // link

                        //$str_result .= '<a href="http://test"></a>'; // THIS LINE CAUSES PAGE TO HANG!!!

                        $str_result .= read_dir_content($path, $depth++, $rememberFiles, $tree, $state2, $newrand);
                    $str_result .= "</li>";


                } else { // files
                    $encoded = base64_encode($relPath);
                    if (!empty(old() && old('files'))) {
                        if (old('files.'.$encoded)) {
                            $checked = 'checked="checked"'; // remember input from last errored form submission
                        }
                    } else {
                        if (in_array($encoded, $rememberFiles)) {
                            $checked = 'checked="checked"'; // remember files from group db records
                        }
                    }

                    $str_result .= "<li class=\"file text-muted\"><input type=\"checkbox\" {$checked} name=\"files[{$encoded}]\">&nbsp;<span class=\"glyphicon glyphicon-file\" aria-hidden=\"true\"></span>&nbsp;{$name}</li>";

                }
            }
            unset($path);
            unset($handle);
        }
    }
    $str_result .= "</ul>";

    return $str_result;
}

它似乎只是达到某种内存限制而且一切都停止了,但我的服务器知识并不是那么好所以我真的被卡住了。我确信语法没问题,所以它必须是别的。

1 个答案:

答案 0 :(得分:0)

这看起来是某种php / apache缓冲问题。

我还没有设法找到明确的答案,但解决方法是计算页面内容大小并将其添加到标题信息中。