Несколько основных правил оптимизации сайта

Seo-оптимизация состоит из двух основных задач:
1. Оптимизация кода сайта (контент, title, метатеги, заголовки(Н1-H6) и т.д.)
2. Ссылочная (внешняя) оптимизация.

Итак, пункт первый.
• Для начала контент.
В наши дни поисковики очень ценят уникальный контент на веб-ресурсах так как им хочется выдавать релевантные результаты поиска. Кроме того, что контент должен быть уникальным, он должен иметь логическую связь в контексте. Желательная рекомендация для объема текста не менее 2000 символов (без пробелов) на страницу. Также важна частота появления самого поискового запроса в тексте (если ваш сайт на тему канализации, то соответственно и поисковый запрос «канализации» и именно это слово должно повторяться в тексте N-ое количество раз). Но огромное количество повторов может и навредить, здесь главное найти золотую середину (я лично смотрю в топ и считаю количество повторов у конкурентов, которые на первом месте).

на мой взгляд оптимизировать нужно следующим образом:
1) title:
- желательно не более 200 букв;
- в зависимости от разделов должен менятся, например "Политика | Новости", "Экономика | Новости";
- содержать ключевики, причем желательно так, чтобы как можно больше слов из титла присутствовали в тексте страницы;

2) метатеги:
- keywords имеют смысл только тогда, когда они получены динамически на основе контента (т.е. берется к примеру статья и из нее получаем слова, далее их сортируем по количеству повторов и выводим списком через запятую), если нет возможности это сделать, то лучше вообще убать этот метатег;
- description - этот метатег тоже лучше убрать, либо как и keywords сделать динамичным, т.е. просто урезаем контент до 150-200 букв (статья, описание товара или т.п.), можно просто заюзать title;
- лишние метатеги такие как author и т.п. уберите, так как они увеличивают размер странички что уменьшает плотность ключевиков в контенте;

3) контент:
- в контенте желательно производить перелинковку, т.е. допустим статья 1 ссылается на статью 2, делается это в стиле: "вы можете читать об этом в предыдущей статье <A>Работа с AllSubmitter</A>";
- важные моменты в контенте можно подсвечивать <STRONG>тегами, а также в главах используйте <H2>, <H3>, а <H1>лучше применять не более чем 1-2 раза на страничку;
- в <IMG> тегах старайтесь использовать alt аттрибуты, в них описывайте то, что содержит картинка, если не можете описать, то просто продублируйте title страницы;
- название страниц лучше составлять с использованием слов, т.е. не 12345.html, а допустим obzor-sape-ru.html, разумеется транслитерация не дает нужного эффекта, но зачастую пользователь при просмотре результатов поиска кликает на те страницы, которые в урле содержат текст, который они собственно ищут;

4) верстка странички:
- постарайтесь вынести все ненужные элементы во внешние файлы (это касательно больших блоков javascript и CSS-стилей), постарайтесь сделать страничку предельно "легкой";
- постарайтесь избавится от элементов навигации, находящихся в скрытых div блоках, если это сделать невозможно, то продублируйте навигацию в виде отдельной странички - например "карта сайта";
- ненужные элементы, такие как счетчики, формы поиска, голосования лучше уберите в <NOINDEX>, так как это захламляет контент странички;
- не увлекайтесь новомодными вещами такими как AJAX, помните, что javascript не индексируется поисковиком, следовательно, выводимая при помощи AJAX навигация не распознается поисковиком и следовательно, странички не будут проиндексированы;
- вместо широко распространённого сейчас табличного лучше использовать блочный ( <DIV>) дизайн с выносом контента посредством CSS как можно ближе к началу страницы;
- хотя администрация большинства поисковых систем и заявляет, что они умеют полноценно индексировать динамические страницы, всё-же лучше при разработке сайта использовать псевдостатику (так называемые ЧПУ - человеко-понятные URL);
5) robots.txt
- запрещайте к индексации профили пользователей в форумах (они содержат внешние ссылки, что может привести к санкциям со стороны яндекса);
- запрещайте к индексации поисковые скрипты типа search.php и т.п.
- запрещайте служебные разделы admin.php, register.php, add.php и т.п., так как контент этих страниц повторяется на многих других сайтах и пользы вашему сайту уж точно не принесет, скорее принесет вред;
- не ленитесь прописывать директиву Host: (ее понимает Яндекс), конечно поисковик сам склеит сайты http://ваш_домен.ru и http://www.ваш_домен.ru, но для надежности прямое указание основного зеркала при помощи директивы ускорит этот процесс;

