Verification: a143cc29221c9be0

Php class variables undefined variable

Php class variables undefined variable

Содержание

# Правило переопределения настроек, определенных в properties файлах

Используются базовые настройки из файла file.properties, включенные в дистрибутив системы (как правило размещенные в одном из jar внутри runawfe.ear), перезаписываемые из более приоритетного файла wfe.custom.file.properties по совпадающим ключам.

Пример файла, определяющего тип соединения с MSSQL Server wfe.custom.database.properties:

hibernate.connection.datasource=java:/mssqlds
hibernate.dialect=ru.runa.wfe.commons.hibernate.SqlServerUnicodeDialect

# Примеры переопределения настроек, определенных в properties файлах

Пример включения возможности изменения значений переменных экземпляра БП.

За эту возможность отвечает настройка executionServiceAPI.updateVariables.enabled, которая по умолчанию имеет значение false 4.1.2+ т.е. выключена. Включить данную возможность можно как через веб интерфейс (Меню "Настройки", раздел "Основные настройки", параметр "executionServiceAPI.updateVariables.enabled") так и с помощью правила переопределения настроек, определенных в properties файлах. Рассмотрим подробно второй вариант.

Данный параметр определен в основных настройках system.properties, поэтому требуется переопределить его в файле system.properties. Согласно правилу переопределения, необходимо создать файл wfe.custom.system.properties в каталоге ..\standalone\wfe.custom (если директория wfe.custom не существует, то создать). Например, для Windows версии RunaWFE, файл wfe.custom.system.properties должен быть помещен в C:\Program Files\RunaWFE\Simulation\standalone\wfe.custom\


В файл необходимо добавить следующую строку:

executionServiceAPI.updateVariables.enabled = true


Замечание. Переопределенные настройки применяются только после перезапуска сервера.

Если все было выполнено верно, то в свойствах экземпляра процесса, в секции "Переменные процесса" должна появиться ссылка "Изменить значение", как показано на следующем рисунке.


UpdateVariabless.png


По ссылке будет открыт интерфейс для изменения значения переменных экземпляра БП

UpdateVariabless2.png

Пример включения административного назначения роли.

Данная возможность позволяет разрешить изменение исполнителя в экземпляре процесса, параметр отвечающий за это - process.swimlane.assignment.enabled, расположен в web.properties и имеет по умолчанию значение false 4.3.0+

Согласно правилу переопределения, необходимо создать файл wfe.custom.web.properties в каталоге ..\standalone\wfe.custom (если директория wfe.custom не существует, то создать). Например, для Windows версии RunaWFE, файл wfe.custom.web.properties должен быть помещен в C:\Program Files\RunaWFE\Simulation\standalone\wfe.custom\

Добавьте в файл строку

process.swimlane.assignment.enabled = true


Замечание. Переопределенные настройки применяются только после перезапуска сервера.

Если все было выполнено верно, то в свойствах экземпляра процесса, в секции "Роли процесса" появится ссылка "Изменить исполнителя"

SwimlaneAssign1.png


По ссылке будет открыт интерфейс для изменения исполнителя

SwimlaneAssign2.png

# Правило расширения настроек, определенных в xml файлах

Для большинства таких настроек действует правило: используются базовые настройки из файла file.xml, включенные в дистрибутив системы (как правило размещенные в одном из jar внутри runawfe.ear) + настройки из файла wfe.custom.file.xml в таком же формате.

Пример файла, определяющего новый валидатор wfe.custom.validators.xml:

# Расширение контекста Spring

Cоздайте файл wfe.custom.system.context.xml. Это позволит переопределить существующие бины по идентификатору или определить новые.

Пример файла для переопределения логики инициализации, класса-реализации бизнес-календаря:

Пример файла для переопределения логики инициализации и расширения DAO-уровня:

ru.runa.wferu.runa.rkdemo.dao

# Режим разработки

При установке в исполняемом файле (bat, sh) системной переменной devmode будет включен режим разработки, см. SystemProperties.isDevMode()

# Режим обратной совместимости

При установке в исполняемом файле (bat, sh) системной переменной v3compatibility будет включен режим совместимости по исполнению процессов с 3-й версией, см. SystemProperties.isV3CompatibilityMode()

# Основные настройки (system.properties)

название описание значение по умолчанию
version версия системы версия системы из pom.xml, проставляется при сборке
default.administrator.name логин администратора, создаваемый при первом запуске системы Administrator
default.administrator.password пароль администратора, устанавливаемый при первом запуске системы wf
default.administrators.group.name название группы администраторов, создаваемая при первом запуске системы Administrators
default.bots.group.name название группы ботов, создаваемая при первом запуске системы Bots
strong.passwords.regexp для усиления защиты системы можно наложить ограничения на пароли пользователей системы. Если определен этот параметр, то все заводимые пароли пользователей должны соответствовать регулярному выражению. Если пароль не отвечает требованиям безопасности, то смена пароля произведена не будет. отсутствует
escalation.enabled эскалация заданий включена? true
escalation.default.hierarchy.loader

(до версии 4.1.1 escalation.default.orgFunction)

орг. функция или отношение, для определения иерархии эскалации заданий ru.runa.wfe.extension.orgfunction.TestOrgFunction (фиктивная орг. функция)

Значением может быть либо полное название класса орг. функции, либо отношение в формате @relationName. Обратное отношение задаётся в формате @!relationName.

task.default.deadline время исполнения задания по умолчанию (если не установлено явно в Среде разработки) 2 hours
task.almostDeadlinePercents процент истечения времени исполнения после которого цвет задания в списке меняется на более приоритетный 90
task.delegation.enabled Включить делегирование задач true (переехала из web.properties 4.4.1+)
authentication.domain.name имя домена TEST
date.format.pattern формат даты в системе (также используется при форматировании даты со временем) ДД.ММ.ГГГГ
executionServiceAPI.updateVariables.enabled разрешить выполнение метода ru.runa.wfe.service.impl.ExecutionServiceBean.updateVariables(User, Long, Map) false 4.1.2+, true 4.1.2-, переехала в web.properties 4.4.0+
scriptingServiceAPI.executeGroovyScript.enabled разрешить выполнение метода ru.runa.wfe.service.ScriptingService.executeGroovyScript(User, String) false
token.maximum.depth максимально разрешенная вложенность токенов, для предотвращения логических циклических ошибок в параллельном шлюзе 100
token.maximum.length 4.4.1+ максимально разрешенная длина (количество переходов) токенов, для предотвращения логических циклических ошибок -1
file.variable.local.storage.enabled разрешить использование локального хранилища в файловой системе для больших файлов true
file.variable.local.storage.path путь к директории-хранилищу директория wfe.filedata внутри сервера
file.variable.local.storage.enableforfilesgreaterthan если размер файловой переменной превышает установленный - то файл сохраняется в файловой системе, а не в БД 100000
string.variable.length значение длины строковой переменной, изменять не рекомендуется! 1024
ear.filename изменять в случае сборки собственного EAR runawfe.ear
undefined.variables.allowed разрешить создание в процессе переменных, не определенных в Среде разработки? false
strong.variables.format.enabled режим строгой типизации. Требовать соответствие типа определенному в Среде разработки при установке значений переменных true
variables.autocast.enabled выполнять приведение типа к определенному в Среде разработки в случае несоответствия типа значения переменной в режиме строгой типизации true
timertask.period.millis.job.execution 4.0.6+ период обнаружения просроченных таймеров всех процессов, в миллисекундах 60000
timertask.start.millis.job.execution 4.0.6+ задержка перед первым выполнением просроченных таймеров всех процессов после запуска системы, в миллисекундах 60000
job.executor.batch.size 4.3.3+ количество обрабатываемых просроченных таймеров в одной транзакции 50
timertask.period.millis.unassigned.tasks.execution 4.0.6+ период между обнаружением не назначенных заданий (и попыткой их назначения), в миллисекундах 60000 4.2.0+ (600000 4.2.0-)
timertask.start.millis.unassigned.tasks.execution 4.0.6+ задержка перед первым обнаружением не назначенных заданий (и попыткой их назначения) после запуска системы, в миллисекундах 60000
timertask.period.millis.remove.temp.groups 4.3.0+ период между очистками временных групп, в миллисекундах 10800000
timertask.start.millis.remove.temp.groups 4.3.0+ задержка перед первым выполнением очистки временных групп после запуска системы, в миллисекундах 600000
receive.message.handle.in.sequence.enabled только в 4.1.0, см. описание true
trusted.authentication.enabled 4.2.0+ Разрешена ли доверенная аутентификация с помощью сервисного аккаунта (AuthenticationService.authenticateByTrsustedPrincipal(User, String)) false
upgrade.process.to.definition.version.enabled 4.3.0+ Разрешено ли обновление версии исполняющегося процесса на другое по версии (полезно для исправления блокирующих ошибок, может иметь непредсказуемые ошибки в случае если определение процесса сильно отличается от текущего) true (upgrade.process.to.next.definition.version.enabled = false 4.3.0-)
process.admin.groups 4.2.2+ Административное выполнение заданий. Задаётся список названий административных групп, пользователи из которых будут видеть в своём списке заданий чужие задачи. При этом если описание группы не задано, то входящий в неё пользовать видит все задания в системе. Если в описании задать номера БП через запятую - то увидит задания только из этих БП. Он может их выполнить, в логе выполнения БП будет соответствующая запись. В списке выделяются цветом аналогично заданиям, полученным по замещению. Фильтр на такие задания сейчас не распространяется.
process.end.handlers 4.2.2+ Список классов обработчиков, реализующих ProcessEndHandler, которые будут вызваны по завершению БП
process.execution.listeners 4.3.0+ Список классов обработчиков, реализующих IProcessExecutionListener, которые будут вызваны во время выполнения БП
base.process.id.variable.name 4.2.2+ Название переменной БП, которая хранит ID базового БП, из которого будут грузиться переменные если они не заданы в текущем БП. Это позволяет не дублировать значения переменных в некоторых случаях при использовании подпроцессов. Переменные должны быть определены в обоих определениях БП.
base.process.id.variable.read.all 4.3.0+ Доступ на чтение в режиме "ID базового БП" ко всем переменным. true
base.process.id.mapping.variable.prefix Только в 4.3.0, не вошло в релиз. Определяло соответсвие переменных для режима "ID базового БП"
temporary.groups.set.permissions 4.3.0+ Выдавать ли полномочия на чтение создаваемой временной группе всем её участникам. false (до версии 4.3.0 было поведение, аналогичное значению true)
temporary.groups.delete.on.process.end 4.3.0+ Удалять временные группы по завершению БП. Если не удалять - то это будет сделано (по умолчанию включено) с помощью периодической задачи чистки неиспользуемых временных групп. false
temporary.groups.delete.on.task.end 4.3.0+ Удалять временную группу, на которую назначено задание, при его завершении. Если не удалять - то это будет сделано (по умолчанию включено) с помощью периодической задачи чистки неиспользуемых временных групп. false
freemarker.static.class.names 4.3.0+ Список классов, которые доступны по механизму BeansWrapper.getStaticModels() в шаблонах freemarker не задано
process.suspension.enabled 4.3.0+ Разрешить ручную приостановку БП администратором системы. true
process.execution.node.async.default 4.3.0+ По умолчанию использовать новую транзакцию для выполнения узлов, подробнее true
process.execution.node.async.NodeType 4.3.0+ Использовать новую транзакцию для выполнения узлов определённого типа по умолчанию, подробнее не заданы
process.swimlane.auto.initialization.enabled 4.3.0+ Разрешить авто-инициализацию роли при доступе к ней как к переменной. false
check.process.start.permissions 4.3.0+ Проверять права на запуск БП. Используется только в случае интеграции со сторонней подсистемой полномочий. true
definition.comments.empty.allowed 4.3.0+ Разрешить загрузку определения процесса, в котором нет новых комментариев. true
definition.comments.collisions.allowed 4.3.0+ Разрешить загрузку определения процесса, в котором отсутствуют некоторые комментарии из прежней версии определения. false
process.execution.message.predefined.selector.enabled 4.3.0+ Использовать ли для обработки узлов-сигналов предвычисленное значение селектора? Использование улучшает производительность обработки сигналов, но накладывает ограничение: значение селектора вычисляется на момент прихода точки управления в узел-приёмник и не изменяется при изменении значения участвующих в нём переменных. true
process.execution.message.predefined.selector.only.strict.compliance.handling 4.3.0+ В случае использования предвычисленного значения селектора таблицы маршрутизации: использовать только прямое соответствие? В случае прямого соответствия таблицы маршрутизации узлов отправителя и получателя должны полностью совпадать (что накладывает функциональные ограничения на работу сигналов), но получается выигрыш по производительности. false
variables.invalid.default.values.allowed 4.4.0+ Допускать загрузку БП в систему, имеющих некорректные значения переменных по умолчанию. false (true - до версии 4.3.0 и для БП, загруженных до даты, см. след. настройку)
variables.invalid.default.values.allowed.before 4.4.0+ Дата, начиная с которой действует настройка variables.invalid.default.values.allowed. Использовать стоит только для обратной совместимости ранее загруженных БП. 01.01.1970

# Управление полями представлений (class.presentation.properties)

Поля представлений, используемых при отображении списка объектов настраиваются и могут находится в 3 состояниях: ENABLED, DISABLED и HIDDEN. По умолчанию все поля находятся в состоянии ENABLED.

В состоянии ENABLED поле представления отображается в таблице при раскрытии представления. Фильтрация, сортировка и группировка по полю доступны для изменения пользователем и имеют ожидаемый эффект.

В состоянии HIDDEN поле представления не отображается в таблице при раскрытии представления. Фильтрация, сортировка и группировка по полю не доступны для изменения пользователем но имеют эффект в системе. Таким образом, если в поле на момент перевода в состояние HIDDEN установлена фильтрация, то фильтрация по полю продолжит применяться при отображении списка объектов. Поля в состоянии HIDDEN наиболее разумно использовать в соединении с автоматическим проставлением свойств поля для установления одинакового вида представления у всех пользователей. Если поле необходимо только убрать из отображения, что бы оно не влияло на систему, то используйте состояние DISABLED.

В состоянии DISABLED поле представления не отображается в таблице при раскрытии представления. Фильтрация, сортировка и группировка по полю не доступны для изменения пользователем и не имеют никакого эффекта в системе. Таким образом, если в поле на момент перевода в состояние DISABLED установлена фильтрация, то фильтрация по полю не будет применяться при отображении списка объектов.

В конфигурационном файле уже прописаны по умолчанию все поля, которые могут быть настроены в системе, и установлены в состояние ENABLED.

# Настройка веб-интерфейса (web.properties)

название описание значение по умолчанию
group.subprocess.enabled доступна ли группировка по подпроцессам в фильтре? true
task.form.autoShowNext автоматически показывать форму следующего задания (в том же токене) false
task.form.highlightRequiredFields обозначать обязательные поля на форме задания true
task.form.ajaxFileInputEnabled использовать в качестве элемента загрузки файла (обеспечивает сохранение загруженного файла при неуспешной проверке данных и возможность очистки файла) не стандартный элемент ввода (используется jquery file upload). Поддержка браузерами: IE8+, Firefox, Chrome true
task.form.external.js.libs 4.2.0+ использовать внешние библиотеки javascript в формах заданий (значения разделяются точкой с запятой) отсутствует
view.logs.limit.lines.count максимальное количество отображаемых строк лога 10000
view.logs.timeout.autoreload.seconds таймаут перезагрузки лога на странице просмотра логов 15
process.graph.autoRefreshInterval.seconds таймаут для авто-перезагрузки графа процесса 15
process.showGraphMode реализовано два режима просмотра:

1) false. Граф и свойства бизнес-процесса расположены на одной странице. 2) true. Граф и свойства бизнес-процесса разнесены на две разные страницы и переход между ними осуществляется по ссылке в правом верхнем углу страницы.

