В общем тренирую навыки пэхапэ кодинга с перспективой на быстрый порт в друпал модуль. Интересно было бы послушать более опытных программистов относительно моего кода.
Совсем ли он говённый или есть шансы на выздоровление. Отдельно интересует вопрос того, как лучше подобное реализовать, чтобы малой кровью оформить в модуль. Заранее благодарен ...
<?php
/**
*
* SEO controller
*
*/
/*
$uri = $_GET['uri'];
if( !$uri && $secure != $secureParam) {
print 'Empty request or secureParam.';
exit(0);
}
*/
$uri = 'http://www.w3.org/'; //test drive static
$uri = stripper($uri);
/* Yandex API Key, user, request adress */
$yandexUID = '';
$yandexKEY = '';
$yandexRequest = 'http://xmlsearch.yandex.ru/xmlsearch?user='.$yandexUID.'&key='.$yandexKEY.'&';
/* Google API KEY, requsets adreses*/
$GoogleKEY = '';
$GoogleRequest = array('http://ajax.googleapis.com/ajax/services/search/web?v=1.0&key='.$GoogleKEY, 'http://ajax.googleapis.com/ajax/services/search/blogs?v=1.0&key='.$GoogleKEY);
/* Yahoo API KEY, request adress */
$yahooKEY = '';
$yahooRequest = 'http://search.yahooapis.com/SiteExplorerService/V1/inlinkData?appid='.$yahooKEY;
/* prepare class */
$param = array($uri, $yandexRequest, $GoogleRequest, $yahooRequest);
$data = new index_processor();
?>
/* debug */
<pre><?php print_r($data->cfg($param)); ?></pre>
<pre><?php print $uri; ?></pre>
/* debug */
<?php
/* index class */
class index_processor {
public function
cfg($param) {
/* url parameters */
$url = urlencode('http://'.$param[0]); //url full
$uri = urlencode($param[0]); //url short
/* request parameters */
$req1 = $param[1]; //yandex
$req3 = $param[2][0]; //google
$req2 = $param[2][1]; //google blogs
$req4 = $param[3]; //yahoo
/* statuses & errors messages for description */
$status = array('в каталоге', 'нет в каталоге', 'ошибка', 'бан!', 'редирект', 'неверная кодировка', 'не отвечает',);
/* summary data */
$info = array(
$this->yaCa($url, $status),
$this->AlexaRank($uri),
//$this->writeGraph($uri),
$this->yahoo_BL($url, $req4),
$this->google_index($uri, $req3),
$this->google_links($uri, $req3),
$this->google_blogs($uri, $req2),
);
/*
$YanReq = $param[1];
$GooBReq = $param[2][0];
$GooBReq = $param[2][1];
$YahReq = $param[3];
*/
return $info;
}
/* Yandex Main */
public function yaCa($url, $status) {
$query = '&show=1';
$xml = simplexml_load_file('http://bar-navig.yandex.ru/u?ver=2&url='. $url . $query);
$rank = array('ошибка',);
/* bind values */
$CaC = 'тИЦ: ' . intval($xml->tcy['value']); /* Cy value */
$CaR = 'Rank: ' . intval($xml->tcy['rang']); /* Rank value */
if( !$xml->topics->topic['title'] && !$xml->topics->topic['url'] ) {
$rank = array($status[1], $CaC, $CaR, 'Yandex Data');
} else {
$Ca = $status[0].': '.str_replace('Тема: ', '', $xml->topics->topic['title']); /* category title */
$rank = array($Ca, $CaC, $CaR, 'Yandex Data',); // lng code array
}
return
$rank;
}
/* не забыть: языковой массив с именами */
/* ALEXA */
public function AlexaRank($uri){
$content = file_get_contents('http://data.alexa.com/data?cli=10&dat=snbamz&url=' . $uri);
preg_match('/\<popularity url\="(.*?)" TEXT\="([0-9]+)"\/\>/si', $content, $alexa);
return array($alexa[2], 'Alexa Trafic'); // lng code array
}
public function
writeGraph($uri){
$graph = '<img src="http://traffic.alexa.com/graph?&w=550&h=270&o=f&c=1&y=1&b=f1f1f1&n=006400&r=1m&u=' . $uri . '" />';
return $graph;
}
/* Yahoo Links */
public function yahoo_BL($url, $req4) {
$query = '&results=1&output=json&query='; // [default]
$data = json_decode(file_get_contents($req4 . $query . $url));
$cursor = intval($data->ResultSet->totalResultsAvailable);
return array($cursor, 'yahoo backs'); // lng code array
}
/* Google Index FILTERS */
public function google_index($uri, $req3) {
$query = '&lr=ru&filter=1&safe=active&q=site:'; // [duplicate]
$data = json_decode(file_get_contents($req3 . $query . $uri));
$cursor = intval($data->responseData->cursor->estimatedResultCount);
return array($cursor, 'google index'); // lng code array
}
/* Google Links */
public function google_links($uri, $req3) {
$query = '&lr=ru&filter=1&safe=active&hl=ru&q=link:'; // [duplicate, porn, ru]
$data = json_decode(file_get_contents($req3 . $query . $uri));
$cursor = intval($data->responseData->cursor->estimatedResultCount);
return array($cursor, 'google backs'); // lng code array
}
/* Google blogs */
public function google_blogs($uri, $req2){
$query = '&q=link:'; // [links]
$data = json_decode(file_get_contents($req2 . $query . $uri));
$cursor = intval($data->responseData->cursor->estimatedResultCount);
return array($cursor, 'google blogs'); // lng code array
}
}
/* <<< end class */
/* clear url for class functions */
function stripper($uri) {
$uri = strtolower(str_replace("http://","", $uri));
$uri = str_replace("/","", $uri);
$uri = htmlspecialchars($uri);
return $uri; // return "cleared" url withous http:// but analyze class functions have different request parameters
}
?>
Комментарии
Тогда проще взять каркасный код - типа "заготовки" под модуль Drupal.
При желании нетрудно найти.
И покопать какой-то готовый модуль и API (обязательно).
Модуль Devel тоже не повредит.
А код - как код, имхо.
Но к Друпал-модулю пока не имеет никакого отношения.
Ну смысл в том, что это должен быть отдельный слой тупо манипулирующий с данными. Т.е. принимает некие параметры и возвращает какие то данные. Соотвественно ещё будет ужиматься и растаскиваться всё это дело.
Думаю с модуля чисто обращаться в эту шнягу(ну или почти в эту). Данные будут в БД, тока ещё не придумал в каком виде.
Это будет нормальный вариант чисто технически?
Интересует вопрос относительно return $info; Я как то переживаю, что эта шняга сразу много функций дёргает. Хотя будет кэш и ограничение на запросы, но всё равно ссыкотно так оставлять...
Имхо, лучше чем один раз увидеть - ничего нет.
Покопайте модули, реализующие схожие вызовы.
Вот, кстати, такое есть - много всяких примеров:
http://drupal.org/project/examples
<?php
public function google_ranks($uri, $req2, $req3) {
$queryWalk = array(
'indexed pages' => $req3.'&lr=ru&filter=1&safe=active&q=site:', // [1] - indexed pages query [duplicate]
'all backlinks' => $req3.'&lr=ru&filter=1&safe=active&hl=ru&q=link:', // [2] - backlinks query [duplicate, porn, ru]
'blog backlinks' => $req2.'&q=link:', // [3] - backlinks from blogs [links]
); /* Walk array and get data */
$rank = array('Google Data',);
foreach ( $queryWalk as $index => $param ) {
$data = json_decode(file_get_contents($param . $uri));
$cursor = intval($data->responseData->cursor->estimatedResultCount);
$rank = array_merge($rank, array($cursor, $index));
}
return $rank; // transport back data as processed array
}
?>
Вот так делать совсем опасно? Нужно ещё растащить на кастомные массивы $queryWalk, чтобы можно было тюнить запрос и урлы откуда то из вне без ковыряния кода т.к. параметров запроса примерно 50 под разные сервисы и вся эта шняга довольно регулярно меняется. Хочу сделать внешний интерфейс который будет управлять "сборкой" запроса и дальше уже поэтапно рассылать в функции конкретные инструкции. Тут уже больше мини апи напршивается
Как избежать граблей? Такая схема приемлема при программировании?
На дру.орг есть много сопутствующей информации о разработке под Друпал, почему бы там не покопать?
http://drupal.org/documentation/develop
http://drupal.org/node/360052
Полюбому, если захотите поместить свой модуль на дру.орг, Вас заставят следовать этим принципам.
Потому и не хочу. Вижу мало смысла в том, что отдельно подключаемый компонент должен загоняться в какие то рамки. То что касается связки с самим Drupal, юзания транслэйта, БД и вывод каких то опций в админку -- да, тут оно имеет некий смысл.
При размещении модуля на дру.орг Вас заставят переделать код в соответствии с рекомендованным коде-стайлом. Если Вы этого делать не планируете, тогда делайте как Вам удобнее. Рамки удобны когда вы имеете более 9000 модулей и все они имеют одинаковый коде-стайл.
P.S. По-моему, я какие то прописные истины озвучил...
Остальное в класс и меня не колышит. Библиотеки geshi fileter тоже под друпал заточены? Нет и ни когда такими не станут.
Дополненный и немного измененный класс отрабатывает:
<?php
Вермя: 5.80256 сек
Память: 0.21MB
?>
Это с учётом того, что данные сначала берутся со внешних источников, потом обрабатываются. Если выключить Alexa, Парсер DMOZ и Google PR(все сокетные коннекты), то показатели следующие:
5 показателей яндекс по циклу: 3 их Yandex XML 2 из каталога с регулярками.
3 показателя с Google API в JSON по циклу.
1 с яху апи.
Всё это происходит на постоянных array_merge сборки инфы. Мерджи делаются в 3-4 этапа. На выходе монолитный массив.
Память: 0.21MB
Типа нормально или есть что переточить? Я так понимаю, если это всё хозяйство будет лежать в БД и вызываться обработка будет первый раз и потом по прошествию ннго времени, то вся эта бодяга будет летать ... + кэш
Где я туплю?
Следует ли группировать вызовы данных из класса в порядке возрастания времени работы функций? Имеет ли смысл делать это по циклу с таймингом или можно скопом?
Как будет легче серверу?
Как будет мягче работать?
Сколько памяти приемлимо на обработку таких функций?
Задержки при получении контента нагибают сервер?
вот пожалуй все вопросы пока ... если кто то ответит буду очень признателен.