Не работает модуль wowarmory

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

Аватар пользователя maple4 maple4 8 июня 2010 в 10:56

В файле wowarmory.module
есть след. код (функция срабатывает при запуске cron-a):

function wowarmory_cron() {
require_once('wowarmory.inc');
_wowarmory_update_roster();
}

Назначение функции - при запуске cron получить страницу http://eu.wowarmory.com/guild-info.xml?r=
распарсить ее и занести данные в таблицу, что бы уже по ней выводить что надо.

Открываю wowarmory.inc, нахожу _wowarmory_update_roster, и ничего незаконного (что -бы вызвало остановку cron) в ней не нахожу
впрочем, как и в фунуции _wowarmory_curl_guild (она - чуть ниже)


Теперь о проблеме...

Для того, что бы загрузить в таблицу данные по гильдии, необходим запуск cron.
Так вот он, зараза, полностью не срабатывает.
На странице admin/reports/dblog появляется надпись:
Выполнение регулярных процедур (cron) превысило отведенное время и было прервано.

Поиск ничего не дал. И я знаю, что проблема именно в этом модуле (оключение модуля - все ок)

В чем может быть дело?

Пока данные в таблицу заношу в полуавтоматическом режиме:
1. Распарсиваю страницу на локальном компьютере (соответствующей прогой).
2. Копирую csv-файл на хостинг.
3. Запускаю php-скрипт, который обновляет таблицу, после чего модуль wowarmory отлично все показывает.
Все это занимает не более минуты, НО КАК ЖЕ это все НАПРЯГАЕТ... (как минимум, 3 процедуры вместо одной)

Может кто занимался с wowarmory?
Или похожим модулем?

function _wowarmory_update_roster() {

$doc = new DOMDocument();
$xml_str = _wowarmory_curl_guild();
//echo $xml_str;
$doc->loadXML($xml_str);
$member_list = $doc->getElementsByTagName("character");

/**
* This whole process needs to to updated to use only one query for the
* entire guild insertion, instead of one for each member
* Also fix the overall process to cut down on the total queries
*/
$query = "SELECT name FROM {wowarmory_roster}";
$result = db_query($query);
$current = array();
while ($row = db_fetch_array($result)) {
$current[] = $row['name'];
}

foreach ($member_list as $toon) {
$data = array(
'achPoints' => $toon->getAttribute("achPoints"),
'classId' => $toon->getAttribute("classId"),
'genderId' => $toon->getAttribute("genderId"),
'level' => $toon->getAttribute("level"),
'name' => $toon->getAttribute("name"),
'raceId' => $toon->getAttribute("raceId"),
'rank' => $toon->getAttribute("rank"),
);
//echo '

';
    //print_r($data);


    // Does the character already exist?
    // We can check this from the query that we already ran. member names are listed in the
    $query = "SELECT id FROM {wowarmory_roster} WHERE name = '" . $data['name'] . "';";

    // the character exists, update
    if ($id = db_result(db_query($query))) {
      $sql_update = "UPDATE {wowarmory_roster} SET level = " . $data['level'] . ", achPoints = ". $data['achPoints'] . " WHERE ID = '" . $id . "';";
      db_query($sql_update);

    }
    else {
      // the character is new, insert
      $sql_insert = "INSERT INTO {wowarmory_roster} ( achPoints, classId, genderId, level, name, raceId, rank ) " .
      "VALUES ('" . $data['achPoints'] . "', '" . $data['classId'] . "', '" . $data['genderId'] . "', '" . $data['level'] . "', '" . $data['name'] . "', '" . $data['raceId'] . "', '" . $data['rank'] . "')";
      db_query($sql_insert);
      watchdog('wowarmory', $data['name'] . ' has been added to the roster.' , array(), WATCHDOG_NOTICE);
    }

    // As we filter through each player from wowarmory.com, remove them from our tracking array.
    foreach ($current as $key => $value) {
      if ($value == $data['name']) {
        unset($current[$key]);
      }
    }

    // Update the index's for the array (This may not be required, but lets keep it clean.
    $current = array_values($current);

  }

  // Clean up the players that were not seen on the roster page.
  //echo '
The following players were not seen, and are being removed: '; foreach ($current as $name) { watchdog('wowarmory', $name . " has been removed from the roster."); db_query("DELETE FROM {wowarmory_roster} WHERE name = '%s'", $name); } watchdog('wowarmory', 'Armory updated successfully.', array(), WATCHDOG_NOTICE); } function _wowarmory_curl_guild() { // Pretend to be Firefox. $useragent = "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2) Gecko/20070219 Firefox/2.0.0.2"; /** * Need some error checking here.... compare page against an array of valid page names? */ // Create the uri that curl will load, dependant on the region that the guild resides in $xml_url = "http://eu.wowarmory.com/guild-info.xml?r=" . urlencode(variable_get('wowarmory_realm', '')) . "&gn=" . urlencode(variable_get('wowarmory_guild', '')); //echo "Downloading XML From: " . $xml_url . "
"; // Run with it $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $xml_url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_USERAGENT, $useragent); //curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); $data = curl_exec($ch); curl_close($ch); // New attempt at detecting maintenance mode. Working as of 3/23/2010 if (strpos($data, "maintenance") == TRUE) { watchdog('wowarmory', 'Armory is in maintenance mode. No changes made.', array(), WATCHDOG_NOTICE); exit(); } if (strpos($data, "404") == TRUE) { watchdog('wowarmory', 'Armory returned a 404 error. No changes made.', array(), WATCHDOG_NOTICE); exit(); } else { return $data; } }