Я не уверен, что вы многое можете сделать. Возможно, memcached
может помочь, но я не использовал его (хотя, насколько я слышал, для этого он и используется).
Вы можете сохранить массив в файле, хотя, насколько я знаю, это именно то, что делают сессии.
Вы также можете попробовать использовать разделяемую память для сохранения пользовательских данных в памяти между запусками скриптов.
Вам действительно нужен весь список разрешений пользователя в одном массиве? То есть вы всегда отображаете тысячи файлов пользователю? Если так, то почему? Можно ли будет перепроектировать систему, используя AJAX, чтобы лениво получать только часть файлов?
ОБНОВЛЕНИЕ: Другая идея.
Вы также можете предварительно рассчитать разрешения пользователя для каждого файла и сохранить их в базе данных. Таблица может называться FilesPermittedPerUser
и иметь первичный ключ из двух столбцов userID / fileID
. Это создаст индекс, который отсортирован сначала по userID
, а затем по fileID
. Ключ из двух столбцов также обеспечит уникальность записей.
Поскольку он будет проиндексирован пользователем, вы можете просто ORDER BY userID
и LIMIT 10, 10
перечислить только файлы 10-20. Извлечение только частей списка через AJAX означало бы, что вы никогда не вызовете ужасную нагрузку на память, которую в настоящее время вызывают ваши скрипты.
Требуется только, чтобы при каждом обновлении прав доступа к файлу (например, при создании файла, удалении файла, изменении групповых прав, изменении группового членства пользователя, групповом членстве файла ...) вы придется обновить таблицу. Я подозреваю, что это не должно быть слишком сложно. Просто убедитесь, что вы выполняете обновление кэша в транзакции, чтобы сохранить атомарность операции.
Вы также можете организовать файловую систему по папкам. Нет никакого смысла просто бросать тонны файлов пользователям и постоянно поддерживать их. Попробуйте скинуть 10.000 файлов в Explorer / Finder / Nautilus и посмотрите, что произойдет, когда вы откроете эту папку. Ничего хорошего, и они сохраняют память - а с PHP вы этого не делаете.
Заключительная идея (хотя вам, вероятно, не нужно переходить к этим крайностям): переписать API файловой системы в нечто, отличное от PHP, и сохранить данные о правах доступа. Используйте PHP только для пересылки запросов на этот пользовательский сервер, который работает на другом сервере.