Теперь немного о ссылочной оптимизации.

1) покупка ссылок:
- старайтесь исходить из принципа 1 уникальный текст ссылки на 1 ссылку, т.е. если покупаете 100 ссылок то делайте хотя-бы 20-30 различных текстов, в противном случае ссылки могут быть "склеены";
- не покупайте ссылки с сайтов где количество ссылок более 15 - эффекта вы от них не получите, возможно получите даже вред;
- обязательно проверяйте проиндексированность в поисковиках страницы, на которой будет размещена ссылка;
- проверяйте сайт донор на наличие "непот" фильтра и на отсутствие запрета на индексацию тегами <NOINDEX>, <NOFOLLOW>и файлом robots.txt;
- ставьте ссылки, ведущие не только на главную страничку сайта, но и на внутренние;
- в качестве текстов ссылки старайтесь использовать слова, встречающиеся на той страничке, куда ведет ссылка, в противном случае, велик шанс, что получите временный "взлет" позиций в Яндексе с последующим падением;

2) продажа ссылок:
- не продавайте более 10 ссылок с главной страницы и, по возможности, не более 3 с внутренних;
- старайтесь размещать ссылки, сотематичные вашему сайту;
- не размещайте ссылки с длинным текст. описанием;
- не продавайте ссылок больше чем бэков на сайт (т.е. входящих ссылок);
- если имеете хороший доход от систем Google.Adsense, Яндекс.Директ, Бегун и т.п., то лучше вообще откажитесь от продажи ссылок, так как ничего хорошего сайту от продажи ссылок не будет;
- В любом случае, если продаёте ссылки, то не пожадничайте пустить часть получаемых денег на покупку ссылок на себя. При этом при этом проседание в позициях выдачи поисковиков будет существенно меньше.


Хороший стиль программирования на PHP

Когда пишите PHP программу, придерживайтесь следующих простых правил:

1. Инициализируйте переменные
Несмотря на то, что язык PHP не требует инициализации и типизирования переменных, возьмите себе за правило это делать всегда, это убережет Вас от многих трудноуловимых ошибок в будущем.

2. Как можно меньше используйте Echo, пользуйтесь по необходимости буферизированным выводом
Хороший код:

for ($i = 0, $max = sizeof($arr), $str = ""; $i < $max; $i++) $str .= $arr[$i];
echo $str;
?>

Быстрый код:

ob_start();
for ($i = 0, $max = sizeof($arr); $i < $max; $i++) echo $arr[$i];
?>

3. Всегда пользуйтесь операторами Incremental/Decremental

$i++;
$i--;
++$i;
--$i;

4. Всегда пользуйтесь комбинированными операторами

$i += 10;
$i *= 10;
$i /= 10;
$str .= "";
...

5. Разберитесь с оператором сравнения - 'идентичность' и используйте его.

===

6. Пользуйтесь "улучшенными" проверенными конструкциями:

Цикл по "обычному" массиву

$arr = array("first", "second");
for ($i = 0, $max = sizeof($arr); $i < $max; $i++) echo $arr;

Цикл по "ассоциативному" массиву

$arr = array("first" => "value1" , "second" => "value2");
while (list(, $val) = each($arr)) echo $val;


если нужен ключ:

while (list($key, $val) = each($arr)) echo $key."=".$val;


Чтение результата запроса из БД в массив

$arr = array();
while ($row = @mysql_fetch_assoc($resquery)) $arr[] = $row;


Формирование из массива списка IN в SQL запросе

$arr = array(1, 2);
$query = sprintf("SELECT * FROM `table` WHERE `id` IN ('%s')",
implode("', '", $arr));
/*
В итоге получится строка:
SELECT * FROM `table` WHERE `id` IN ('1', '2')
*/

