PBOOTCMS在运行时间久了之后,有可能会造成服务器卡顿。
通过慢日志发现,是file.php中的path_delete() 函数会导致的。
可以使用以下改进过的代码,使用中。
/**
* 删除目录及目录下所有文件或删除指定文件
*
* @param string $path 待删除目录路径
* @param bool $delDir 是否删除目录,true 删除目录,false 仅清空目录
* @param array $exFile 排除的文件/目录名
* @return bool 是否成功
*/
function path_delete($path, $delDir = false, $exFile = array())
{
$result = true;
if (!file_exists($path)) {
return true; // 不存在直接返回成功
}
if (is_dir($path)) {
$dirs = scandir($path);
if ($dirs !== false) {
foreach ($dirs as $value) {
if ($value === '.' || $value === '..' || in_array($value, $exFile)) {
continue;
}
$dir = $path . '/' . $value;
// 递归删除子目录或文件
$subResult = is_dir($dir) ? path_delete($dir, $delDir, $exFile) : unlink($dir);
if (!$subResult) {
$result = false;
error_log("Failed to delete: $dir");
}
}
// 删除自身目录
if ($delDir && !rmdir($path)) {
$result = false;
error_log("Failed to remove directory: $path");
}
} else {
$result = false;
error_log("Failed to scan directory: $path");
}
} else {
if (!unlink($path)) {
$result = false;
error_log("Failed to delete file: $path");
}
}
return $result;
}当然,也可以使用非递归实现的目录和文件删除函数,用栈结构避免了深递归调用,适合大量文件和深层目录,性能更稳健且不易卡死。