| |
|
|
| | Необходимо найти в директории файлы, имена которых отсутствуют в текстовом файле и удалить их.
Скрипт отрабатывает полностью, если файлов в директории и записей в текстовом файле где-то около 500 (правда тестируется скрипт на слабой машине Duron 700).
Но реально записей и файлов может быть в 2-3 раза больше.
И вот тут проблема.
Как оптимизировать скрипт, чтобы уменьшить время его выполнения?
Или может разбить его работу на несколько этапов? Как?
function scan_dir_data($dirname)
{
// Текстовый файл с данными
$filebase=file("../base/news/base.dat");
$countnews=count($filebase);
// Открываем директорию
$dir = opendir($dirname);
// Читаем в цикле директорию
while (false !== ($file = readdir($dir)))
{
$yesfile=0;
// Если файл обрабатываем его содержимое
if($file != "." && $file != ".." && $file != ".htaccess" && $file != "index.php")
{
$filename = str_replace(".dat", "", $file);
for ($ii=0;$ii<$countnews; $ii++)
{
list($Date,$Random,$Author,$Authormail,$Authorid,$Tem,$Msg,$Fn,$X,$Y,$Fn2)=explode("::",$filebase[$ii]);
// Имя файла в переменной $Random
if(!($Random === $filename))
{
$yesfile++;
}
}
}
if($yesfile==$countnews)
{
@unlink($dirname."/".$file);
}
}
// Закрываем директорию
closedir($dir);
}
|
| |
| |
|
|
| |
|
|
| |
для: kovik
(19.05.2008 в 01:38)
| | | Проблему решил следующим образом (прошу сильно не ругать, если криво, я пишу скрипты в ввиде хобби).
По моему мнению, одна из самых длительных была функция разбора тестового файла на переменные. В первом варианте скрипта разборка производилась при чтении каждого файла из директории снова. Я решил произвести разборку файла только один раз в начале скрипта и так как мне нужна только одна переменная, то выделить ее в отдельный массив $massiv. А далее при чтении каждого нового файла его имя сравнивается только с вновь образованным массивом.
Скрипт по сравнению со старым стал практически летать.
function scan_dir_data($dirname)
{
$filebase=file("../base/news/base.dat");
$countnews=count($filebase);
// Формируем новый массив
$massiv=array();
for ($ii=0;$ii<$countnews; $ii++)
{
list($Date,$Random,$Author,$Authormail,$Authorid,$Tem,$Msg,$Fn,$X,$Y,$Fn2)=explode("::",$filebase[$ii]);
array_push($massiv,$Random);
}
// Открываем текущую директорию
$dir = opendir($dirname);
// Читаем в цикле директорию
while (false !== ($file = readdir($dir)))
{
$yesfile=0;
// Если файл обрабатываем его содержимое
if($file != "." && $file != ".." && $file != ".htaccess" && $file != "index.php")
{
$filename = str_replace(".dat", "", $file);
foreach($massiv as $val)
{
if(!(trim($val) === $filename))
{
$yesfile++;
}
}
}
if($yesfile==$countnews)
{
@unlink($dirname."/".$file);
}
}
// Закрываем директорию
closedir($dir);
}
|
| |
| |
|
|