CMS для сателлитов

Опубликовано в Статьи в Март 13th, 2009, admin – Комментариев нет

CMS для сателлитов

В этом посте проведен обзор нескольких бесплатных мини CMS, удобных для создания небольших сайтов-визиток и сателлитов.

На сегодняшний день существует большое количество как бесплатных, так и платных CMS (система управления сайтом), называемых также движками. Все эти системы (например Drupal, Joomla, WordPress) предоставляют широчайшие возможности по управлению контентом сайта, а также богатый перечень дополнительных модулей: гостевые книги, новостные ленты, формы обратной связи, интернет-магазины и прочее.

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

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

Приступим к обзору…

CMSimple

CMSimple

CMSimple

CMSimple админка

CMSimple админка

Весьма простая CMS для сателлитов, занимающая около 300Кб в развернутом виде. Не использует базы данных, а всю информацию хранит в одном файле. Интересна структура этой мини CMS: страницы сайта формируются исходя из тегов <h1>, <h2> и <h3>, т.е. берется один исходный файл и каждый заголовок в странице расценивается как очередная страница. Всего может быть три уровня вложенности.
Такая структура позволяет легко импортировать данные, создав html-документ в любом html-редакторе. Эта CMS для сателлитов имеет свой встроенный редактор страниц позволяющий изменять/создавать страницы как редактированием исходного html-кода, так и в визуальном редакторе.

Следует заметить очень неудобный интерфейс админки: перемещение по страницам затруднено, а когда я убрал кнопку «войти», то сумел найти правильный URL формы авторизации только после того, как переустановил скрипт.

Скрипт якобы предоставляет возможность вставлять CMSimple-теги, с помощью которых можно изменить мета-теги страницы или вставить php-код. Выглядит это примерно так:
#CMSimple $GLOBALS['cf']['site']['title']=’превед медвед!’; #
Данная CMS для сателлитов является условно бесплатной: пользователи должны оставить ссылку внизу страницы на сайт разработчика или оплатить 48USD.

Данная система существует уже давно и ходят слухи, что Яндекс банит созданные в ней сайты. Лично я так не считаю, так как этот слух обязан своим существованимем тому, что яндекс просто банит сателлиты с неуникальным контентом, а для подобных сайтов CMSimple используется очень часто.

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

Multiengine

Абсолютно бесплатный движок для сателлитов. Представляет из себя весьма простое решение, которое даже CMS назвать трудно – multiengine не имеет админки, поэтому это скорее набор взаимосвязанных скриптов, чем полноценная CMS для сателлитов.

Меню создается вручную, данные хранятся в различных html-файлах, которые могут также содержать php-скрипты. Документации по данной мини CMS практически никакой нет. Базы данных не требует. В общем, если эта CMS не имеет админки, то напрашивается вопрос: зачем же она тогда вообще нужна?

CMS Made Simple

Я долго не мог решить стоит ли помещать данную программу в обзор, так как она представляет из себя полноценную гибкую и многофункциональную CMS, на которой можно строить вполне серьезные сайты. Занимает 15Мб места на жестком диске, в отличии от предыдущих CMS для сателлитов требует наличия базы данных (MySQL). Сразу при установке бросился в глаза один небольшой глюк: браузер неправильно отображал кодировку в мастере установки, а сам процесс установки весьма длительный.

Данная CMS далеко не simple, и неплохо нагружает сервер, поэтому из категории «мини CMS» ее правильнее было бы исключить.

Как и предыдущая система CMSMS абсолютно бесплатная.

Mini-CMS

Этот движок для сателлитов представляет из себя очень примитивную мини CMS, отлично подходящую для создания небольших сайтов-визиток, не требующих ничего особенного.

Для работы mini-CMS требует наличия базы данных MySQL. В развернутом виде занимает всего около 50Кб, работает очень быстро.
После установки (простая и не требует много времени) не мог войти в админку. Покопавшись немного в исходном коде причина была выявлена: эта CMS для сателлитов работает только при Register_globals=On.

Дополнительными преимуществами являются: возможность править мета-теги, страница может содержать PHP код и XHTML, очень шустрая.

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

Создание страниц осуществляется из админки правкой html-кода. Если необходимо закачать файл или рисунок, то это нужно сделать вручную по FTP.

Strawberry

Данный движок для сателлитов представляет из себя новостной простую в использовании систему публикации новостей (из которых и формируется контент). Работать может как с базой данных MySQL, так и без нее (используется txtSQL). Тем, кто не в курсе: txtSQL это класс, который позволяет построить некоторе подобие базы данных MySQL, храня данные в текстовых файлах. Поэтому если отказаться от использования MySQL, то производительность заметно снижается.
Возможности: возможность задавать индивидуальный URL для каждоый страницы, визуальный редактор, трэебэки, комментирование новостей, регистрация пользователей с возможностью публикации новостей, есть большое количество плагинов.

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