false
process.variables.displayJavaType отображать java-тип переменной в списке переменных процесса false
ntlm.enabled разрешить аутентификацию по NTLM в вебе? false
ntlm.domain название домена MYDOMAIN
confirmation.* требовать ли подтверждения пользовательских действий? по контексту
menu.additional_links класс-провайдер дополнительных ссылок, см. ru.runa.common.WebResources.getAdditionalLinks() отсутствует
process.definition.ajax.bulk.deployment.enabled 4.2.0+ множественная загрузка определений процессов true
process.removal.enabled 4.2.0+ возможность удаления остановленного процесса администратором false
task.delegation.enabled 4.2.0+ включить делегирование задач true (false 4.3.0-), переехала в system.properties 4.4.1+
process.swimlane.assignment.enabled 4.3.0+ включить административное назначение роли false 4.4.0-, true 4.4.0+
process.variable.assignment.enabled 4.4.0+ включить административное редактирование переменных true
process.task.filters.enabled 4.3.0+ включить использование фильтров по атрибутам задач в списке запущенных процессов false
import.export.enabled 4.3.0+ включить импорт/экспорт данных через файл true

# Настройка работы с приложениями Office (office.properties)

название описание значение по умолчанию
docx.placeholder.start начало управляющей последовательности символов 4.1.0-

${4.1.0+

docx.placeholder.end окончание управляющей последовательности символов >4.1.0-

}4.1.0+

docx.element.start символ указания начала элемента контейнера4.3.0- [
docx.element.end символ указания окончания элемента контейнера4.3.0- ]
docx.placeholder.vmerge символ для объединения ячейки таблицы по вертикали4.4.0+ -||-

# Настройка графа процесса (graph.properties)

название описание значение по умолчанию
edgingOnly рисовать только рамки поверх скриншота из Среды разработки (иначе - полная генерация картинки) true
backgroundColor цвет фона 0xF0FFFF
figureBackgroundColor цвет фона элемента 0x009900
activeFigureBackgroundColor цвет фона активного элемента 0xFFFF66
baseColor цвет рисования элементов 0x000000
textColor цвет текста 0x000000
transitionColor цвет рисования переходов 0xCCCCCC
highlightColor цвет рисования задействованных элементов и переходов 0x009900
alarmColor цвет просроченных заданий 0xFF3333
lightAlarmColor цвет заданий, почти просроченных 0x996633
fontSize размер шрифта (только в режиме полной отрисовки) 9
fontFamily шрифт (только в режиме полной отрисовки) Verdana
bpmn.showSwimlane рисовать название ролей на графе (только в режиме полной отрисовки) true
logs.enabled показывать историю выполнения процесса на графе true

# Настройки бизнес-календаря (business.calendar.properties)

См. статью о бизнес-календаре

# Настройки кеширования (cache.properties)

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

По умолчанию включен режим работы smart. Он заключается в том что при изменении объекта пересчитывается только затрагиваемая часть кеша.

Кеширование не может быть отключено полностью.

название описание значение по умолчанию
smart_cache включен режим работы smart true

# Настройки бот станции (botstation.properties)

название описание значение по умолчанию
botstation.invocation.period.seconds при включенной периодической активации бот станции таймаут между работой ботов, в секундах 300 (3 4.3.1-)
botstation.system.username логин пользователя с правами на работу с бот станцией Administrator
botstation.system.password пароль пользователя с правами на работу с бот станцией wf
thread.pool.size количество потоков, в которых работает бот станция 1
taskhandler.jar.names поиск обработчиков ботов для списка в веб-интерфейсе осуществляется по этим библиотекам wfe-bots-*.jar;*wfe-core-*.jar;*wfe-office-*.jar
bot.logger.class дополнительное логирование: класс, реализующий ru.runa.wf.logic.bot.BotLogger отсутствует
botstations.autostart.enabled 4.2.0+ автоматический запуск периодического выполнения всех бот станций при запуске системы false (true 4.3.1-)
botstation.failedExecutionInitialDelaySeconds 4.2.0+ начальное значение задержки после неудачного выполнения задачи бота (следующее удвоится) (в секундах) 30
botstation.failedExecutionMaxDelaySeconds 4.2.0+ максимальное значение задержки после неудачного выполнения задачи бота (в секундах) 7200
botstation.stuck.timeout.minutes 4.3.0+ таймаут, используемый для обнаружения зависших заданий ботов и аварийного их завершения (в минутах) 5

# Настройки соединения по Java API с EJB (ejb.properties)

Если вы используете слой делегатов в wfe-service.jar, то необходимо настроить соединение с EJB.

название описание значение по умолчанию
ejb.type тип соединения. local для использования локального интерфейса в той же JVM, иначе - remote local
ejb.jndiName.format формат имени JNDI для получения EJB подставляется с помощью maven из указанного профиля

В случае использования удаленного интерфейса (ejb remote) нужно использовать файл jndi.properties

название описание значение для jboss4 значение для jboss7
java.naming.factory.initial фабрика JNDI org.jnp.interfaces.NamingContextFactory org.jboss.naming.remote.client.InitialContextFactory
java.naming.provider.url строка соединения jnp://localhost:10099 remote://localhost:4447
java.naming.factory.url.pkgs используется только в случае jboss4 org.jboss.naming:org.jnp.interfaces -
jboss.naming.client.ejb.context используется только в случае jboss7 - true

# Настройки орг. функций для работы с БД (sql.orgfunction.properties)

Орг. функции с названием класса SQL*Function (SQLChiefFunction, SQLChiefRecursiveFunction, SQLDirectorFunction, SQLSubordinateFunction, SQLSubordinateRecursiveFunction) настраиваются в файле sql.orgfunction.properties

название описание значение по умолчанию
datasource название источника данных БД java:/OrgFunctionDS
chief.code.by.subordinate.code.sql запрос на получение руководителя сотрудника select CHIEF_ID from EMPLOYEES where ID = ?
subordinate.codes.by.chief.code.sql запрос на получение подчиненных сотрудников руководителя select ID from EMPLOYEES where CHIEF_ID = ?
get.all.directors.codes.sql запрос на получение директора SELECT ID FROM DIRECTORS

В контексте Spring (system.context.xml) есть бин, ответственный за список логин-модулей, используемых для аутентификации:

ru.runa.wfe.security.auth.InternalDBPasswordLoginModuleru.runa.wfe.security.auth.KerberosLoginModuleru.runa.wfe.security.auth.TrustedLoginModule

Нужно включить требуемые и отключить неиспользуемые.

# Настройка Kerberos аутентификации

Руководство по настройке аутентификации Kerberos

# Настройка LDAP аутентификации

Руководство по настройке аутентификации LDAP

Система использует Hibernate ORM и может работать на любой СУБД. Тестирование системы производится на: PostgreSQL, MS SQL Server, Oracle, HSQL.

Настройка осуществляется путем:

  1. регистрации класса-драйвера в сервере приложений
  2. регистрации источника данных в сервере приложений
  3. привязки источника данных и установке соответствующего диалекта в database.properties
  4. отдельно настраивается СУБД для хранения сообщений (её не нужно настраивать если в процессах не используются узлы-сообщения или на них не возложена критичная логика). TODO: примеры настройки

Файл database.properties, помимо этого, содержит дополнительные настройки, информацию по которым можно получить в оригинале.

# Инициализация базы данных

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

# При использовании Wildfly10 (и старше)

# Oracle

Создайте модуль com.oraclejdbc

Структура модуля:

modules
\
 - system
  \
   - layers
    \
     - base
      \
       - com
        \
         - oraclejdbc
          \
           - main
            \
             - module.xml
             - ojdbc6_g.jar

module.xml

Добавьте секцию источника данных и драйвера в standalone.xml

jdbc:oracle:thin:@localhost:1521:XEoracleTRANSACTION_READ_COMMITTED10100truewfewfetruefalse5000532trueoracle.jdbc.driver.OracleDriver

В database.properties установите hibernate.connection.datasource=jboss/datasources/OracleDS и диалект hibernate.dialect=org.hibernate.dialect.OracleDialect

(или org.hibernate.dialect.Oracle10gDialect)

Для работы с версией XE в standalone.conf.bat установите переменные окружения.

set JAVA_OPTS=%JAVA_OPTS% -Duser.language=en -Duser.country=us

# PostgreSQL

Создайте модуль com.postgresql

Структура модуля:

modules
\
 - system
  \
   - layers
    \
     - base
      \
       - com
        \
         - postgresql
          \
           - main
            \
             - module.xml
             - postgresql-42.2.4.jar

module.xml

Добавьте секцию источника данных и драйвера в standalone.xml

jdbc:postgresql://localhost:5432/runawfepostgresqlTRANSACTION_READ_COMMITTED10100truerunawfe1truefalse32trueorg.postgresql.xa.PGXADataSource

В database.properties установите

hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
hibernate.connection.datasource=jboss/datasources/PostgreDS

# MSSQL

Создайте модуль com.microsoft.sqlserver

Структура модуля:

modules
\
 - com
  \
   - microsoft
    \
     - sqlserver
      \
       - main
        \
         - module.xml
         - mssql-jdbc-7.0.0.jre8.jar

module.xml

Добавьте секцию источника данных и драйвера в standalone.xml

jdbc:sqlserver://localhost:1433;DatabaseName=runawfemssqlTRANSACTION_READ_COMMITTED530runawfewfecom.microsoft.sqlserver.jdbc.SQLServerDrivercom.microsoft.sqlserver.jdbc.SQLServerXADataSource

В database.properties установите ru.runa.wfe.commons.hibernate.SqlServerUnicodeDialect

В случае возникновения ошибки вида "Тип данных столбца bpm_process.ID не совпадает с типом данных ссылающегося столбца BPM_SUBPROCESS.root_process_id во внешнем ключе fk_subprocess_root" при переходе на следующую версию RunaWFE Free, требуется использовать диалект SqlServerUnicodeAnd2012BigintBackCompatibilityDialect..

Если не используется unicode - dialect.SQLServerDialect (или SqlServerAnd2012BigintBackCompatibilityDialect).

# MySQL (Поддержка ожидается)

Замечание. Ожидается поддержка

Создайте модуль com.mysql со структурой:

modules
\
 - com
  \
   - mysql
    \
     - main
      \
       - module.xml
       - mysql-connector-java-8.0.21.jar

module.xml

Добавьте в standalone.xml

jdbc:mysql://localhost:3306/wfe_1?UseUnicode=true&characterEncoding=UTF-8&useOldAliasMetadataBehavior=true&serverTimezone=UTCmysqlTRANSACTION_READ_COMMITTED10100trueroot***truefalse32truecom.mysql.jdbc.jdbc2.optional.MysqlXADataSource

В файле database.properties установите hibernate.dialect=ru.runa.wfe.commons.hibernate.MySQL5UnicodeDialect, hibernate.connection.datasource=java:/mysqlds

# При использовании Jboss7

По умолчанию в системе используется H2 в режиме пересоздания при перезагрузке сервера. Для перевода в другой режим измените строку соединения в standalone.xml.

Настройка осуществляется путем:

  1. создания модуля для jdbc драйвера
  2. регистрации источника данных в standalone.xml ()
  3. привязки источника данных и установке соответствующего диалекта в database.properties

# PostgreSQL

Создайте модуль org.postgresql

Структура модуля:

modules
\
 - org
  \
   - postgresql
    \
     - main
      \
       - module.xml
       - postgresql-8.4-701.jdbc4.jar

module.xml

Добавьте секцию источника данных и драйвера в standalone.xml

jdbc:postgresql://localhost:5432/wfepostgresqlTRANSACTION_READ_COMMITTED10100truewfetruefalse32trueorg.postgresql.xa.PGXADataSource

В database.properties установите hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect, hibernate.connection.datasource=jboss/datasources/PostgreDS

# Oracle

Создайте модуль com.oraclejdbc

Структура модуля:

modules
\
 - com
  \
   - oraclejdbc
    \
     - main
      \
       - module.xml
       - ojdbc6_g.jar

module.xml

Добавьте секцию источника данных и драйвера в standalone.xml

jdbc:oracle:thin:@localhost:1521:XEoracleTRANSACTION_READ_COMMITTED10100truewfewfetruefalse5000532trueoracle.jdbc.driver.OracleDriver

В database.properties установите hibernate.dialect=org.hibernate.dialect.OracleDialect, hibernate.connection.datasource=jboss/datasources/OracleDS

Для работы с версией XE в standalone.conf.bat установите переменные окружения.

set JAVA_OPTS=%JAVA_OPTS% -Duser.language=en -Duser.country=us

# Tibero

Создайте модуль com.tmax.tibero

Структура модуля:

modules
\
 - com
  \
   - tmax
    \
     - tibero
      \
       - main
        \
         - module.xml
         - tibero5-jdbc.jar

module.xml

Добавьте секцию источника данных и драйвера в standalone.xml

jdbc:tibero:thin:@localhost:8629:tiberotiberowfewfetruefalse5000532truecom.tmax.tibero.jdbc.TbDriver

В database.properties установите hibernate.dialect=org.hibernate.dialect.OracleDialect, hibernate.connection.datasource=jboss/datasources/TiberoDS

# Derby

Создайте модуль org.apache.derby

Структура модуля:

modules
\
 - org
  \
   - apache
    \
     - derby
      \
       - main
        \
         - module.xml
         - derby.jar

module.xml

Добавьте секцию источника данных и драйвера в standalone.xml

jdbc:derby:runawfe;restoreFrom=~/backupdirectory/runawfederbywfewfe

В database.properties установите hibernate.dialect=org.hibernate.dialect.DerbyDialect, hibernate.connection.datasource=jboss/datasources/DerbyDS

# SQL Server

Создайте модуль net.sourceforge.jtds

Структура модуля:

modules
\
 - net
  \
   - sourceforge
    \
     - jtds
      \
       - main
        \
         - module.xml
         - jtds-1.2.7.jar

module.xml

Добавьте секцию источника данных и драйвера в standalone.xml

jdbc:jtds:sqlserver://localhost;DatabaseName=runawfemssqlTRANSACTION_READ_COMMITTED530runawfewfetruefalsenet.sourceforge.jtds.jdbc.Drivernet.sourceforge.jtds.jdbcx.JtdsDataSource

В database.properties установите hibernate.dialect=org.hibernate.dialect.SQLServerDialect (или ru.runa.wfe.commons.hibernate.SqlServerUnicodeDialect), hibernate.connection.datasource=jboss/datasources/RunawfeDS

# MySQL

Замечание. Вместо MySQL для RunaWFE лучше использовать PostgreSQL. RunaWFE работает с MySQL, но в настоящее время мы не предоставляем патчи обновления системы для этой БД. Если вы все-таки используете RunaWFE с MySQL, то обновление БД можно произвести вручную (но это не легко). Подробнее можно посмотреть здесь

Создайте модуль com.mysql со структурой:

modules
\
 - com
  \
   - mysql
    \
     - main
      \
       - module.xml
       - mysql-connector-java-5.1.7-bin.jar

module.xml

Добавьте в standalone.xml

jdbc:mysql://localhost:3306/wfe?UseUnicode=true&characterEncoding=UTF-8&useOldAliasMetadataBehavior=truemysqlTRANSACTION_READ_COMMITTED10100trueroottruefalse32truecom.mysql.jdbc.jdbc2.optional.MysqlXADataSource

В файле database.properties установите hibernate.dialect=org.hibernate.dialect.MySQL5Dialect, hibernate.connection.datasource=jboss/datasources/RunawfeDS

Требования к аппаратным ресурсам сильно зависит от числа одновременно работающих пользователей и числа выполняющихся экземпляров процессов. Но в любом случае необходимо настраивать параметры JVM под существующие аппаратные ресурсы.

# Настройки JVM

Используйте файл run.bat (в Windows) или run.sh в Linux. В нем измените параметры JVM (JAVA_OPTS).

Например, в run.bat отредактируйте строку

set JAVA_OPTS=%JAVA_OPTS% -Xms128m -Xmx512m

Для большинства случаев можно:

  1. Выделить максимальное кол-во памяти процессу (-Xmx8GB),
  2. Установить размер памяти (perm gen) в 256M (-XX:MaxPermSize:256m),
  3. Убедиться что используется опция "server" VM (-server),

Чтобы не использовался файл подкачки удостоверьтесь, что размер памяти, указанный с помощью опции -Xmx не превышает размер физической памяти ОЗУ. Также стоит зарезервировать некий запас памяти для ОС и других приложений.

Если выделить процессу менее 1Гб ОЗУ, то настройка других параметров особой пользы не принесет. В ином случае остальные параметры могут сильно повлиять на производительность системы.

Пример конфигурации (32-бит, dual-core per CPU, 4GB ОЗУ):

-server -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:+CMSClassUnloadingEnabled -Xms512m -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintConcurrentLocks -XX:MaxPermSize=256m

Примеры конфигурации на многопроцессорном сервере (64-бит ОС, JVM; multi-CPU, 8GB)

-server -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled -Xms1g -Xmx4g -Xss256k -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintConcurrentLocks

Опции для включения параллельного сборщика мусора

-XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+ParallelRefProcEnabled -XX:NewRatio=5 -XX:+CMSScavengeBeforeRemark

Опции для анализа исполнения сборщика мусора и его настройки

-XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:"../server/default/log/gc.log"

# Получение дампов памяти и стека JVM для анализа производительности

# Используя утилиты JDK

Перейдите в директорию ${JDK}\bin\.

Для получения дампа памяти выполните команду

jmap -dump:format=b,file=heap.bin pid,      где - pid - идентификатор процесса

Для получения дампа стека JVM выполните команду

jstack pid,      где - pid - идентификатор процесса

При возникновении проблем (например, Недостаточно памяти для выполнения команды), рекомендуем воспользоваться любым из нижеописанных способов.

# Используя JavaMelody

В 4-й версии она настроена в дистрибутиве и доступна по ссылке http://localhost:8080/wfe/monitoring. Падение производительности может составлять до 30%.


Адрес проекта: http://code.google.com/p/javamelody/

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

Дамп стека потоков можно получить: Threads -> Details -> Dump threads as text

Дамп памяти JVM можно получить: Generate a heap dump

Отключить javamelody можно:

  1. закомментировав строку hibernate.jdbc.factory_class=net.bull.javamelody.HibernateBatcherFactory в database.properties
  2. в web.xml закомментировать или удалить фрагмент
monitoringnet.bull.javamelody.MonitoringFiltermonitoring/*net.bull.javamelody.SessionListener

# Используя VisualVM

Адрес проекта: visualvm.java.net

Если вы запускаете VisualVM на том же компьютере, где запущен WFE, и VisualVM обнаружил процесс WFE, то дополнительных настроек производить не нужно.

Если же вы запускаете VisualVM на другом компьютере или VisualVM не смог обнаружить процесс WFE (это обычная ситуация, если эти программы запущены под разными пользователями), то нужно произвести настройки: в run.bat (Windows) или run.sh (Linux) нужно добавить параметры в JAVA_OPTS. Например так:

set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote.port=6767 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false

После этого убедиться что порт 6767 не закрыт с помощью Firewall.

В VisualVM соединяться путем JMX Connection.

После успешного соединения по правой кнопке мыши на выбранном процессе доступны элементы меню Thread Dump, Heap Dump. Также с помощью этого инструмента можно понаблюдать за процессом, но не советуем оставлять надолго соединение активным в режиме эксплуатации, т.к. происходит постоянная пересылка данных JVM в VisualVM.

# В Jboss версии 4

Используется JbossMessaging, все возможности настройки можно узнать из оригинала http://www.jboss.org/jbossmessaging.

Основные настройки в файле runawfe.ear!/runawfe-jms-service.xml

параметр /server/mbean/attribute[name="DefaultMaxDeliveryAttempts"] максимальное кол-во попыток отправки сообщений при отсутствии получателя

параметр /server/mbean/attribute[name="DefaultRedeliveryDelay"] задержка повторной отправки сообщения при отсутствии получателя

При параметрах DefaultMaxDeliveryAttempts=43200, DefaultRedeliveryDelay=60000 время жизни сообщения будет 1 месяц, задержка между обработкой (в случае неактивного узла "получить сообщение") 1 мин.

# В wildfly/Jboss версии 7

Используется HornetMQ, все возможности настройки можно узнать из оригинала http://www.jboss.org/hornetq/docs.

# Длительность активной пользовательской сессии

Для изменения длительности активной пользовательской сессии в браузере по умолчанию (30 минут) в ${RunaWFE}/server/default/deploy/wfe.war!/WEB-INF/web.xml добавьте в элемент

N

, где N - количество минут.

# Оповещение пользователей по электронной почте

В RunaWFE есть возможность настроить оповещение пользователей о поступивших и просроченных заданиях.

Для этого необходимо определить конфигурацию отправки email сообщения.

Содержимое email.config.xml (формат конфигурации аналогичен обработчику)







Для отправки сообщений о поступивших заданиях необходимо в wfe.custom.system.context.xml определить ru.runa.wfe.task.EmailTaskNotifier

Пример настройки

process1process2ignore@sample.org*@mail.ru

Для отправки сообщений о просроченных заданиях необходимо в wfe.custom.system.context.xml определить job ru.runa.wfe.job.impl.ExpiredTasksNotifier

Пример настройки

process1process2ignore@sample.org*@mail.ru


где:

  • configLocation (обязательный) - путь к конфигурации отправки email сообщения
  • enabled (по умолчанию = true) - задействовать уведомления
  • onlyIfTaskActorEmailDefined (по умолчанию = false) - посылать уведомления по заданиям, назначенным только пользователям с установленным адресом электронной почты
  • includeEmailsFilter 4.3.0+ - список email для включения в рассылку, допускаются подстановочные символы
  • excludeEmailsFilter4.3.0+ - список email для исключения из рассылки, допускаются подстановочные символы
  • includeProcessNameFilter 4.3.0+ - список названий БП для включения в рассылку, допускаются подстановочные символы
  • excludeProcessNameFilter 4.3.0+ - список названий БП исключения из рассылки, допускаются подстановочные символы

Подстановочные символы: * - любой набор символов, ? - любой символ.

# Что можно использовать в теле сообщения

В теле сообщения можно использовать все переменные БП по скриптовому названию.

В теле сообщения также доступны контекстные переменные:

Интерактивная форма (${interaction}, ru.runa.wfe.form.Interaction)

Использовать проверку в браузере	${interaction.useJSValidation?string("да", "нет")}
Список обязательных переменных		${interaction.requiredVariableNames}
Код формы	 			${interaction.formData} (byte[])

Получатели уведомления (${emails}, java.lang.String)

Формируется из корректных email пользователей, на которых назначается задание (их может быть несколько если задание назначается на группу).

Задание (${task}, ru.runa.wfe.task.Task)

ID					${task.id}
ID задания				${task.nodeId}
Название 				${task.name}
Описание 				${task.description}
Название роли    			${task.swimlane.name}
Исполнитель				${task.executor.label}
Дата создания		    		${task.createDate?datetime}
Срок выполнения (deadline)    		${task.deadlineDate?datetime}

Экземпляр процесса (${task.process}, ru.runa.wfe.execution.Process)

ID					${task.process.id}
Дата запуска				${task.process.startDate?datetime}
Дата завершения 			${task.process.endDate?datetime} (только для асинхронных заданий)
Иерархия подпроцессов			${task.process.hierarchyIds}

Определение процесса (${task.process.deployment}, ru.runa.wfe.definition.Deployment)

ID					${task.process.deployment.id}
Версия					${task.process.deployment.version}
Название				${task.process.deployment.name}
Описание				${task.process.deployment.description}
Категория				${task.process.deployment.category}
Загружено в систему			${task.process.deployment.createDate?datetime}

# Логирование HTTP запросов

# В Jboss версии 7

Поместить Файл:Jboss-web.xml в runawfe.ear!/wfe-web-x.y.z.war!/META-INF (переменовать в jboss-web.xml).

Как создать переменную в PHP

Вначале переменные содержат знак $ (доллар) - обозначение использования переменной, потом буквы латинского алфавита (от a до z и маленькие и большие), в конце могу содержать цифры . Также в названии допускается использование нижнего подчёркивания (не в конце).

Как можно называть переменные:

$var
$variable
$year1945
$_variable
Как нельзя называть переменные:

$1 - состоит только из цифры
$1var - нельзя начинать название переменной с цифры
$/var - из дополнительных символов допускается только нижнее подчёркивание _
$переменная - кириллица разрешена документацией php, но не рекомендуема
$var iable - нельзя использовать пробелы

Каждой переменной присваивается значение. Для присвоения значения используется знак = (равно). В течение обработки скрипта значение переменной может неоднократно меняться в зависимости от разных условий.

$city = "Москва"; // переменной $city присвоили строковое (в кавычках) значение Москва
$year = 1147; // а переменной $year присвоили числовое значение 1147
?>

$name = "Александр";
$Name = "Алексей";
echo "$name, $Name"; // выведет "Александр, Алексей"
?>

Вывод переменных PHP

Отдельно следует разобрать то, как отобразить переменные при помощи операторов вывода , работу которых мы разобрали в прошлом уроке Создание странцы PHP. Операторы вывода. . Ниже приведу ряд наглядных примеров с комментариями.

// Так задаём значения переменным
$name1 = "Алексей";
$name2 = "Александр";

// Выводим переменные
echo $name2; // Выведет: Александр
echo "name1 - это $name1"; // name1 - это Алексей

// При использовании одиночных кавычек выводится
// имя переменной, а не значение
echo "name1 - это $name1"; // выведет: name1 - это $name1

// можно вывести просто значения переменных
echo $name1; // Алексей
echo $name1,$name2; // АлексейАлександр
echo $name1." ".$name2; // Алексей Александр
echo "$name1, $name2"; // Алексей, Александр

Echo Здесь используется синтаксис "here document" для вывода
нескольких строк с подстановкой переменных $variable.
END;

Операции с переменными PHP

Арифметические операции в PHP
В случае с числовыми значениями можно проводить арифметические операции: сложение, вычитание, умножение и так далее.

-$a (отрицание) Смена знака $a.
$a + $b (сложение) Сумма $a и $b.
$a - $b (вычитание) Разность $a и $b.
$a * $b (умножение) Произведение $a и $b.
$a / $b (деление) Частное от деления $a на $b.
$a % $b (деление по модулю) Целочисленный остаток от деления $a на $b.
Рассмотрим примеры

$a = 2; // заметьте, в случае с цифрами кавычки не ставятся
$b = 3; // заметьте, в случае с цифрами кавычки не ставятся

$result = $a + $b; // складываем переменные
echo $result; // выведет 5

$result = $b - $a; // складываем переменные
echo $result; // выведет 1

Операции инкремента и декремента в PHP
Данные операции пригодятся в основном при построении циклов, о которых поговорим чуть позже.
Префиксный - операторы, прописанные ПЕРЕД переменной (--$a ; ++$a ). Возвращают значение переменной до изменений.
Постфиксный - операторы, прописываемые после переменной ($a-- ; $a-- ). Возвращают значение переменной с изменениями.
Инкремент - увеличения значения.
Декремент - уменьшение значения.

++$a Префиксный инкремент. Увеличивает $a на единицу и возвращает значение $a.
$a++ Постфиксный инкремент. Возвращает значение $a, а затем увеличивает $a на единицу.
--$a Префиксный декремент. Уменьшает $a на единицу и возвращает значение $a.
$a-- Постфиксный декремент. Возвращает значение $a, а затем уменьшает $a на единицу.
echo "

Постфиксный инкремент

";
$a = 5;
echo "Должно быть 5: " . $a++ . "\n";

Echo "

Префиксный инкремент

";
$a = 5;
echo "Должно быть 6: " . ++$a . "\n";
echo "Должно быть 6: " . $a . "\n";

Echo "

Постфиксный декремент

";
$a = 5;
echo "Должно быть 5: " . $a-- . "\n";

Echo "

Префиксный декремент

";
$a = 5;
echo "Должно быть 4: " . --$a . "\n";
echo "Должно быть 4: " . $a . "\n";
?>

Операции присвоения в PHP
Базовый оператор выглядит как = . На первый взгляд может показаться, что это оператор равно. На самом деле это не так. В действительности, оператор присвоения означает, что левый операнд получает значение правого выражения, (т.е. устанавливается результирующим значением). Комбинированные операторы - это такие операторы, которые позволяют использовать предыдущие значения переменных для последующих операций (дописывать в строковую переменную (с текстом) или складывать числовые значения).

$a = ($b = 2) + 4; // результат: $a установлена значением 6, переменной $b присвоено 2.

$a = 2;
$a += 3; // устанавливает $a значением 5, аналогично записи: $a = $a + 3;
$b = "Привет ";
$b .= "Мир!"; // устанавливает $b строкой "Привет Мир!", как и $b = $b . "There!";

Существуют также операции сравнения и логические , но о них мы поговорим в следующих уроках. Постараюсь сразу не пугать Вас большим объёмом информации!)

13 years ago

A little gotcha to watch out for:

If you turn off RegisterGlobals and related, then use get_defined_vars(), you may see something like the following:

Array
[ GLOBALS ] => Array
[ GLOBALS ] => Array
* RECURSION *
[ _POST ] => Array()
[ _GET ] => Array()
[ _COOKIE ] => Array()
[ _FILES ] => Array()
)

[ _POST ] => Array()
[ _GET ] => Array()
[ _COOKIE ] => Array()
[ _FILES ] => Array()

)
?>

Notice that $_SERVER isn"t there. It seems that php only loads the superglobal $_SERVER if it is used somewhere. You could do this:

print "

"
.
htmlspecialchars
(print_r
(get_defined_vars
(),
true
)) .
"

" ;
print "

"
.
htmlspecialchars
(print_r
($_SERVER
,
true
)) .
"

" ;
?>

And then $_SERVER will appear in both lists. I guess it"s not really a gotcha, because nothing bad will happen either way, but it"s an interesting curiosity nonetheless.

6 years ago

Since get_defined_vars() only gets the variables at the point you call the function, there is a simple way to get the variables defined within the current scope.

// The very top of your php script
$vars = get_defined_vars ();

// Now do your stuff
$foo = "foo" ;
$bar = "bar" ;

// Get all the variables defined in current scope
$vars = array_diff (get_defined_vars (), $vars );

echo "

"
;
print_r ($vars );
echo "

" ;
?>

15 years ago

Here is a function which generates a debug report for display or email
using get_defined_vars. Great for getting a detailed snapshot without
relying on user input.

function generateDebugReport ($method , $defined_vars , $email = "undefined" ){
// Function to create a debug report to display or email.
// Usage: generateDebugReport(method,get_defined_vars(),email);
// Where method is "browser" or "email".

// Create an ignore list for keys returned by "get_defined_vars".
// For example, HTTP_POST_VARS, HTTP_GET_VARS and others are
// redundant (same as _POST, _GET)
// Also include vars you want ignored for security reasons - i.e. PHPSESSID.
$ignorelist =array("HTTP_POST_VARS" , "HTTP_GET_VARS" ,
"HTTP_COOKIE_VARS" , "HTTP_SERVER_VARS" ,
"HTTP_ENV_VARS" , "HTTP_SESSION_VARS" ,
"_ENV" , "PHPSESSID" , "SESS_DBUSER" ,
"SESS_DBPASS" , "HTTP_COOKIE" );

$timestamp = date ("m/d/y h:m:s" );
$message = "Debug report created $timestamp \n" ;

// Get the last SQL error for good measure, where $link is the resource identifier
// for mysql_connect. Comment out or modify for your database or abstraction setup.
global $link ;
$sql_error = mysql_error ($link );
if($sql_error ){
$message .= "\nMysql Messages:\n" . mysql_error ($link );
}
// End MySQL

// Could use a recursive function here. You get the idea ;-)
foreach($defined_vars as $key => $val ){
if(is_array ($val ) && ! in_array ($key , $ignorelist ) && count ($val ) > 0 ){
$message .= "\n $key array (key=value):\n" ;
foreach($val as $subkey => $subval ){
if(! in_array ($subkey , $ignorelist ) && ! is_array ($subval )){
$message .= $subkey . " = " . $subval . "\n" ;
}
elseif(! in_array ($subkey , $ignorelist ) && is_array ($subval )){
foreach($subval as $subsubkey => $subsubval ){
if(! in_array ($subsubkey , $ignorelist )){
$message .= $subsubkey . " = " . $subsubval . "\n" ;
}
}
}
}
}
elseif(!
is_array ($val ) && ! in_array ($key , $ignorelist ) && $val ){
$message .= "\nVariable " . $key . " = " . $val . "\n" ;
}
}

If($method == "browser" ){
echo nl2br ($message );
}
elseif($method == "email" ){
if($email == "undefined" ){
$email = $_SERVER [ "SERVER_ADMIN" ];
}

$mresult = mail ($email , "Debug Report for " . $_ENV [ "HOSTNAME" ]. "" , $message );
if($mresult == 1 ){
echo "Debug Report sent successfully.\n" ;
}
else{
echo "Failed to send Debug Report.\n" ;
}
}
}
?>

17 years ago

Simple routine to convert a get_defined_vars object to XML.

function obj2xml ($v , $indent = "" ) {
while (list($key , $val ) = each ($v )) {
if ($key == "__attr" ) continue;
// Check for __attr
if (is_object ($val -> __attr )) {
while (list($key2 , $val2 ) = each ($val -> __attr )) {
$attr .= " $key2 =\" $val2 \"" ;
}
}
else $attr = "" ;
if (is_array ($val ) || is_object ($val )) {
print(" $indent \n" );
obj2xml ($val , $indent . " " );
print(" $indent $key >\n" );
}
else print(" $indent $val $key >\n" );
}
}

//Example object
$x -> name -> first = "John" ;
$x -> name -> last = "Smith" ;
$x -> arr [ "Fruit" ] = "Bannana" ;
$x -> arr [ "Veg" ] = "Carrot" ;
$y -> customer = $x ;
$y -> customer -> __attr -> id = "176C4" ;

$z = get_defined_vars ();
obj2xml ($z [ "y" ]);
?>
will output:


John
Smith


Bannana
Carrot

11 years ago

As a note, get_defined_vars() does not return a set of variable references (as I hoped). For example:

// define a variable
$my_var = "foo" ;

// get our list of defined variables
$defined_vars = get_defined_vars ();

// now try to change the value through the returned array
$defined_vars [ "my_var" ] = "bar" ;

echo $my_var , "\n" ;

?>

will output "foo" (the original value). It"d be nice if get_defined_vars() had an optional argument to make them references, but I imagine its a rather specialized request. You can do it yourself (less conveniently) with something like:

$defined_vars = array();
$var_names = array_keys (get_defined_vars ());

foreach ($var_names as $var_name )
{
$defined_vars [ $var_name ] =& $ $var_name ;
}

?>

1 year ago

I posted here before about "this" being in get_defined_vars.

It turns out it"s not always there but in certain cases it will inexplicably appear.

Php -r "
class Test {
public function a() {var_dump(array_keys(get_defined_vars()));$a = 123;}
public function b() {var_dump(array_keys(get_defined_vars()));$this;}
}
$t = new Test();
$t->a();
$t->b();
"

Array()
array("this")

This does not happen in PHP 7.2 but will happen in PHP 5.6.

1 year ago

Some comments here point out that this function wont return references. It does however return names and names are "references".

I would not recommend the suggestions here that convert it to references.

Public function x($a, $b, $c) {
foreach(array_keys(get_defined_vars()) as $key)
if($key !== "this")
$this->y(${$key});
}

Public function y(&$input) {
$input++;
}

Instead of ${} you can also use $$.

I have done some whacky things in my time to make extremely generic code but I"ve never had to do anything like the above. It might not even work (but should since it"s no different to $a[$key]).

You could also do $$key++ but I"ve never seen code like that which wasn"t horrifically bad (using dynamic where dynamic isn"t beneficial).

If you"re doing something like that then give it additional scrutiny.

Переменные окружения (среды) в Windows содержат различную информацию о настройках системы и среды пользователя. Различают переменные окружения пользователя, системы и процессов.

Самый простой способ просмотреть содержимое переменных окружения в Windows – открыть свойства системы (sysdm.cpl) -> Дополнительно -> Переменные среды. Как вы видите, в открывшемся есть две секции: в верхней содержатся переменные окружения пользователя, в нижнем – системные.

Кроме того, переменные среды хранятся в реестре системы. Пользовательские переменные хранятся в разделе . Системные – в HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment .

Вывести значения всех переменных окружения можно в командной строке Windows. Команда простая:

Команда выведет список переменных среды и их значения.

В PowerShell для вывод всех переменных окружения можно использовать команду:

Если нужно вывести значение только одной переменной, нужно воспользоваться командой echo, причем имя переменной нужно заключить в знаки процентов. Например,

Echo %systemroot%

set > c:\tmp\env_var.txt

Переменные окружения конкретного процесса можно получить с помощью бесплатной утилиты Process Explorer (от Sysinternals). Достаточно открыть свойства процесса и перейти на вкладку Environment .

Наверняка у вас дома есть шкаф или комод. Принцип их использования простой: мы убираем туда вещи, которые не нужны нам прямо сейчас, но могут понадобиться через некоторое время.

Переменные устроены точно также. В них можно положить какое-нибудь значение и хранить там, пока оно не понадобится.

Создание переменных

Положить значение в переменную можно следующим образом:

В коде выше мы создали переменную $name и положили в неё значение Иван , затем создали переменную $age и присвоили ей значение 20 .

Название "переменная" означает, что её значение может меняться во время выполнения скрипта:

В некоторых языках переменную нужно сначала "объявить", а затем уже использовать. В PHP объявления нет - переменная создаётся в тот момент, когда вы кладёте в неё значение.
Тем не менее, PHP-программисты часто говорят "объявить переменную" вместо "создать переменную".

Также вместо "положить в переменную значение" часто говорят "присвоить значение".
Причина проста - символ = , благодаря которому мы сохраняем значение в переменную, называется "оператор присваивания". Отсюда и термин "присвоить".

Правила именования переменных

1. Название переменной начинается с символа $.

2. Вторым символом может быть буква или символ подчёркивания _

Названия переменных регистрозависимы. $name и $Name - это разные переменные.

Вывод значения переменной на экран

Вывести переменную можно с помощью уже известной нам команды echo :

Команда echo позволяет вывести на экран сразу несколько значений:

Заметьте, мы передали в echo 2 значения, разделив их запятой. Так мы можем передавать сколько угодно значений. Следующие два примера приведут к одинаковому результату:

Также в PHP существует сокращённый синтаксис вывода переменных. Вместо

До версии PHP 5.4 сокращённый синтаксис работал только при включении в настройках PHP директивы short_open_tag , которая также позволяет использовать сокращённый открывающий тег наравне с

Проверка значения переменной

Команда echo не всегда удобна для проверки текущего значения переменной. К примеру, при попытке вывода пустой строки "" на экран не выведется абсолютно ничего. И непонятно, в чём причина - в пустой переменной или неработающем коде.

Поэтому для проверки значения переменной используется функция var_dump() :

Результат выполнения скрипта:

String(5) "Vasya" string(0) ""

Как видите, PHP вывел не только содержимое переменной, но ещё и количество символов, и даже тип переменной (string - строка). Типы данных мы подробно рассмотрим на следующих уроках.

Удаление переменных

Удалить существующую переменную можно с помощью функции unset() :

А теперь пришло время немного попрактиковаться.

Запомните, практически любая задача на PHP может иметь несколько решений. Поэтому если ваши решения будут отличаться от написанных на этом сайте - это совсем не значит, что вы что-то сделали неправильно.

Напишите скрипт, который:
1. Создаёт переменные с названиями title и content и какими-нибудь значениями.
2. Выводит значение переменной title внутри тега h1, а значение переменной content внутри тега div.

Показать решение

", $title, ""; echo "

", $content, "

"; ?>

Хочу ещё раз обратить ваше внимание, что это решение не является единственно верным. К примеру, следующий код приведёт к такому же результату:

В данном уроке рассматривается область видимости переменных PHP. Объясняется различие локальной и глобальной области видимости, показывается как получить доступ к глобальным переменным внутри функции, как работать с суперглобалами и создавать статические переменные.

Когда приступаешь к изучению PHP и начинаешь работать с функциями и объектами, область видимости переменных вызывает некоторое смущение. К счастью правила PHP в этом отношении очень просты для понимания (в сравнении с другими языками программирования).

Что такое область видимости?

Область видимости переменных - это контекст, в рамках которого переменная была определена и где к ней можно получить доступ. В PHP имеется две области видимости переменных:

  • Глобальная - к переменным можно получить доступ в любом месте скрипта
  • Локальная - к переменным можно получить доступ только внутри функции, в которой они были определены

Область видимости переменной, а особенно, локальная, существенно облегчает управление кодом. Если бы все переменные были глобальными, то их можно было бы менять в любом месте скрипта. Это привело бы к хаосу и больших скриптах, так как очень часто разные части скрипта используют переменные с одинаковыми именами. Ограничивая область видимости локальным контекстом вы определяете границы кода, который может получить доступ к переменной, что делает код более устойчивым, модульным и простым в отладке.

Переменные с глобальной областью видимости называются глобальными, а с локальной областью видимости - локальными.

Вот пример того, как работают глобальные и локальные переменные.

"; } sayHello(); echo "Значение \$globalName: "$globalName"
"; echo "Значение \$localName: "$localName"
"; ?>

Привет, Гарри! Значение $globalName: "Зоя" Значение $localName: ""

В данном скрипте мы создали две переменных:

  • $globalName - это глобальная переменная
  • $localName - это локальная переменная, которая создана внутри функции sayHello() .

После создания переменной и функции скрипт вызывает sayHello() ,который выводит "Привет, Гарри!" . Затем скрипт пытается вывести значения двух переменных с помощью функции echo . Вот что происходит:

  • Так как $globalName была создана вне функции, она доступна в любом месте скрипта, поэтому выводится "Зоя" .
  • $localName будет доступна только внутри функции sayHello() . Так как выражение echo находится вне функции, PHP не дает доступа к локальной переменной. Вместо этого, PHP предполагает, что код будет создавать новую переменную с именем $localName , которая получит значение по умолчанию - пустую строку. вот почему второй вызов echo выводит значение "" для переменной $localName .

Доступ к глобальным переменным внутри функции

Для получения доступа к глобальной переменной вне функции достаточно просто написать ее имя. Но для получения доступа к глобальной переменной внутри функции , нужно сначала объявить переменную как глобальную в функции с помощью ключевого слова global:

Function myFunction() { global $globalVariable; // Доступ к глобальной переменной $globalVariable }

Если не сделать этого, то PHP предполагает, что вы создаете или используете локальную переменную.

Вот пример скрипта, который использует глобальную переменную внутри функции:

"; global $globalName; echo "Привет, $globalName!
"; } sayHello(); ?>

При выполнении скрипт выведет:

Привет, Гарри! Привет, Зоя!

Функция sayHello() использует ключевое слово global для объявления переменной $globalName как глобальной. После чего она может получить доступ к переменной и вывести ее значение ("Зоя").

# Переменная в определении процесса

атрибут значение
название используется для ссылки на переменную, уникально в контексте процесса
описание используется только в среде разработки для дополнительных комментариев при разработке процесса
название в скриптах используется для ссылки на переменную при написании кода скриптов (JavaScript, Groovy, ...), из-за ограничения идентификаторов переменных, генерируется автоматически, уникально в контексте процесса
тип тип переменной определяет:
  • формат хранения
  • формат сериализации для передачи информации в WebServices API
  • влияет на ввод и вывод переменных на форме
значение по умолчанию при запуске процесса переменная будет иметь это значение. Для некоторых типов поддержка значения по умолчанию отсутствует.
доступ определяет права доступа (видимость) переменной

# Переменная экземпляра процесса

атрибут значение
определение переменной используется для ссылки на определение переменной, заданной при разработке процесса. См. замечание.
значение значение переменной с областью видимости, соответствующей экземпляру процесса

# Строгая типизация 4.0.5+

Все переменные должны быть определены в среде разработки, а также все значения должны соответствовать определённым типам.

Замечание. В режиме обратной совместимости исполнения процессов или при соответствующей настройке свойства undefined.variables.allowed можно избавиться от необходимости определять переменные в среде разработки, а управлять их значениями либо используя обработчики, либо API.

Замечание. Тип переменной может не совпадать с ожидаемыми значениями в случае настройки свойства strong.variables.format.enabled. Свойство variables.autocast.enabled позволяет использовать автоматическое изменение типа в соответствии с определенным в среде разработки.

класс формата класс значение описание сериализация
ru.runa.wfe.var.format.BooleanFormat java.lang.Boolean флаг: значение ИСТИНА или ЛОЖЬ "true" или "false"
ru.runa.wfe.var.format.LongFormat java.lang.Long целое число число в строковом выражении
ru.runa.wfe.var.format.DoubleFormat java.lang.Double дробное число число в строковом выражении
ru.runa.wfe.var.format.BigDecimalFormat java.math.BigDecimal число повышенной точности число в строковом выражении
ru.runa.wfe.var.format.DateFormat java.util.Date дата дата в указанном формате date.format.pattern
ru.runa.wfe.var.format.DateTimeFormat java.util.Date дата со временем дата в указанном формате date.format.pattern, время в формате ЧЧ:ММ
ru.runa.wfe.var.format.TimeFormat java.util.Date время время в формате ЧЧ:ММ
ru.runa.wfe.var.format.StringFormat java.lang.String строка без изменений
ru.runa.wfe.var.format.TextFormat java.lang.String текст (отличается от строки только отображением на формах) без изменений
ru.runa.wfe.var.format.FileFormat ru.runa.wfe.var.FileVariable файл название файл, например "test.doc"; обратная операция не поддерживается
ru.runa.wfe.var.format.ProcessIdFormat java.lang.Long номер процесса в системе (целое число) число в строковом выражении
класс формата класс значение описание сериализация в формате JSON
ru.runa.wfe.var.format.ExecutorFormat ru.runa.wfe.user.Executor исполнитель (группа или пользователь системы) JSON-объект вида
{"id": 1, "name": "Administrator", "fullName": "Adm A.A."}

Для передачи данных в систему достаточно заполнять "id" или "name".

ru.runa.wfe.var.format.GroupFormat ru.runa.wfe.user.Group группа в системе JSON-объект вида
{"id": 2, "name": "Administrators", "fullName": ""}

Для передачи данных в систему достаточно заполнять "id" или "name".

ru.runa.wfe.var.format.ActorFormat ru.runa.wfe.user.Actor пользователь в системе JSON-объект вида
{"id": 1, "name": "Administrator", "fullName": "Adm A.A."}

Для передачи данных в систему достаточно заполнять "id" или "name".

Для переменных данных типов возможен доступ к полям:

ru.runa.wfe.user.Executor (исполнитель) ru.runa.wfe.user.Group (группа) ru.runa.wfe.user.Actor (пользователь)
id (идентификатор) + + +
name (уникальный логин пользователя или название группы) + + +
description (описание) + + +
fullName (Ф.И.О. пользователя) - - +
department (подразделение пользователя) 4.3.0+ - - +
title (должность пользователя) 4.3.0+ - - +
code (код пользователя) - - +
active (активен ли пользователь) - - +
email (email пользователя) - - +
phone (телефон пользователя) - - +
ldapGroupName (соответствие ldap группы) - + -
lastName (фамилия пользователя) 4.0.6+ - - +
firstName (имя пользователя) 4.0.6+ - - +
middleName (отчество пользователя) 4.0.6+ - - +

Доступ осуществляется с помощью ".", например для получения телефона пользователя можно использовать следующий код

пользователь.phone
класс формата класс значение описание сериализация в формате JSON
ru.runa.wfe.var.format.ListFormat java.util.ArrayList список значений ["value1", "value2"]
ru.runa.wfe.var.format.MapFormat java.util.HashMap карта (хеш-таблица) {"key1": "value1", "key2": "value2"}
ru.runa.wfe.var.format.UserTypeFormat java.util.HashMap пользовательский тип с определенными атрибутами по аналогии с MapFormat, для определённых атрибутов и соответствующих типов

Вложенные списки и карты не поддерживаются из-за потери типизации.

В среде разработки в контексте определения процесса можно определить новый составной тип переменной, состоящий из определенного количества именованных и типизированных атрибутов. Атрибуты, в свою очередь, могут иметь составной тип (поддерживается произвольная вложенность типов).

При доступе на сервере переменная составного типа будет иметь значение, являющееся объектом java.util.HashMap.

На стороне сервера

Класс-формат должен наследовать абстрактный класс ru.runa.wfe.var.format.VariableFormat.

Нужно реализовать методы:

// определяет класс для хранения значений переменных 
public Class> getJavaClass();
// сериализация в строку
public String format(Object object);
// десериализация из строки, обратный к предыдущему
public Object parse(String source) throws Exception;

Он используется для преобразования полученных из HTTP запроса данных в виде строк при выполнении задания в объект определенного типа.