Pull to refresh

Comments 16

На превью статьи не хватает двух слонов :)

Это just for fun или рабочая задача? Для каких целей используется очистка файлового кеша с помощю SQL?
Готов предположить, что в БД есть логика (триггеры, процедуры), и вот там надо сбрасывать кеш. Была подобная ситуация, только с memcached из Oracle PL/SQL. Вполне себе реальная задача, а не just for fun.

Косяк, конечно, в том, что создатель кеша (PHP-что-то-там) и инвалидатор кеша (PostgreSQL) находятся в разных слоях архитектуры, и тем размазывают ответственность за кеш (ну или данные — как посмотреть). Но это исправлять дольше и дороже.
Я тоже не могу себе представить, зачем такое может понадобится.
Могу предложить лишь альтернативный вариант, не такой сложный в поддержке: postgres ставит у себя флаг того, что надо сбросить кеш (в крайнем случае в однострочной таблице). Это делается триггером либо через ту же процедуру clear_cache. В php приложении поднимается демон и периодически (пусть в 30 секунд) проверяется значение этого флага. Если флаг взведен — очистить кеш, сбросить флаг.
Да, я правильно понимаю, что setuid(0) — это переключение текущего юзера на рут?
А если вдруг команда окажется более 254 символов?

Я вижу огромное количество мест в текущем решении, где можно себе в будущем выстрелить в ногу. Так по-моему делать точно нельзя.
snprintf конечно же! Ох… серьезно напутал.
Мсье знает толк в извращениях (с)

* Запустить /bin/rm напрямую?
* Сделать кэш доступным для удаления из-под пользователя БД? Группы, права и прочее.
Более простым, но менее интересным, будет добавление postgres в группу, которая имеет право на запись в директорию (т.е. может удалять файлы).
А это есть где-то в продакшене?
Хороший человек ведь всегда может сделать ./sysutils-core «clear_cache;rm -rf /»
В скрипте есть проверка на те команды (функции), которые может вызвать пользователь:
if function_exists "$1" "${FUNCS[@]}"; then
Добавил более безопасный вариант (через execl).
Sign up to leave a comment.

Articles