Защита продажных ссылок

Опубликовано в Статьи в Март 6th, 2009, admin – Комментариев нет

Продажные ссылки sape

Если на каком-либо сайте есть страница типа http://example.com/page.html, то, скорее всего, содержимое страницы http://example.com/page.html?var1=tratata бедет таким же или отличаться незначительно. Разумеется, поисковые системы успешно проанализируют содержимое страницы по таким адресам и склеют их в один, справедливо считая, что это одна и та же страница.

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

Это иногда используется для недобросовестной торговли продажными ссылками, но речь не об этом, а о том, как сделать так, чтобы sape расценила данные страницы корректным образом, т.е. установила ссылку вне зависимости от того, какие параметры переданы в get-запросе.

Если этого не сделать, то проверяющий бот, добавив какой-либо несуществующий параметр в запрос сможет вычислить продажные ссылки, размещенные при системой sape или другого подобного сервиса. Обычно, чтобы этого избежать
просто устанавливают код 404 (not found), если в запросе есть неизвестные параметры.

Однако это не самый лучший способ, так как забыть про какой-либо get параметр вполне легко, особенно, если речь идет о CMS. Кроме того есть случаи, когда дополнительные get параметры добавляются
сторонними сайтами, например сервисами ведения статистики.

Предлагаемый в этой статье способ заключается в том, чтобы передать sape ссылку, содержащую только жизненно важные get-параметры, отбросив ненужные, но, при этом, оставив их доступными самой странице.

Делается это следующим образом. На страницах сайта размещается следующий код вызова вместо стандартного:

  1. require_once($_SERVER[‘DOCUMENT_ROOT’].‘/’._SAPE_USER.‘/sape.php’);
  2. $o[‘charset’]=‘UTF-8′;
  3. $GetParams=array(‘id’,‘act’,‘page’);
  4. $o[‘request_uri’] = reset(explode(‘?’,$_SERVER[‘REQUEST_URI’]));
  5. $params = array();
  6. foreach($GetParams as $param) {
  7.   if(isset($_GET[$param]))
  8.     $params[]=urlencode($param).‘=’.urlencode($_GET[$param]);
  9. }
  10. if($params)
  11.   $o[‘request_uri’].="?".implode(‘&amp;’,$params);
  12. $sape=new SAPE_client($o);

Как можно видеть из приведенного кода в строке 3 задается массив, который содержит GET-параметры, которые необходимо передать Sape. Так, например, от параметров id, act и page обычно существенно зависит содержимое страницы, поэтому эти параметры передаются sape. Все остальные параметры (например ид пользователя, ид стиля отображения, статические данные, данные о предыдущей песещенной странице и прочие) отбрасываются.

Единственное, что необходимо сделать - это учесть все get-параметры, от которых зависит контент страницы.

Таким образом ссылки на странице станут похожими на “натуральные” и обнаружить продажные ссылки станет намного сложнее.

Многопоточность

Опубликовано в Статьи в Февраль 24th, 2009, admin – 1 комментарий

Многопоточность на PHP

В статье описана организация мультизапросов средствами PHP с использованием библиотеки cURL. Данный механизм предполагается использовать для создания скриптов, осуществляющих автоматизированные запросы ко множеству веб-серверов.

В своей практике веб-мастерам часто приходится использовать программных роботов, осуществляющих регулярный или массовый запрос веб-страниц, заполениние регистрационных форм или выполняющих другие подобные действия. Традиционно и вполне оправданно для этой цели используется язык PHP и библиотека cURL, которая установлена практически на всех веб-серверах. Библиотека cURL, по сути, является наложением на сокеты и представляет из себя лишь удобный в использовании сервис по формированию http-запроса в зависимости от заданных параметров программиста.

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

Прежде чем начать описывать механизм разработки скриптов сначала о том, что же я подразумеваю под многопоточностью. Дело тут в том, что ни какой многопоточности в PHP на самом деле нет и когда употребляется термин «многопоточность» касательно библиотеки cURL, то речь идет о мультизапросах.

Механизм мультизапросов заключается в том, что во время посылки запросов веб-серверам, PHP не дожидается ответа от каждого поочередно посланного запроса, а посылает (опять же поочередно) сразу несколько запросов, и уже после этого обрабатывает приходящие от них ответы. Поэтому применять многопоточность имеет смысл только тогда, когда осуществляются запросы к разным серверам – если необходимо осуществить большое количество запросов к одному серверу, то многопоточность не принесет заметного увеличения производительности скрипта.

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

Итак, теперь о практике… Рассмотрим пример, когда нужно загрузить большое количество веб-страниц, чтобы, например, проверить наличие на них кода обратной ссылки. Для этого понадобится следующее:

