Это хороший способ делать то, что я хочу (в PHP)? - PullRequest
2 голосов
/ 20 мая 2009

Я работаю над простым форумом для моего сайта. Я добавляю функцию, которая помечает непрочитанные сообщения + форумы с момента вашего последнего посещения.

Я по сути сохраняю дату последнего доступа к форуму с каждой учетной записью пользователя. Когда пользователь возвращается на сайт, запускается запрос для извлечения всех значений post_id и post_parent_forum, которые затем добавляются в массив, который хранится в переменной SESSION, ключом которого является post_id (который уникален) и значением быть идентификатором форума (который не будет уникальным, поскольку сообщения будут появляться на нескольких форумах).

В индексе форума я использую in_array () для каждого форума, чтобы увидеть, находится ли forum_id в массиве, если он есть, он будет помечен как «непрочитанный».

В списке потоков я использую array_key_exists (), чтобы увидеть, есть ли ключ для каждого идентификатора потока в массиве, если он есть, помечен как «непрочитанный».

Когда сообщение просматривается, элемент удаляется из массива с ключом, равным идентификатору потока.

Является ли этот метод разумным или я столкнусь с проблемами, если форум станет более популярным? Я обеспокоен выполнением 20 проверок array_key_exists () в каждом списке форумов. Это достаточно быстро?

На заметку ... могу ли я работать напрямую с сохраненным массивом SESSION или мне нужно присвоить его значение обычной переменной, удалить ключ, сбросить старый сеанс var и заново установить его с помощью обновленный массив?

Ответы [ 3 ]

1 голос
/ 20 мая 2009

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

in_array - это другое дело (поиск по всему массиву), но на самом деле - это все равно не должно быть проблемой. остерегайтесь преждевременной оптимизации!

можно ли работать напрямую с сохраненным массивом SESSION

да. $_SESSION - это (обычно) просто массив, который заполняется при вызове session_start() путем десериализации содержимого файлов сеанса. Когда сценарий завершается или вызывается session_write_close(), массив $ _SESSION возвращается в файл serialize(). на самом деле никакой магии.

если вы должны сделать это другой вопрос, в конце концов $_SESSION является глобальной переменной (ewwww).

0 голосов
/ 20 мая 2009

Моя практика гласит: не беспокойтесь о производительности хеш-таблиц, а думайте о проблемах, связанных с БД, потому что они являются самыми дорогими в ресурсах (особенно в подобных форумах проектах, которые полны текста). Я никогда не встречал вопросов, связанных с производительностью PHP. Проблемы с MySQL всегда возникали намного быстрее.

0 голосов
/ 20 мая 2009

Просто еще один маршрут, по которому вы можете идти ...

Иметь поле метки времени last_activity в пользовательской таблице и обновлять его каждый раз, когда пользователь загружает новую страницу.

Для каждого сообщения / форума есть поле last_updated timestamp.

Чтобы увидеть, является ли форум / сообщение "непрочитанным", вы можете просто сравнить временные метки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...