Курю пэхапэ [нубас детэктэд]

Главные вкладки

Аватар пользователя Shift-Web Shift-Web 10 апреля 2011 в 1:00

В общем тренирую навыки пэхапэ кодинга с перспективой на быстрый порт в друпал модуль. Интересно было бы послушать более опытных программистов относительно моего кода.

Совсем ли он говённый или есть шансы на выздоровление. Отдельно интересует вопрос того, как лучше подобное реализовать, чтобы малой кровью оформить в модуль. Заранее благодарен ...


<?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
}

?>

Комментарии

Аватар пользователя OldWarrior OldWarrior 10 апреля 2011 в 1:25

Отдельно интересует вопрос того, как лучше подобное реализовать, чтобы малой кровью оформить в модуль.

Тогда проще взять каркасный код - типа "заготовки" под модуль Drupal.
При желании нетрудно найти.
И покопать какой-то готовый модуль и API (обязательно).
Модуль Devel тоже не повредит.

А код - как код, имхо. Smile
Но к Друпал-модулю пока не имеет никакого отношения.

Аватар пользователя Shift-Web Shift-Web 10 апреля 2011 в 1:27

"OldWarrior" wrote:
Но к Друпал-модулю пока не имеет никакого отношения.

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

Думаю с модуля чисто обращаться в эту шнягу(ну или почти в эту). Данные будут в БД, тока ещё не придумал в каком виде.
Это будет нормальный вариант чисто технически?

Интересует вопрос относительно return $info; Я как то переживаю, что эта шняга сразу много функций дёргает. Хотя будет кэш и ограничение на запросы, но всё равно ссыкотно так оставлять...

Аватар пользователя Shift-Web Shift-Web 10 апреля 2011 в 1:53

"OldWarrior" wrote:
Вот, кстати, такое есть - много всяких примеров:
http://drupal.org/project/examples[/quote]

...

Спасибо, конечно, но откажусь. Не хочу свалку разводить ... отчасти просто впадлу рыться в этих кракозябрах и есть мотивы точить "по своему".

Я знаю чем это закончиться ... курением того, как работают эти модули. Времени жалко, лучше PHP покурю основательно.

Аватар пользователя Shift-Web Shift-Web 10 апреля 2011 в 16:38
<?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 под разные сервисы и вся эта шняга довольно регулярно меняется. Хочу сделать внешний интерфейс который будет управлять "сборкой" запроса и дальше уже поэтапно рассылать в функции конкретные инструкции. Тут уже больше мини апи напршивается

Как избежать граблей? Такая схема приемлема при программировании?

Аватар пользователя GDI@drupal.org GDI@drupal.org 10 апреля 2011 в 18:37

На дру.орг есть много сопутствующей информации о разработке под Друпал, почему бы там не покопать?
http://drupal.org/documentation/develop
http://drupal.org/node/360052
Полюбому, если захотите поместить свой модуль на дру.орг, Вас заставят следовать этим принципам.

Аватар пользователя Shift-Web Shift-Web 10 апреля 2011 в 18:56

"<a href="mailto:GDI@drupal.org">GDI@drupal.org</a>" wrote:
Вас заставят следовать этим принципам.

Потому и не хочу. Вижу мало смысла в том, что отдельно подключаемый компонент должен загоняться в какие то рамки. То что касается связки с самим Drupal, юзания транслэйта, БД и вывод каких то опций в админку -- да, тут оно имеет некий смысл.

Аватар пользователя GDI@drupal.org GDI@drupal.org 10 апреля 2011 в 20:26

При размещении модуля на дру.орг Вас заставят переделать код в соответствии с рекомендованным коде-стайлом. Если Вы этого делать не планируете, тогда делайте как Вам удобнее. Рамки удобны когда вы имеете более 9000 модулей и все они имеют одинаковый коде-стайл.

P.S. По-моему, я какие то прописные истины озвучил...

Аватар пользователя Shift-Web Shift-Web 10 апреля 2011 в 20:44

"<a href="mailto:GDI@drupal.org">GDI@drupal.org</a>" wrote:
Вас заставят переделать код в соответствии с рекомендованным коде-стайлом.

"Shift-Web" wrote:
То что касается связки с самим Drupal, юзания транслэйта, БД и вывод каких то опций в админку -- да, тут оно имеет некий смысл.

Остальное в класс и меня не колышит. Библиотеки geshi fileter тоже под друпал заточены? Нет и ни когда такими не станут.

Аватар пользователя Shift-Web Shift-Web 10 апреля 2011 в 23:21

Дополненный и немного измененный класс отрабатывает:

<?php
Вермя
5.80256 сек
Память
0.21MB
?>

Это с учётом того, что данные сначала берутся со внешних источников, потом обрабатываются. Если выключить Alexa, Парсер DMOZ и Google PR(все сокетные коннекты), то показатели следующие:

5 показателей яндекс по циклу: 3 их Yandex XML 2 из каталога с регулярками.
3 показателя с Google API в JSON по циклу.
1 с яху апи.

Всё это происходит на постоянных array_merge сборки инфы. Мерджи делаются в 3-4 этапа. На выходе монолитный массив.

Вермя: 2.59191 сек
Память: 0.21MB

Типа нормально или есть что переточить? Я так понимаю, если это всё хозяйство будет лежать в БД и вызываться обработка будет первый раз и потом по прошествию ннго времени, то вся эта бодяга будет летать ... + кэш

Где я туплю?
Следует ли группировать вызовы данных из класса в порядке возрастания времени работы функций? Имеет ли смысл делать это по циклу с таймингом или можно скопом?
Как будет легче серверу?
Как будет мягче работать?
Сколько памяти приемлимо на обработку таких функций?
Задержки при получении контента нагибают сервер?

вот пожалуй все вопросы пока ... если кто то ответит буду очень признателен.