1. Список всех URI помещаем в массив
2. Создаем массив «обычных» cURL в требуемом количестве (количество потоков) и один cURL_multi
3. Инициализируем каждый созданный cURL (URL из подготовленного ранее массива, переменные post, если требуется, прокси и т.д.)
4. Добавляем каждый cURL в cURL_multi
5. Запускаем все потоки при помощи вызова cURL_multi
6. В цикле опрашиваем состояние cURL_multi и если есть отработавший поток, обрабатываем полученную страницу и на его место запускаем новый cURL. Если список URI закончился, то только обрабатываем результат. Цикл продолжается до тех пор, пока есть хотя бы один незавершенный поток.
7. Закрываем все cURL.

Теперь, собственно, скрипт который выполняет данную операцию:

  1. <?php
  2. function Parse(&amp;$urls,$flowcount) {
  3.   // $urls - массив с URL-адресами
  4.   // $flowcount - количество потоков
  5. //Запуск потоков
  6.   $ch=array();
  7.   $lcount0=count($urls);
  8.   if($flowcount>$lcount0) $flowcount=$lcount0;
  9.   for($flow=0;$flow<$flowcount;$flow++) $ch[]=curl_ini(array_pop($urls)); //создание массива cURL
  10.   $mh=curl_multi_init(); //создание cURL_multi
  11.   for($flow=0;$flow<$flowcount;$flow++) { //В этом цикле инициализируются cURL
  12.     curl_setopt($ch[$flow],CURLOPT_REFERER,‘TESTREFERER’);
  13.     curl_setopt($ch[$flow],CURLOPT_USERAGENT,);
  14.     curl_setopt($ch[$flow],CURLOPT_RETURNTRANSFER,1);
  15.     curl_setopt($ch[$flow],CURLOPT_POST,1);
  16.     curl_setopt($ch[$flow],CURLOPT_POSTFIELDS,‘TEST=TESTVAR’);
  17.     curl_setopt($ch[$flow],CURLOPT_COOKIE,‘TEST=TESTCOOKIE’);
  18.     curl_multi_add_handle($mh,$ch[$flow]);
  19.   }
  20.   $flows=null;
  21.   do { //Основной цикл, продолжается до тех пор, пока есть хотябы один работающий поток
  22.     do curl_multi_exec($mh,$flows); while($flows==$flowcount); //циклическая проверка количества работающих потоков
  23.     $info=curl_multi_info_read($mh);
  24.     if(!count($urls)) { //Больше нет URL для обработки
  25.       $res=curl_multi_getcontent($info[‘handle’]);
  26.       curl_multi_remove_handle($mh,$info[‘handle’]);
  27.       curl_close($info[‘handle’]);
  28.       $flowcount–;
  29.     } else { //Есть еще URL для обработки
  30.       curl_setopt($info[‘handle’],CURLOPT_URL,array_pop($urls));
  31.       $res=curl_multi_getcontent($info[‘handle’]);
  32.       curl_multi_remove_handle($mh,$info[‘handle’]);
  33.       curl_multi_add_handle($mh,$info[‘handle’]);
  34.       curl_multi_exec($mh,$flows);
  35.     }
  36.     //Анализ результатов
  37.     $err=AnalizePage($res);
  38.     if($err) die(‘Некая ошибка!’);
  39.   } while($flows>0);
  40.   curl_multi_close($mh);
  41. }
  42. ?>

В тексте кода достаточно комментариев, чтобы разобраться что происходит. Поясню несколько моментов…

1. Вызов curl_multi_init должен быть осуществлен ОБЯЗАТЕЛЬНО после того, как все “обычные” cURL будут проинициализированы, т.е. нельзя поменять 9ю и 10ю строки местами, поэтому участки кода по инициализации $ch[] и задания необходимых параметров разделены.

2. При каждом вызове curl_multi_exec в строке 22 в переменную $flows помещается количество активных потоков, которое далее сравнивается с количеством запущенных потоков (переменная $flowcount будет уменьшаться, если в списке обрабатываемых URL (массив $urls) больше нет записей).

3. curl_multi_info_read возвращает информацию об очередном отработавшем потоке, или false, если с момента предыдущего вызова этой функции никаких изменений небыло.

4. Функция curl_multi_info_read обновляет данные, помещаемые в переменную $info только после того, как будет выполнен curl_multi_exec, поэтому для обработки каждого потока необходимо использовать обе функции.

5. Чтобы добавить новый поток необходимо последовательно выполнить вызов трех функций: curl_multi_remove_handle, curl_multi_add_handle и curl_multi_exec.

Ну и последнее: иногда важно знать какую-либо дополнительную информацию, связанную с обрабатываемым потоком. В этом случае можно создать ассоциативный массив, ключами которого будут являться идентификаторы потока, т.е. значения в $info['handle'].