Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Скрипту не хватает времени для завершения
 
 автор: kovik   (19.05.2008 в 01:38)   письмо автору
 
 

Необходимо найти в директории файлы, имена которых отсутствуют в текстовом файле и удалить их.
Скрипт отрабатывает полностью, если файлов в директории и записей в текстовом файле где-то около 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 в 03:11)   письмо автору
 
   для: 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);
}

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования