We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 5675
    • 120 Posts
    Захотел создать себе читалку твиттера в сайт, сказано-сделано. RSS считывается и разбирается.

    [tt]<?php
    $output=’’;

    $url = ’http://twitter.com/statuses/user_timeline/23375275.rss’; //адрес RSS ленты
    $rss = simplexml_load_file($url); //Интерпретирует XML-файл в объект

    //цикл для обхода всей RSS ленты
    foreach ($rss->channel->item as $item) {

    //выделяем и оформляем ссылки из общего потока
    $l = ereg_replace("+://[^<>[:space:]]+[[:alnum:]/]","<a href=\"\\0\">\\0</a>", $item->description);

    //выделяем и оформляем имена пользователей @username
    $msg = eregi_replace("@([a-zA-Z0-9_]+)", ’<a href="http://twitter.com/\\1" rel="nofollow">@\\1</a>’, $l);

    //вставляем в параграф обработанный выше статус и ставим ссылку на него
    $output.=’<p>’.$msg.’ <a href=’.$item->link.’>Читать</a></p>’;

    }

    return $output;
    ?>[/tt]


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

    На особые познания в PHP не претендую, кому надо-пользуйтесь, собрал вообще из найденных в гугле нужных функций, работает и ладно.
      Автор благодарит алфавит за любезно предоставленные буквы
      • 785
      • 2,113 Posts
      Есть разные варианты решения, но лучше других, как мне кажется, разделить задачу на две части. Чтение из ленты и разборку дополнить записью в файл и выполнять по crone, а в сниппете оставить только чтение из этого файла и вывод в нужном виде. Вызов сниппета при этом некэшируемый.
        Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
        Статьи о MODx, регулярно новые публикации
        • 1611
        • 591 Posts
        Или в базу писать, а не в файл.
          • 5675
          • 120 Posts
          :) Откуда бы только этот самый cron взялся smiley а идея реально ниче так, один раз в час, например, скачивайть файлик заново
            Автор благодарит алфавит за любезно предоставленные буквы
            • 785
            • 2,113 Posts
            Quote from: Andrey at Sep 10, 2009, 06:25 AM

            Или в базу писать, а не в файл.
            Удобнее писать в файл в виде кода PHP (то есть в виде операторов присваивания – можно использовать для формирования функцию var_export). Тогда достаточно только подключить файл с помощью команды include_once. И файл лучше всего хранить в папке assets/cache.
            Quote from: Comicz at Sep 10, 2009, 06:28 AM

            :) Откуда бы только этот самый cron взялся
            Ну, нормальные хостинги обязательно cron поддерживают (или вопрос в том, что это такое?). Другой вариант – сохранять в файле дату, до которой данные действительны. При подключении файла проверять, наступило ли нужное время и или просто брать информацию из файла или лезть в интернет. Вообще-то я для обработки данных в формате XML использую на одном сайте оба способа – основной способ с помощью cron, но при подключении файла проверяется, если он слишком старый, читается новые данные из интернета. Если все идет нормально, работает только cron, а если cron не сработал, данные получаются «на лету».
              Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
              Статьи о MODx, регулярно новые публикации
              • 5675
              • 120 Posts
              Сообщение представляет лично для меня набор слов, никак не связанных...
                Автор благодарит алфавит за любезно предоставленные буквы
                • 785
                • 2,113 Posts
                Quote from: Comicz at Sep 10, 2009, 06:37 AM

                Сообщение представляет лично для меня набор слов, никак не связанных...
                Учите PHP... Что конкретно непонятно?
                Приведу пример, как я на одном сайте вывожу прогноз погоды по нескольким городам. По cron запускается примерно такая программа (удалено лишнее):
                <?php
                $currentWeatherDate=time();
                $weatherForecast = array();
                $wfile = $path."assets/cache/weatherforecast.inc.php";
                // как-то формирую массив $weatherForecast - к данному примеру это не относится
                $string = ’<?php
                $currentWeatherDate = ’.$currentWeatherDate.’;

                $weatherForecast = ’.var_export ($weatherForecast, TRUE).’;
                ?>’;
                file_put_contents ($wfile, $string);
                ?>

                В сниппете вызывается файл – примерно так:
                <?php
                $r_time = 86400;
                $currentWeatherDate=time();
                $weatherForecast = array();
                $wfile = $path."assets/cache/weatherforecast.inc.php";
                $noWeatherFile=false;
                if (file_exists($wfile))
                include_once ($wfile);
                else
                $noWeatherFile=true;
                if ($noWeatherFile OR
                time()-$currentWeatherDate > $r_time) {
                // опять же формирование массива и запись его в файл
                }
                // вывод информации на основе данных из массива $weatherForecast
                ?>

                Также файл для кэширования после распознавания XML используется в плагине, который я описал в статье курс валюты на сайте.
                  Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
                  Статьи о MODx, регулярно новые публикации
                  • 5675
                  • 120 Posts
                  Тут не с PHP а с логикой изложения проблемы... Проехали.
                  В итоге лента скачивается вот так:

                  [tt]<?
                  $handle = fopen("http://twitter.com/statuses/user_timeline/23375275.rss", "rb");
                  $contents = stream_get_contents($handle);
                  fclose($handle);

                  echo $contents;
                  if (file_exists(’twitter/test.rss’)) {
                  unlink(’twitter/test.rss’);
                  }

                  $handle = fopen(’twitter/test.rss’, ’w’);
                  fwrite($handle, $contents);
                  fclose($handle);
                  chmod(’twitter/test.rss’, 0755);
                  ?>[/tt]

                  Про cron на хостинге чего-то сейчас не успеваю почитать, но вроде написано что всё просто, чуть позже поковыряюсь.
                    Автор благодарит алфавит за любезно предоставленные буквы
                    • 785
                    • 2,113 Posts
                    Во-первых, лучше разбор делать в программе, вызываемой по cron, а не в сниппете, чтобы при генерации страницы выполнялось меньше действий. Кроме того, зачем устанавливаются права 755? Как в следующий раз в файл информацию записывать - то есть он удалится, если установлены права 755?
                      Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
                      Статьи о MODx, регулярно новые публикации
                      • 5675
                      • 120 Posts
                      chmod добавлен, потому что на хостере иногда вновь создаваемый файл создается с овнером пхп и невменяемым набором прав, которые поменять можно только скриптом, это для страховки. Записывать результат разбора в файл - избыточно, если сниппет разбора будет кэшироваться.
                        Автор благодарит алфавит за любезно предоставленные буквы