Как кэшировать сгенерированный PHP файл XML в Drupal? - PullRequest
3 голосов
/ 17 ноября 2011

Я использую ammap для отображения карты. При нажатии пользователь получает список последних узлов Drupal 6, помеченных соответствующей страной (таксономия). Список генерируется представлением. Для этого я использую базовый XML-код ammap, но я добавил немного PHP для включения представления, т. Е .:

<?php
//set the working directory
chdir('..');
define('DRUPAL_ROOT', getcwd());

//Load Drupal
require_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL); 

header ("Content-Type:text/xml");

?>

<map map_file="maps/world3.swf" tl_long="-117.2" tl_lat="33.3" br_long="-94.5" br_lat="-33.9" zoom="299.9999%" zoom_x="-30.94%" zoom_y="-156.8%">
  <areas>
      <!-- ... -->
      <area title="ARGENTINE" mc_name="AR">
        <description><![CDATA[<?php print views_embed_view('MY_VIEW', 'VIEW_DISPLAY_ID', 'ARGUMENT'); ?>]]></description>
      </area>
      <!-- ... -->
  </areas>
</map>

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

Как я мог это сделать?

Ответы [ 4 ]

4 голосов
/ 18 ноября 2011

Лучший способ сделать это - написать небольшой модуль.

Вот самое короткое:

/**
 * Implement hook_menu()
 * to define path for our xml file.
 */
function mymodule_menu() {
    $items = array();
    $items['map.xml'] = array(
        'title' => 'Map xml',
        'page callback' => 'map_get_xml',
        'access arguments' => TRUE,
        'type' => MENU_CALLBACK
    );
    return $items;
}

/**
 * Your custom function for xml file.
 */
function map_get_xml() {
    $cache = cache_get('your-cache-id');
    $xml = $cache->data;

    if (!$xml) {
        $xml = ... // perform your code to generate your XML

        cache_set('your-cache-id', $xml);
    }

    drupal_set_header("Content-Type:text/xml");
    print $xml;
    exit();
}
1 голос
/ 17 ноября 2011

Вы можете сохранить сгенерированный XML с помощью cache_set и получить его с помощью cache_get.

http://api.drupal.org/api/drupal/includes--cache.inc/function/cache_set/6

0 голосов
/ 14 декабря 2011

Эта карта отличается для каждого пользователя? Или это довольно общий характер и поэтому довольно статичный?

Если это последнее, то я сгенерирую карту (скорее всего, на cron run) и выведу ее в статический файл, например sites / defaul / files / map.xml. Запросы к этому файлу даже не вызовут процессор PHP, что сделает его самым быстрым способом его возврата и окажет наименьшее влияние на производительность вашего веб-сервера.

0 голосов
/ 20 ноября 2011

Другой вариант, который я нашел, - разрешить создание XML через cron. В этом случае я не использовал кеш. В пользовательском модуле:

<?php
function MY_MODULE_cron() {

 $content = MY_MODULE_xml();
 file_put_contents($_SERVER['DOCUMENT_ROOT'] . file_directory_path() . '/MY_FILE.XML', $content);

}

function MY_MODULE_xml() {

$page_content = '<?xml version="1.0" encoding="UTF-8"?>
...';

return $page_content;

}

?>
...