Будет ли установка времени изменения файла в будущем с помощью touch () работать по всей плате?

#php

#php

Вопрос:

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

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

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

Недавно я столкнулся с функцией PHP touch () , которая позволяет мне устанавливать время последнего изменения файла на произвольное значение. Это звучит потрясающе, потому что это позволило бы мне (вместо вышеупомянутого метода определения истечения срока действия кэша) установить время последнего изменения файла на какой-то момент в будущем. Затем я могу проверить это время, чтобы узнать, истек ли срок действия кэша.

Я действительно ОЧЕНЬ хочу иметь возможность использовать это. Однако мое приложение распространяется, и, поскольку эта функция работает со средой, я не уверен, следует ли мне доверять этой функции, чтобы она работала должным образом по всей плате в разных системах. У кого-нибудь есть какая-либо информация или ресурсы о совместимости этой функции?

Комментарии:

1. интересная проблема! но зачем вам нужно устанавливать время последнего изменения на некоторое время в будущем? почему не будет установлено значение «сейчас», а затем сравнить время последнего изменения со временем в прошлом (точнее, теперь минус срок службы кэша)?

2. @davogotland Я бы с удовольствием. Проблема в том, что я не буду знать, какова продолжительность истечения срока действия во время получения кэша, только во время настройки кэша. Это делается для того, чтобы сохранить тот же интерфейс, что и у других драйверов, а также по нескольким причинам удобства использования.

3. @davogotland Я изменил вопрос, чтобы сделать более понятным мой текущий метод, который фактически добавляет продолжительность истечения срока действия к метке времени перед сохранением ее внутри файла.

Ответ №1:

Самая большая проблема, с которой вы столкнетесь здесь, — это разрешения. Если пользователь вашего php-скрипта (фактически его apache) создаст файл, он будет владеть файлом и сможет вносить изменения по своему усмотрению. Это будет работать только при условии, что пользователь apache имеет разрешения на создание этого файла внутри папки (проверьте разрешения каталога).

Вы также можете создать файл самостоятельно и назначить владельцем пользователя, от имени которого apache запускает php-скрипты (можно найти в файле httpd.conf)

http://us3.php.net/manual/en/function .touch.php — документация для touch

http://drupal.org/node/34023 —описывает точную ситуацию, с которой вы столкнулись, и подробнее описывает разрешения.

http://www.faqs.org/docs/securing/chap29sec245.html — рассказывает об изменении файла httpd.conf

Комментарии:

1. @jacx поскольку php создает файлы кэша для начала, я не предвижу проблем с разрешениями.

2. @dqhendricks вы столкнетесь с проблемами, если у вас не установлены правильные разрешения для папки, в которой вы пытаетесь создать. Я еще немного покопался и обнаружил, что touch поддерживается в Windows, Unix и Mac оооочень долго, пока ваши разрешения установлены, вы должны быть в порядке, чтобы сделать это.