HttpRuntime. Кэш [] по сравнению с приложением []

Как уже упоминалось, просто проверьте, есть ли qty isset перед добавлением к нему:

$vendel = array();
$indexArray = array();
foreach ($vd_arr as $miniarray) {

  $vendel[$miniarray['id']]['id'] = $miniarray['id'];
  $vendel[$miniarray['id']]['delivnote_id'] = $miniarray['delivnote_id'];
  // the magic is in the next line
  if(!isset($vendel[$miniarray['id']]['qty']))
      $vendel[$miniarray['id']]['qty'] = 0;
  $vendel[$miniarray['id']]['qty'] += $miniarray['qty'];
}

foreach($vendel as $value) {
  $indexArray[] = $value;
}
return $indexArray;

с некоторым рефакторингом мы могли бы избавиться от второго цикла цикла, если мы используем «id» в качестве ключа $ indexArray

$vendel = array();
$indexArray = array();

foreach ($vd_arr as $miniarray) {
    if(!isset($indexArray[$miniarray['id']])) {
        $indexArray[$miniarray['id']] = array(
            'delivnote_id' => $miniarray['delivnote_id']
            ,'qty' => 0
        );
    }
    $indexArray[$miniarray['id']]['qty'] += $miniarray['qty'];
}

return $indexArray;

Или, если вам нужны эти индексы для численного

$vendel = array();
$indexArray = array();
foreach ($vd_arr as $miniarray) {
    if(!isset($indexArray[$miniarray['id']])) {
        $indexArray[$miniarray['id']] = array(
            'id' => $miniarray['id']
            ,'delivnote_id' => $miniarray['delivnote_id']
            ,'qty' => 0
        );
    }
    $indexArray[$miniarray['id']]['qty'] += $miniarray['qty'];
}
return array_values($indexArray);
29
задан Jon Tackabury 28 November 2008 в 21:04
поделиться

3 ответа

Пока Вы не злоупотребляете состоянием приложения, тогда я не вижу проблемы в использовании его для объектов, что Вы не хотите истекать. Кроме того, я, вероятно, использовал бы статическую переменную около кода, который использует ее. Тем путем Вы стараетесь не проходить HttpApplicationState и затем вынуждены иметь ссылку на Систему. Сеть, если я хочу получить доступ к своим данным.

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

Это - вероятно, преимущество использования Кэша в Вашей ситуации. Потребление большей памяти сумм не является столь же фатальным, потому что Вы позволяете ASP.NET выпускать объекты в своем кэше, когда память становится недостаточной.

19
ответ дан Joseph Woodward 14 October 2019 в 08:32
поделиться

Используйте кэш, когда Вы хотите, чтобы объекты автоматически истекли или были исправлены, когда память недостаточна. Иначе используйте статические переменные, если Вы можете, потому что они приведут к лучшей производительности, тогда роющей через набор ApplicationState. Я не абсолютно уверен, что имело бы место, когда использовать ApplicationState, но, несомненно, будет некоторыми.

7
ответ дан Vilx- 14 October 2019 в 08:32
поделиться

Приложение удерживается от использования Кэшем. Если Вам нужно что-то с областью действия приложения, то необходимо или создать ее как статический член класса или использовать Кэш. Если Вы хотите пойти путем Кэша, но никогда не хотите, чтобы он истек, необходимо использовать CacheItemPriority. Опция NotRemovable, когда Вы Вставляете значение в кэш. Обратите внимание, что возможно использовать этот приоритет и все еще использовать зависимости от кэша, например, если Ваши данные зависели от чего-то в файловой системе. Весь CacheItemPriority делает, предотвращают HttpRuntime. Кэш от интеллектуальной очистки объекта, когда это чувствует давление памяти и использует его Последний использованный алгоритм для чистки объектов, которые не видят много использования.

18
ответ дан ssmith 14 October 2019 в 08:32
поделиться
Другие вопросы по тегам:

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