Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Оптимизация кода

3.6K
29 октября 2010 года
CrazyTimon
125 / / 13.02.2006
О чем это я. Как - то понадобилось мне закинуть на сервер 3000 изображений, и чтобы на сайте отображались ссылки на эти изображения. Кажется делов - то =). Не тут-то было. Имена файлов(изображений)были представлены в русско-язычной символике. Решение нашлось быстро, нужно перевести имя каждого файла на транслит + добавить в таблицу БД(для удобства). Структура таблицы проста. 4 колонки id( айди спасибо кэп=)), lat_name(оригинальное название файла), trans_name(название файла на транслите), first_char(первая буква от оригинального файла).
1.Собственно вопрос в том, что хотелось бы оптимизировать код. Под оптимизацией понимаю защита скрипта, ну и возможно его уменьшение.
2.Возможно есть другое решение, но я его не знаю, мб подскажите.
Код:
<?php
//----------------------функция превода текста с кириллицы в траскрипт-----------------------
  function encodestring($st)
  {
    /*if($reverse==">")
    {*/

    $st=strtr($st,"абвгдеёзийклмнопрстуфхъыэ_","abvgdeeziyklmnoprstufh'iei");
    $st=strtr($st,"АБВГДЕЁЗИЙКЛМНОПРСТУФХЪЫЭ_","ABVGDEEZIYKLMNOPRSTUFH'IEI");
    $st=strtr($st,
                    array(
                        "ж"=>"zh", "ц"=>"ts", "ч"=>"ch", "ш"=>"sh",
                        "щ"=>"shch","ь"=>"", "ю"=>"yu", "я"=>"ya",
                        "Ж"=>"ZH", "Ц"=>"TS", "Ч"=>"CH", "Ш"=>"SH",
                        "Щ"=>"SHCH","Ь"=>"", "Ю"=>"YU", "Я"=>"YA",
                        "ї"=>"i", "Ї"=>"Yi", "є"=>"ie", "Є"=>"Ye"," "=>"_"
                       )
             );
    return $st;
    /*}
    elseif($reverse=="<")
    {
    $st=strtr($st,"abvgdeeziyklmnoprstufh'iei","абвгдеёзийклмнопрстуфхъыэ_");
    $st=strtr($st,"ABVGDEEZIYKLMNOPRSTUFH'IEI","АБВГДЕЁЗИЙКЛМНОПРСТУФХЪЫЭ_");
    $st=strtr($st,
                    array(
                        "zh"=>"ж", "ts"=>"ц", "ch"=>"ч", "sh"=>"ш",
                        "shch"=>"щ", "yu"=>"ю", "ya"=>"я",
                        "ZH"=>"Ж", "TS"=>"Ц", "CH"=>"Ч", "SH"=>"Ш",
                        "SHCH"=>"Щ", "YU"=>"Ю", "YA"=>"Я",
                       )
             );
    }*/

  }



$dblocation = "localhost";
$dbname = "test";
$dbuser = "root";
$dbpasswd = "";
$dbcnx = @mysql_connect($dblocation,$dbuser,$dbpasswd);
if (!$dbcnx)
{
  echo( "<P>В настоящий момент сервер базы данных не доступен, поэтому
            корректное отображение страницы невозможно.</P>"
);
  exit();
}
if (!@mysql_select_db($dbname, $dbcnx))
{
  echo( "<P>В настоящий момент база данных не доступна, поэтому
            корректное отображение страницы невозможно.</P>"
);
  exit();
}

if($_GET['update']=="1")
{
//-------------------переименовывание  файлов в папке------------------------
$dir = "6";//задаем директорию файлов неугодных буржуям

if (is_dir($dir)) {//если директория существует....
   if ($dh = opendir($dir)) {//если мы её можем открыть...
       while (($file = readdir($dh)) !== false) {//то начинаем считывать все файлы по одному
           if(!($file==".."||$file=="."))//неибу почему но в $file за чем то вносится "."".."
           {
            $original_ba=$file;//оригинальное имя
            $res=rename($dir."/".$file,$dir."/".encodestring($file));//собственно само переименовывание фаила
            echo $res."; ";
            $original_ba_xxx=encodestring($file);//имя на транслите
            $first_letter=substr($file, 0,1);//первая буква слова
            $ar[$file]=$dir."/".$file;//формируем путь для выводимого отчета
            mysql_query("INSERT INTO `nestr_test` (`id` ,`lat_name` ,`trans_name` ,`first_char`)VALUES (NULL ,  '".$original_ba_xxx."',  '".$original_ba."',  '".$first_letter."');");//вставляем
           }
       }
       closedir($dh);//закрываем нах папку
   }
}
asort($ar);//и по челябински сортируем
//---------------------прорисовка на страничке результата-------------------
$dir = "/auto/6";
$i=1;
foreach($ar as $key => $val)
{
    $newvar[$i]=$key;
    $i++;
}
$i=1;
 foreach($ar as $key => $val)
   {
    echo"<a href=".$dir."/".$key.">".$newvar[$i]."</a><br><hr>";
    //$pezda[$i]="<a href=".$dir."/".$key.">".$newvar[$i]."</a><br><hr>";
    $string = strpos($newvar[$i], "_");
    $string = substr($newvar[$i], $string+1);
    $string1 = substr($string, 0,1);
    $string1 = strtoupper($string1);
    $i++;
   }
}
1.9K
29 октября 2010 года
Werky
129 / / 14.01.2006
Не совсем вник в код, но навскидку могу сказать, что вставку в БД в цикле делать плохо, лучше собирайте в переменную и потом одним запросом через каждые 100 файлов вносите в БД. Так вместо 3000 инсертов будет 30.

Также есть функция scandir которая выбирает все файлы и директории в указанном каталоге, незнаю правда на сколько бистро никогда не проверял, но кода станет меньше. Кстати она ещё имеет возможность сортировать сразу же папки и файлы.

А как эти 3000 файлов загружаются на сервер?
3.6K
29 октября 2010 года
CrazyTimon
125 / / 13.02.2006
3.Пока что отправляю ручками через фтп, плнирую скриптик потом написать.
2.scandir попробую, и наверное только пн. отпишусь что получилось.
1.Про инсерты не совсем понял....каким образом их количество можно сократить?
1.9K
29 октября 2010 года
Werky
129 / / 14.01.2006
Цитата: CrazyTimon

1.Про инсерты не совсем понял....каким образом их количество можно сократить?



Вот как то так:

Код:
$Count=1;
$SQL=array();
if (is_dir($dir)) {//если директория существует....
   if ($dh = opendir($dir)) {//если мы её можем открыть...
       while (($file = readdir($dh)) !== false) {//то начинаем считывать все файлы по одному
           if(!($file==".."||$file=="."))//неибу почему но в $file за чем то вносится "."".."  
           {
            $original_ba=$file;//оригинальное имя
            $res=rename($dir."/".$file,$dir."/".encodestring($file));//собственно само переименовывание фаила
            echo $res."; ";  
            $original_ba_xxx=encodestring($file);//имя на транслите
            $first_letter=substr($file, 0,1);//первая буква слова
            $ar[$file]=$dir."/".$file;//формируем путь для выводимого отчета
            $Count++;
            $SQL[]="(NULL ,  '".$original_ba_xxx."',  '".$original_ba."',  '".$first_letter."')";
            if($Count==100)
            {
              mysql_query("INSERT INTO `nestr_test` (`id` ,`lat_name` ,`trans_name` ,`first_char`)VALUES ".implode(",",$SQL));//вставляем  
              $Count=1;
              $SQL=array();
            }
           }
       }
       closedir($dh);//закрываем нах папку
   }
}


по 3 п. можно их положить в архив и на сервере развернуть, это можно сделать всё через скрипт.
15
30 октября 2010 года
shaelf
2.7K / / 04.05.2005
3к инсертов это немного (если не в секунду и не на шаред хостинг). Если этот скрипт разовый или будет запускаться раз в сутки, то я бы оставил его таким, какой он есть (если он работает конечно).

PS http://php.net/glob тоже рулит :)
369
30 октября 2010 года
Kesano
451 / / 09.10.2007
shaelf: да-да, я тоже подумал о том, что неплохо было бы использовать тупо глоб...
2 Werky: твой скрипт нерабочий. Потому что если файлом меньше 100 или, например 190 - твоё условие не сработает или сработает 1 раз. и куча запросов останутся невыполненными.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог