Я должен был сделать это некоторое время назад и использовал приведенный ниже код. Он подключается к оболочке. Боюсь, у меня больше нет полного скрипта. Если вы работаете в операционной системе unixish, вы можете использовать «tac», но, например, Команда Mac OSX tac не работает, используйте tail -r. Ниже приведен фрагмент кода, для которого вы находитесь, и соответственно корректирует команду
# We need a command to reverse the line order of the file. On Linux this
# is 'tac', on OSX it is 'tail -r'
# 'tac' is not supported on osx, 'tail -r' is not supported on linux.
if sys.platform == "darwin":
command += "|tail -r"
elif sys.platform == "linux2":
command += "|tac"
else:
raise EnvironmentError('Platform %s not supported' % sys.platform)
Существует несколько объемов, которые доступны любой части Вашего кода: Сессия, Клиент, Cookie, Приложение и Запрос. Некоторые нецелесообразны для использования определенными способами (т.е. использующий Запрос или Область действия приложения в Пользовательских Тегах или CFC's; это - связь , нарушает принципы инкапсуляции и считается плохой практикой), и у некоторых есть особое назначение: Cookie сохраняется на клиентской машине как физические cookie, и Сессия определила объем переменных, являются определенными для пользователя и истекают с сессией пользователя на веб-сайте.
, Если переменная крайне маловероятно изменится (постоянный, во всех отношениях) и может просто быть инициализирована на запуске приложения и никогда не писаться снова, обычно необходимо поместить его в Область действия приложения, потому что это сохраняет его между каждым пользователем и каждой сессией. Когда правильно реализовано это записано однажды и считано времена N.
А надлежащая реализация переменных Приложения в Application.cfm могла бы быть похожей на это:
<cfif not structKeyExists(application, "dsn")>
<cflock scope="application" type="exclusive" timeout="30">
<cfif not structKeyExists(application, "dsn")>
<cfset application.dsn = "MyDSN" />
<cfset foo = "bar" />
<cfset x = 5 />
</cfif>
</cflock>
</cfif>
Примечание, что существование переменной в области действия приложения проверяется прежде и после блокировки, так, чтобы, если два пользователя создают состояние состязания при запуске приложения, только один из них закончил тем, что установил переменные приложения.
преимущество этого подхода - то, что это не будет постоянно обновлять эти сохраненные переменные по каждому запросу, тратя впустую время пользователя и циклы обработки сервера. Компромисс - то, что это является немного подробным и сложным.
Это было значительно упрощено с добавлением Application.cfc. Теперь, можно указать, какие переменные создаются на приложении, запускаются и не должны волноваться о блокировке и проверке существование и весь тот забавный материал:
<cfcomponent>
<cfset this.name = "myApplicationName" />
<cffunction name="onApplicationStart" returnType="boolean" output="false">
<cfset application.dsn = "MyDSN" />
<cfset foo = "bar" />
<cfset x = 5 />
<cfreturn true />
</cffunction>
</cfcomponent>
Для получения дополнительной информации о Application.cfc включая все различные специальные доступные функции и каждая небольшая деталь о том, что и как использовать его, , я рекомендую, это сообщение на блоге .
Raymond Camden подводя итоги, запрашивает, чтобы объем был доступен везде в Вашем коде, но это не обязательно делает "правом" использовать его везде. Возможности состоят в том, что Ваш предшественник использовал его для повреждения инкапсуляции, и это может быть громоздким для рефакторинга. Можно быть лучшими от отъезда его как есть, но понимающий то, каким объемом является лучший инструмент для задания, определенно сделает будущий код лучше.
Это - очень субъективный вопрос, и некоторые даже утверждали бы, что никогда не "уместно" использовать объем запроса в современных приложениях ColdFusion.
С той правовой оговоркой из пути, давайте определим то, что объем запроса и где это было бы полезно.
объемом запроса является абсолютная глобальная область видимости в единственном запросе страницы ColdFusion. Это не общий объем, как приложение, сервер, клиент, и объемы сессии, таким образом блокируя не необходимы сделать это ориентированным на многопотоковое исполнение (если Вы не порождаете рабочие потоки от единственного запроса с помощью тега CF8 CFTHREAD). Как глобальная область видимости, это - очень удобный способ сохранить переменные через любой уровень в стопке запроса, не имея необходимость передавать их от родителя до вызывающей стороны. Это было очень распространенным способом сохранить переменные через вложенные или рекурсивные Пользовательские Теги в более старых приложениях CF.
Примечание, что, в то время как много приложений используют этот объем для хранения переменных прикладного уровня (параметры конфигурации, например), большое (и иногда тонкий) различие между объемом запроса и областью действия приложения - то, что значение той же ограниченной по объему запросом переменной может отличаться между отдельными запросами страницы.
я предположил бы, что Ваш предшественник использовал этот объем в качестве средства удобно установить переменные, которые должны были пережить переход между инкапсулированными или вложенными единицами кода, не имея необходимость раздавать их явно.
Хорошо, я просто хотел прокомментировать ваш код. Пожалуйста, простите меня, если я покажусь сумасшедшим. Но вы уже подтвердили, что structKeyExists в начале. Поскольку вы знаете, что это будет правдой, нет смысла проводить еще одну проверку. Так что моя версия была бы такой ... Но это только я.
<cfif not structKeyExists(application, "dsn")>
<cflock scope="application" type="exclusive" timeout="30">
<cfset application.dsn = "MyDSN" />
<cfset foo = "bar" />
<cfset x = 5 />
</cflock>
</cfif>
Хорошо.