我正在试图让我的头发试图在我的测试服务器上运行这个功能。
这会查看一个非常大的文件目录(嵌套文件夹中约有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}]\"> "; // folder checkboxes will be ignored without a name attribute
$str_result .= "<span class=\"glyphicon {$folderIcon}\" aria-hidden=\"true\"></span> ";
$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}]\"> <span class=\"glyphicon glyphicon-file\" aria-hidden=\"true\"></span> {$name}</li>";
}
}
unset($path);
unset($handle);
}
}
$str_result .= "</ul>";
return $str_result;
}
它似乎只是达到某种内存限制而且一切都停止了,但我的服务器知识并不是那么好所以我真的被卡住了。我确信语法没问题,所以它必须是别的。
答案 0 :(得分:0)
这看起来是某种php / apache缓冲问题。
我还没有设法找到明确的答案,但解决方法是计算页面内容大小并将其添加到标题信息中。