Перегрузка сессии - каково “слишком много данных”, хранивших на сессии в PHP?

Я использую массив сессии для кэширования блоков информации, полученной от дб:

$result = mysql_query('select * from table');
array_push($_SESSION['data'],new Data(mysql_fetch_assoc($result)));

Мой вопрос, там limit/a большой объем информации, который может/должен быть розданным на сессии? Опрометчиво или значительно препятствие производительности, чтобы сделать это?

7
задан Some1PHP 6 February 2010 в 18:00
поделиться

5 ответов

По умолчанию данные $ _SESSION хранятся на диске в каталоге / tmp вашего сервера. Пока у вас есть достаточно места и вы не достигли предела памяти PHP, все в порядке.

Однако, если вы пытаетесь кэшировать запрос, который является ЖЕСТНЫМ для большего числа пользователей, вы можете захотеть использовать что-то вроде APC или memcache, не привязанного к отдельному пользователю. В противном случае вы, по сути, собираетесь кэшировать один и тот же результат 1x для каждого пользователя, а не использовать кеш для всех пользователей.

6
ответ дан 7 December 2019 в 07:45
поделиться

Поскольку данные сессии хранятся в файле (или записи базы данных) на вашем сервере, не имеет значения, сколько данных вы в нем храните. Я бы просто не советовал хранить огромные объекты.

Вместо этого вы можете посмотреть на APC или memcached для кэширования результатов, так как это не кэш для каждого пользователя, и он использует память вместо файлов.

0
ответ дан 7 December 2019 в 07:45
поделиться

Если вам не нужна другая переменная, я думаю, что ответы выше лучше, но один из моих любимых маленьких синтаксических трюков заключается в том, чтобы воспользоваться тем фактом, что присвоение является lvalue, так что с небольшой перегруппировкой скобок:

(my $string = $webpage) =~ s/^$domain//g;

вы можете сделать копию и изменить ее в одном утверждении.

Также, наряду с другими вещами, которые немного странно в этом коде, нет много точки к /g на образец, начиная с ^ . Он не может совпадать более одного раза.

-121--4571431-

В стандарте C отрицательный модуль не определен, и многие компиляторы C дадут вам то, что дает Java. В python, однако, вы всегда получите положительное число, которое часто более полезно, потому что это означает, что вы можете сделать сложение по модулю, и вычитание. Если отрицательное значение по модулю даст отрицательное значение, оно не будет работать должным образом.

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

-121--1862570-

Ммм, сложно. Думаю, вы могли бы сохранить его на сеансе. Реальный вопрос: хотите ли вы, чтобы вся эта информация сериализовалась и несериализовалась каждый раз, когда клиент делает запрос? Я думаю, что было бы нормально сохранить его там, если вы будете использовать всю эту информацию на каждой странице вашего веб-сайта, но это невозможно. Было бы лучше сохранить эту информацию в каталоге, таком как /temptables/sometable/, и каждый файл будет иметь имя сеанса. Вы можете использовать session _ id , чтобы получить его, и сохранить и загрузить информацию на страницах, которые вы должны использовать с:

$info = unserialize(file_get_contents('/templatebles/sometable/'.session_id().'.ser'));

и сохранить с:

file_put_contents('/temptables/sometable/'.session_id().'.ser'), serialize($info));

Но вам нужно cron задание, чтобы очистить этот каталог для старого файла. Можно получить сеанс из имени файла и запросить некоторую переменную, например, «itsalive», используя session _ start () или сделав что-то вроде file _ exists (session_save_path (). '/sess _ '. $ session _ name) , чтобы проверить, следует ли удалить временный файл.

0
ответ дан 7 December 2019 в 07:45
поделиться

По умолчанию сеанс сериализуется и записывается на диск, поэтому в зависимости от размера и количества пользователей работа может замедлиться. Однако обе вещи можно изменить (все подробности см. В руководстве по сеансу http://php.net/session ), например, используя memcache для хранения данных в памяти. Лучше всего попробовать его в среде, максимально похожей на рабочую систему, и проверить полученную нагрузку и пропускную способность.

0
ответ дан 7 December 2019 в 07:45
поделиться

Проверьте, Utf8Checker это простой класс, который делает именно это в чистом управляемом коде.

Примечание: как уже указывалось, "определение кодирования" имеет смысл только для байтовых потоков. Если у вас есть строка, она уже закодирована от того, кто уже знал или угадал кодировку, чтобы получить строку в первую очередь.

-121--689798-

я не пробовал/использовал это, но идея для подхода:

остановить/прервать перерисовку холста при КАЖДОМ событии прокрутки ждать 1s, а затем начать перерисовку холста при КАЖДОЙ прокрутке.

это приведет к выполнению перерисовки только в конце прокрутки, так как только последняя прокрутка фактически будет непрерывной для завершения перерисовки.

надеюсь, что эта идея поможет вам:)

-121--915225-

Я думаю, что ответ будет зависеть от того, где вы храните свои данные и как быстро вы можете перенести их туда.

Если объем данных составляет 44 МБ, и вы находитесь в 1000base-T сети, можно ожидать, что на фактическую передачу THERE потребуется 1 секунда. И 1 секунду перевести обратно..

Если используется локальная память, то компьютер имеет ограниченный объем памяти.

Если вы используете диск, то у вас есть время загрузки/сохранения (диск медленный).

Но имейте в виду, что PHP имеет ограниченный объем памяти, который позволяет использовать скрипт. Я думаю, что установка по умолчанию составляет 8 МБ.

Если вы говорите о больших блоках данных, вы можете рассмотреть Redis , Tokyo Cabinet или другие хранилища ключей/ценностей. Или даже внутренний интерфейс для управления данными/кэшированием, не передавая их через PHP.

1
ответ дан 7 December 2019 в 07:45
поделиться
Другие вопросы по тегам:

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