7. Пользуйтесь "правильной" конструкцией для формирования строки SQL запроса

$query = sprintf("SELECT * FROM `table` WHERE `id` = '%d' AND `name` = '%s'",
$val1,
mysql_real_escape_string($val2));

Замечание: используйте символы `` в именах полей, баз, таблиц и т.д., чтобы не иметь проблем с именованием

8. Не ленитесь, всегда комментируйте код, но только четкими и достаточными предложениями

9. Старайтесь по максимуму, не смешивать PHP код и HTML код

10. Прочитайте про проект PEAR и научитесь грамотному именованию переменных, функций и т.д.

11. Не изобретайте велосипед, пользуйтесь готовыми решениями
много интересного Вы найдете в PEAR и sourceforge.net.

12. Поверьте, можно замечательно прожить без объектно-ориентированного программирования, всегда подумайте над целесообразностью его использования в своей задаче.

13. И напоследок самое главное: ВСЕГДА проверяйте, что принимаете и что отсылаете
Имеются ввиду типы переменных, их размерность, наличие/отсутствие обратных слэшей в строках, HTML сущности (entities), URL encoding и т.п., помните, PHP за Вас это никогда не сделает.

14. Всегда используйте относительные пути
Один из примерных методов:

файл index.php (любой файл запуска скрипта):
include("config.php");
...
?>

файл config.php:
define("BASEDIR", dirname(__FILE__));
require(BASEDIR."/lib/libs.php");
...
?>

При таком способе, вне зависимости от того, где находится Ваш скрипт, в корне сайта или в его поддиректориях, он всегда будет правильно выставлять пути до Ваших инклудингов, от текущей папки файла config.php.

15. Разберитесь с тернарным оператором и используйте его.

...
return($err !== 0 ? false : true);

Использование хэш - массивов в Perl

Alex BATKO
Оригинал (англ.): http://www.cs.mcgill.ca/~abatko/
Перевод достаточно вольный.

Автор статьи не дает никаких гарантий, что код, приведенный в ней, будучи "преобразованным" с помощью Copy/Paste, заработает. Все примеры работали на момент написания статьи.

Инициализация (очистка) хэша

Самый быстрый способ очистки - это присвоение пустого списка.

Реализация:

my %hash = ();

Примечание:

Часто спрашивают, как инициализировать указатель на хэш (hash ref). Указатель - это скалярная переменная и инициализируется она соответствующим образом. Например:

my $hash_ref;
    my $hash_ref = 0;  # zero

Добавление пары ключ/значение в хэш

В примерах, приведенных ниже, кавычки вокруг ключей могут быть опущены, если ключи - идентификаторы.

Хэш

Решение:

$hash{ 'key' } = 'value';    # хэш

$hash{ $key } = $value;      # хэш с использованием переменной

Указатель на хэш

Решение:

$href->{ 'key' } = 'value';  # указатель на хэш

$href->{ $key } = $value;    # указатель на хэш с использованием переменной

Добавление нескольких пар ключ/значение в хэш

Решение:

Эти операции эквивалентны, просто второй вариант более читаем.

%hash = ( 'key1', 'value1', 'key2', 'value2', 'key3', 'value3' );

    %hash = (
        key1 => 'value1',
        key2 => 'value2',
        key3 => 'value3',
    );

Копирование хэшей

Решение:

my %hash_copy = %hash;  # копирование хэша

my $href_copy = $href;  # копирование указателя на хэш

Удаление одной пары ключ/значение

Не смотря на то, что удаление хэша и удаление указателя на хэш это разные операция, обе они выполняются с помощью функции delete.

Решение:

Хэш

delete $hash{$key};

Указатель на хэш

delete $hash_ref->{$key};

Перебор всех пар ключ/значение

Пример, приведенный ниже, печатает все пары ключ/значение.

Решение

Использование функции each с циклом while. Обратите внимание, что each переберет пары в случайном порядке, но порядок будет совпадать с перебором с помощью функций keys и values.

while ( my ($key, $value) = each(%hash) ) {
        print "$key => $value\n";
    }

Для указатель на хэш небольшое отличие:

while ( my ($key, $value) = each(%$hash_ref) ) {
        print "$key => $value\n";
    }

Решение:

Использование функции keys с циклом for

for my $key ( keys %hash ) {
        my $value = $hash{$key};
        print "$key => $value\n";
    }

Пример:

my $file = $ARGV[0] || "-";

    my %from = ();

    open FILE, "< $file" or die "Can't open $file : $!";

    while(  ) {
        if (/^From: (.*)/) { $from{$1}++ }  # считаем повторение отправителя
    }

close FILE;

    for my $sender ( sort keys %from ) {
        print "$sender: $from{$sender}\n";
    }

Получение размера хэша

Решение:

print "size of hash:  " . keys( %hash ) . ".\n";

Решение:

my $i = 0;

$i += scalar keys %$hash_ref; # метод 1: явный скалярный контекст
$i += keys %$hash_ref; # метод 2: неявный скалярный контекст

Использование указателей на хэш

Решение:

sub foo
    {
        my $hash_ref;

        $hash_ref->{ 'key1' } = 'value1';
        $hash_ref->{ 'key2' } = 'value2';
        $hash_ref->{ 'key3' } = 'value3';

        return $hash_ref;
    }

    my $hash_ref = foo();

    print "ключи... ", sort keys %$hash_ref, "...\n";

Функция, строящая хэш из хэшей и возвращающая указатель на хэш

Решение:

sub foo
    {
        my ( $login, $p, $uid, $gid, $gecos, $dir, $s );

        my %HoH = ();

        my $file = '/etc/passwd';
        open( PASSWD, "< $file" ) or die "Can't open $file : $!";

        while(  ) {
            ( $login, $p, $uid, $gid, $gecos, $dir, $s ) = split( ':' );

            $HoH{ $login }{ 'uid' } = $uid;
            $HoH{ $login }{ 'gid' } = $gid;
            $HoH{ $login }{ 'dir' } = $dir;
        }

        close PASSWD;

        return \%HoH;
    }

Доступ к хэшу из хэшей с помощью указателей. Вывод значений

Решение:

my $rHoH = foo();

    my( $uid, $gid, $dir );

    for my $login ( keys %$rHoH ) {

        $uid =       $rHoH->{ $login }->{ 'uid' };   # метод 1. Более читабельный
        $gid =    ${ $rHoH->{ $login } }{ 'gid' };   # метод 2
        $dir = ${ ${ $rHoH }{ $login } }{ 'dir' };   # метод 3. Менее читабельный

        print "uid: $uid, gid: $gid, dir, $dir.\n";
    }

Решение:

my $rHoH = foo();

    for my $k1 ( sort keys %$rHoH ) {
        print "k1: $k1\n";
        for my $k2 ( keys %{$rHoH->{ $k1 }} ) {
            print "k2: $k2 $rHoH->{ $k1 }{ $k2 }\n";
        }
    }

Функция, строящая хэш из хешей из хешей и возвращающая указатель на хэш

Решение:

sub foo
    {
        my %HoHoH = ();

        while( ... ) {

            if( /LOCATION:/ ) {

                ...

            } elsif( /MODULE:/ ) {

                $HoHoH{ $loc }{ $module_type }{ MODULE_NAME } = $module_name;

            } elsif( $ARGS_ALLOWED ) {

                $HoHoH{ $loc }{ $module_type }{ $arg_name } = $arg_value;

            }

        }

        return \%HoHoH;
    }

Доступ к хэшу из хэшей из хэшей с помощью указателей. Вывод значений.

Решение:

my $rHoH = foo();

    for my $k1 ( sort keys %$rHoHoH ) {
        print "$k1\n";

        for my $k2 ( sort keys %{$rHoHoH->{ $k1 }} ) {
            print "\t$k2\n";

            for my $k3 ( sort keys %{$rHoHoH->{ $k1 }->{ $k2 }} ) {
                print "\t\t$k3 => $rHoHoH->{ $k1 }->{ $k2 }->{ $k3 }\n";
            }
        }
    }

Вывод ключей и значений из хэша, полученного с помощью указателя

Решение:

while( my ($k, $v) = each %$hash_ref ) {
        print "ключ: $k, значение: $v.\n";
    }

Определение существования значения в хэше

Решение:

print "Значение СУЩЕСТВУЕТ, но может быть не определено.\n"
 if exists  $hash{ $key };

    print "Значение ОПРЕДЕЛЕНО, но может быть false.\n"
 if defined $hash{ $key };

    print "Значение TRUE\n"
 if $hash{ $key };

Пример:

Допустим, мы выполнили SQL запрос, который может вернуть записи, содержащие значение NULL. Перед тем, как использовать результат запроса, нам необходимо проверить, ОПРЕДЕЛЕНЫ ли полученные значения. Обратите внимание - функция sql_fetch_hashref() соединяется с сервером баз данных, подготавливает запрос, выполняет его и получает указатель на хэш с помощью DBI функции fetchrow_hashref().

my $answers = 'a,b,c,d,e';

    my $sql = "select max_time, $answers from questions " .
              'where question_number=?';
    my $hash_ref = sql_fetch_hashref( $sql, $q );

    my @answers = split ',', $answers;

    my $max_time = $hash_ref->{max_time} || '60';

    my $hash_ref_ans;
    for my $letter ( @answers ) {
        $hash_ref_ans->{ $letter } = $hash_ref->{ $letter }
            if defined $hash_ref->{ $letter };
    }

Цикл for создает хэш только с ОПРЕДЕЛЕННЫМ парами ключ/значение.


Вывод контекстной подсказки с помощью AJAX

На страницах вашего сайта содержится множество специализированных терминов. Когда пользователь просматривает сайт, у него могут возникать вопросы касательно этих терминов. Как сделать так, чтобы посетитель сайта по мере возникновения вопросов мог незамедлительно получать на них ответы? Раньше термины на страницах сайта оформлялись как ссылки и пользователь при желании мог кликать по ним и получать окно с контекстной подсказкой. Это подход достаточно неуклюжий, он отнимает у пользователя слишком много времени - на то, чтобы кликнуть по ссылке, дождаться загрузки окна и затем закрыть окно. В эпоху AJAX мы можем быть ближе к пожеланиям пользователей. Мы можем сделать так, чтобы уже при наведении мыши на термин незамедлительно появлялось сообщение с подсказкой и как только курсор мыши сдвинут с термина, сообщение исчезало. Наличие этого сервиса не отразится на объеме страниц сайта. При запросе контекстной подсказки Java Script будет обращаться к внешнему словарю, получать содержание и отображать его.

Метод получения информации по неявному запросу может найти применение не только в словаре терминов. Обращали ли вы внимание на ссылки с двойным подчеркиванием в таких проектах как hotscripts.com и devarticles.com? Это контекстная реклама на основе движка IntelliTXT компании Vibrant Media. При наведении курсора мыши на подобную ссылку появляется окно с рекламным предложением на соответствующую тему. Эта технология уже получила название in-text advertising.

Все чаще и чаще подобный метод применяется и на новостных порталах. Посетители видят на главной странице портала лишь заголовки новостей. Однако при наведении курсора мыши на заголовок новости они получают ее краткое описание. Таким образом, на главной странице портала можно вместить куда как больше новостей. Посетитель портала увидит заголовки и для того, чтобы получить анонсы новостей, ему будет достаточно пробежаться курсором мыши по заголовкам.

Давайте теперь рассмотрим, каким образом реализуется контекстная подсказка с помощью AJAX. Программисту, освоившему этот метод, не составит труда заставить портал комментировать новости по запросу или же написать модуль in-text advertising.

Итак, очевидно нам следует позаботиться об окне сообщения, того самого, которое будет появляться каждый раз, когда посетитель наводит курсор на термин. Для того, чтобы окно появлялось и исчезало мгновенно, следует поместить его на скрытом DIV.

<div id="InstantMessage" class="instant_message"> </div>

Для простоты эксперимента мы можем оформить его в стиле системных сообщений MS Windows.

