Несколько RSS-каналов с PHP (производительность)

Вы можете использовать Partial View для объекта Contributor. Частичный вид:

@model Contributor
using (Html.BeginForm("ContributorUpdate", "YourController"))
{
  @Html.HiddenFor(model => Model.Id)
  <div class="formrow">
    @Html.ValidationSummary(true)
  </div>

  <h2>@Html.TextRaw("AuthorInfo", "Author")</h2>
  <div class="formrow">

   @Html.EditorFor(model => Model.FirstName)
   <div class="formvalidation">
        @Html.ValidationMessageFor(model => Model.FirstName)
   </div>
</div>
<div class="formrow right">
   <input type="hidden" name="formsubmitted" value="true" />
   <input type="submit"  class="button" value="@Html.Text("ButtonText", "Save")" />
</div>
}

Вид будет:

@foreach (var contributor in Model.Contributor)
{
   @{Html.RenderPartial("Conributor", contributor);}
}

И код контроллера:

[HttpPost]
public ActionResult Mine(Conributor conributor, string newuser)
{
    //
}
1
задан hakre 24 December 2012 в 22:41
поделиться

4 ответа

Вы производили отладку? Регистрация микровремени в различных точках вашего кода.

Вы обнаружите, что загрузка RSS-канала, а не его анализ, требует времени, но вы можете обнаружить, что это связано со временем, которое требуется для создания каждого RSS-канала.

Сохраните эти десять каналов как статические файлы xml, наведите на них свой сценарий и посмотрите, как быстро он загрузится.

0
ответ дан 2 September 2019 в 22:11
поделиться

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

У вас может быть скрипт PHP, который запускается в фоновом режиме (например, через задание cron) и периодически загружает каналы, на которые вы подписаны, в базу данных, тогда вы можете намного быстрее получать / фильтровать данные, когда захотите показать это.

2
ответ дан 2 September 2019 в 22:11
поделиться

Вы можете загружать RSS-каналы параллельно с curl_multi . Это может ускорить ваш скрипт, особенно если вы сейчас используете блокирующие вызовы.

Небольшой пример (из http://www.rustyrazorblade.com/2008/02/curl_multi_exec/ ):

$nodes = array('http://www.google.com', 'http://www.microsoft.com', 'http://www.rustyrazorblade.com');
$node_count = count($nodes);

$curl_arr = array();
$master = curl_multi_init();

for($i = 0; $i < $node_count; $i++)
{
    $url =$nodes[$i];
    $curl_arr[$i] = curl_init($url);
    curl_setopt($curl_arr[$i], CURLOPT_RETURNTRANSFER, true);
    curl_multi_add_handle($master, $curl_arr[$i]);
}

do {
    curl_multi_exec($master,$running);
} while($running > 0);

echo "results: ";
for($i = 0; $i < $node_count; $i++)
{
    $results = curl_multi_getcontent  ( $curl_arr[$i]  );
    echo( $i . "\n" . $results . "\n");
}
echo 'done';

Дополнительную информацию можно найти на Асинхронные / параллельные HTTP-запросы с использованием PHP multi_curl и Как использовать curl_multi () без блокировки (среди прочего).

Кстати, чтобы обрабатывать каналы после их загрузки с помощью curl_multi, вам, конечно же, придется использовать simplexml_load_string вместо simplexml_load_file.

0
ответ дан 2 September 2019 в 22:11
поделиться

да, конечно, кэширование - единственное разумное решение.
лучше настроить задание cron для получения этих лент и хранить данные локально.

0
ответ дан 2 September 2019 в 22:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: