Кэширование переменных в $ _SESSION переменная?

Я получил следующее решение. Я не нашел способа загрузить основной поток необработанных файлов, но мне удалось загрузить его в Coroutine и выполнить дальнейшие (также тяжелые) операции с этим файлом в фоновом потоке. Я сделал статический метод, подобный этому:

public static void ReadAllBytesInCoroutine(MonoBehaviour context, string filePath, Action<ReadBytesInCoroutineResult> onComplete)
{
    context.StartCoroutine(ReadFileBytesAndTakeAction(filePath, onComplete));
}

private static IEnumerator ReadFileBytesAndTakeAction(string filePath, Action<ReadBytesInCoroutineResult> followingAction)
{
    WWW reader = null;

    try
    {
        reader = new WWW(filePath);
    }
    catch(Exception exception)
    {
        followingAction.Invoke(ReadBytesInCoroutineResult.Failure(exception));
    }

    while (reader != null && !reader.isDone)
    {
        yield return null;
    }
    followingAction.Invoke(ReadBytesInCoroutineResult.Success(reader.bytes));
}

ReadBytesInCoroutineResult - это мой простой, настраиваемый класс данных:

public class ReadBytesInCoroutineResult
{
    public readonly bool successful;
    public readonly byte[] data;
    public readonly Exception reason;

    private ReadBytesInCoroutineResult(bool successful, byte[] data, Exception reason)
    {
        this.successful = successful;
        this.data = data;
        this.reason = reason;
    }

    public static ReadBytesInCoroutineResult Success(byte[] data)
    {
        return new ReadBytesInCoroutineResult(true, data, null);
    }

    public static ReadBytesInCoroutineResult Failure(Exception reason)
    {
        return new ReadBytesInCoroutineResult(true, null, reason);
    }

}

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

    ResourcesUtils.ReadAllBytesInCoroutine(monoBehavior, filePath, (bytes) => {

        //here I run an async method which takes bytes as parameter

    });
10
задан ScottMcGready 14 April 2014 в 02:01
поделиться

3 ответа

Это было бы соответствующим использованием механизма сессии, пока Вы имеете это в виду:

  • Сессия не сохраняется для неопределенного количества времени.
  • При получении по запросу от сессии удостоверьтесь, что Вы на самом деле получили результат (ASP.NET возвратит ПУСТОЙ УКАЗАТЕЛЬ, если Сессия истекла/очистила),
  • Перезапуски сервера могут вытереть кэш сессии.
  • Сделайте это для удобства, не производительности. Для высокоэффективного кэширования выберите соответствующий механизм (т.е. memcached)

Хороший шаблон использования был бы похож на это (cookie эфира или сессия):

  • Пользователь входит в систему
  • Предпочтения хранилища (цвет фона, продержитесь, 10 записей смотрели на, категории) на сессии/cookie.
  • При рендеринге страницы обратитесь к значениям Сессии/Cookie (гарантирующий, что они - допустимые значения и не пустые).

Вещи не сделать в cookie

  • Не храните ничего чувствительного (используйте сессию).
  • Значение cookie не должно предоставлять/отклонять Вам доступ ни к чему (используйте сессию).
  • Ошибки прерывания, примите флаги, и строки не могут быть тем, что Вы ожидаете, может отсутствовать, может быть изменен в пути.

Я уверен, что существуют другие вещи рассмотреть также, но это просто первое, что пришло на ум здесь.

12
ответ дан 3 December 2019 в 20:44
поделиться

Это могло работать хорошо на относительно небольшие объемы данных, но необходимо будет некоторые принять вещи во внимание:

  1. $ _SESSION хранится где-нибудь между запросами, файлом на диске или базе данных или чем-то еще в зависимости от того, что Вы принимаете решение использовать (значение по умолчанию для файла)
  2. $ _SESSION локален для отдельного пользователя на единственной машине.
  3. сессии имеют TTL (время жизни), они dissapear после количества времени набора (которым Вы управляете),
  4. При определенных обстоятельствах могут заблокироваться сессии (редко проблема, но я столкнулся с нею передающий флэш-память потоком), Если к данным, которые Вы означаете кэшировать, должны получить доступ многочисленные пользователи, Вы - быстро более обеспеченное кэширование ее отдельно.
4
ответ дан 3 December 2019 в 20:44
поделиться

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

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

2
ответ дан 3 December 2019 в 20:44
поделиться
Другие вопросы по тегам:

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