<style>
.instant_message { padding: 5px; font-size: 12px; font-family: Arial; visibility: hidden;
position: absolute; width: 240px; border: outset 2px #FFFFFF; background: #D4D0C8}
.instant_message a { width: 240px; padding: 2px 17px; color: black; text-decoration: none;
 cursor: default}
.instant_message a:hover {color: #ffffff; background: #0A246A}  
</style>

Окно должно появиться в тот момент, когда посетитель навел курсор мыши на термин и исчезнуть, когда курсор мыши будет за пределами термина. Причем, в тот самый момент окно должно содержать уже не пробел, а текст определения термина. Таким образом, мы должны поместить термины в тексте документа в inline тег, поддерживающий события onMouseOver и onMouseOut. Первому событию следует назначить функцию JavaScript, которая получит определение термина, поместит его в окно сообщения и покажет окно. Второму событию требуется назначить функцию, которая просто скроет окно сообщения.

<a onmouseover="getDefinition('термин', event);"
 onmouseout="hideMessage();">термин</a>

В параметре функции, отображающей окно (getDefenition) сообщения надо указать термин. Этот термин будет использован для запроса текста определения посредством AJAX. Так как при показе окна нам потребуется его позиционировать под курсором мыши для поддержки Gecko-базированых браузеров, в эту функцию также следует передать параметр event. Функция для сокрытия окна (hideMessage) не требует каких-либо параметров.

Теперь наша задача - при вызове функции getDefinition заставить JavaScript позиционировать окно сообщения.

function adjustMessage(evt) {
 MessageObj = document.getElementById('InstantMessage');
 if (isThisMozilla) event=evt;

 var rightedge = document.body.clientWidth-event.clientX;
 var bottomedge = document.body.clientHeight-event.clientY;
 if (rightedge < MessageObj.offsetWidth)
  MessageObj.style.left = document.body.scrollLeft +
                                event.clientX - MessageObj.offsetWidth;
 else
  MessageObj.style.left = document.body.scrollLeft + event.clientX;
 if (bottomedge < MessageObj.offsetHeight)
  MessageObj.style.top = document.body.scrollTop + event.clientY -
                               MessageObj.offsetHeight;
 else
  MessageObj.style.top = document.body.scrollTop + event.clientY;

 MessageObj.innerHTML = 'Loading...'; 
 MessageObj.style.visibility = "visible";
}

Итак, мы имеем окно сообщения, рапортующее о загрузке данных. Теперь следует выполнить запрос к контроллеру за определением термина. Вы можете написать собственные функции для обслуживания AJAX запросов. Но если вы только начинаете работать с AJAX, я могу порекомендовать вам готовую библиотеку от Yahoo. В этом случае запрос будет выглядеть так:

function getDefinition(term,evt){
 adjustMessage(evt);
 var request = YAHOO.util.Connect.asyncRequest('POST',
 'http://адрес_контроллера', callback, 'term='+term);
}

Раз мы запрашиваем контроллер, очевидно, нам надлежит его написать. В общем случае, это самая простая часть. Задача контроллера - вернуть описание термина, переданного в POST. Каким бы языком программирования мы не пользовались при написании контроллера, нам достаточно выполнить несколько простейших операций.

  • соединиться с базой данных
  • выполнить SQL запрос для получения определения термина
  • отобразить на консоль результат в следующем виде:
    {
    "errormsg" : "в случае ошибки ее код",
    "content" : "текст определения"
    }
    

Это структура данных, известная как JSON. Она воспринимается JavaScript в явном виде, как "родная". В случае использования AJAX-библиотеки YAHOO ответ контроллера обслуживается следующей конструкцией

var handleSuccess = function(o){
 if(o.responseText !== undefined){
  showMessage(o.responseText);
 }
};

var handleFailure = function(o){
 if(o.responseText !== undefined){
  showMessage("Connection Error");
 }
};

var callback =
{
  success:handleSuccess,
  failure:handleFailure,
  argument:['foo','bar']
};

Нам осталось лишь описать функцию showMessage(), которая помещает принятый текст определения в окно сообщения

function showMessage(json) {
 var respondStructure = eval( '(' + json + ')' ); 
 MessageObj.innerHTML = respondStructure.content;
 return false;
}

Как вы понимаете, для сокрытия окна сообщения потребуется лишь изменить атрибут объекта

function hideMessage(){
 var MessageObj=document.getElementById('InstantMessage');
 MessageObj.style.visibility="hidden";
}

Когда вы будете опробовать этот пример, едва ли вы встретитесь с проблемами под браузером MS IE, однако, в FireFox вы можете обнаружить мерцание окна сообщения. Это связано с тем, что FireFox своеобразно обслуживает события onMouseOver/onMouseOut. Впрочем, эту проблему можно решить путем расстановки флагов задержки в функциях обслуживания этих событий.

Информация об авторе:

Дмитрий Шейко  -  www.cmsdevelopment.com


Распаковка ZIP-архива на FTP-сервере

Если Вам приходится достаточно часто закачивать по FTP скрипты, содержащие большое количество файлов (например, CMS, блоги), то можно использовать существенно более удобный способ их закачки: закачать один упакованный в ZIP файл и в последствии распаковать его прямо на сервере.

Согласитесь, что процесс закачки проходит гораздо быстрее, если заливать всего лишь один файл, нежели все файлы по отдельности, при условии одинакового размера в том и другом случае. Когда закачивается большое количество файлов, происходит множественное обращение FTP-клиента к серверу после каждого файла, на что уходит определенное время.

Более того, при использовании SOCKS или прокси, во время закачки множества маленьких файлов может произойти разрыв соединения с FTP-сервером, а это гарантирует еще большее количество потраченного времени, чего не может произойти, когда заливаешь всего один файл.

При частом повторении одних и тех же действий каждый стремится упростить выполняемую задачу. В данном случае существенно облегчает жизнь PHP Unzipper – скрипт, который за считанные секунды распаковывает закачанный на сервер zip архив.

Вот его предназначение:

  • Незаменимый инструмент для веб-мастера, которому часто приходится закачивать на сайт много файлов и папок.
  • Позволяет значительно сэкономить время и трафик (архив занимает гораздо меньший размер, кроме того при закачке большого количества файлов, исходящий трафик создает значительно большую долю входящего трафика, как раз за счет частого обращения к серверу) – достаточно закачать архив и скрипт распакует его мгновенно.
  • Дополнительной функцией является возможность просмотра структуры директорий на сайте, а также возможность просмотра содержимого zip архивов на сервере без их распаковки.
  • Скрипт очень прост в установке, использует авторизацию по логину и паролю.

Качаем PHP Unzipper (38 Kb).

Как устанавливается:

  1. Закидываем находящиеся в архиве файлы index.php и pclzip.lib.php на сервер в ту папку, куда будем устанавливать движок (возможно потребуется переименовать index.php в любой другой, поскольку закачиваемый скрипт движка может иметь файл с таким же названием).
  2. Устанавливаем CHMOD для файла index.php на 777 (примечание - не знаю, почему, но в инструкции к скрипту написано именно так, а практика показала, что 777 нужно ставить для папки, в которую будет распаковываться архив).
  3. Открываем index.php в браузере, скрипт попросит зарегистрироваться – указываем логин и пароль (если после регистрации снова появилась эта же форма, устанавливаем для папки, в которую закачан PHP Unzipper, CHMOD на 777).
  4. Авторизуемся для работы с zip архивом.

При архивировании скрипта движка прошу обратить внимание на тот момент, что архивировать нужно не саму папку, в которой лежит этот скрипт, а то, что в ней находится, поскольку в каком виде вы запакуете движок, в таком виде его и разархивирует PHP Unzipper.

На некоторых серверах иногда возникает ситуация, когда файлы, распакованные таким образом становятся залоченными, т.е. их невозможно перезаписать или сменить им права доступа вручную.

В таком случае нужно установить им права доступа PHP-средствами.

Для смены CHMOD файлам и папкам следует запустить php-файл со следующим кодом:

  1. chmod ("file1.php", 0666);
  2. chmod ("file2.php", 0666);
  3. chmod ("directory1", 0777);
  4. chmod ("directory2", 0777);
  5. ?>

что устанавливает права доступа 666 к файлам file1.php и file2.php и права доступа 777 папкам directory1 и directory2.


Page: [1] [2] [3] [4] [5]
 
 

статистика сайта
Page created in 0,05003 seconds Powered by LastoBlog