r - manejo - sesiones en php
¿Cómo funcionan las sesiones en el servidor brillante? (1)
Bueno, para comenzar con un objeto de sesión brillante hay una estructura de datos específica (''R6'') en elementos brillantes, hechos de elementos públicos y privados. Su propósito es registrar una instancia de la relación entre un usuario y brillante (más sobre esto más adelante).
>str(session)
Classes ''ShinySession'', ''R6'' <ShinySession>
Public:
@uploadEnd: function (jobId, inputId)
@uploadieFinish: function ()
@uploadInit: function (fileInfos)
allowReconnect: function (value)
clientData: reactivevalues
clone: function (deep = FALSE)
close: function ()
closed: FALSE
decrementBusyCount: function ()
defineOutput: function (name, func, label)
dispatch: function (msg)
doBookmark: function ()
downloads: Map, R6
exportTestValues: function (..., quoted_ = FALSE, env_ = parent.frame())
files: Map, R6
fileUrl: function (name, file, contentType = "application/octet-stream")
flushOutput: function ()
freezeValue: function (x, name)
getBookmarkExclude: function ()
getTestEndpointUrl: function (inputs = TRUE, outputs = TRUE, exports = TRUE, format = "rds")
groups: NULL
handleRequest: function (req)
incrementBusyCount: function ()
initialize: function (websocket)
input: reactivevalues
isClosed: function ()
isEnded: function ()
makeScope: function (namespace)
manageHiddenOutputs: function ()
manageInputs: function (data)
ns: function (id)
onBookmark: function (fun)
onBookmarked: function (fun)
onEnded: function (endedCallback)
onFlush: function (flushCallback, once = TRUE)
onFlushed: function (flushedCallback, once = TRUE)
onInputReceived: function (callback)
onRestore: function (fun)
onRestored: function (fun)
onSessionEnded: function (sessionEndedCallback)
output: shinyoutput
outputOptions: function (name, ...)
progressStack: environment
reactlog: function (logEntry)
registerDataObj: function (name, data, filterFunc)
registerDownload: function (name, filename, contentType, func)
reload: function ()
request: environment
resetBrush: function (brushId)
restoreContext: RestoreContext, R6
rootScope: function ()
saveFileUrl: function (name, data, contentType, extra = list())
sendBinaryMessage: function (type, message)
sendCustomMessage: function (type, message)
sendInputMessage: function (inputId, message)
sendInsertUI: function (selector, multiple, where, content)
sendModal: function (type, message)
sendNotification: function (type, message)
sendProgress: function (type, message)
sendRemoveUI: function (selector, multiple)
session: active binding
setBookmarkExclude: function (names)
setShowcase: function (value)
showProgress: function (id)
singletons:
token: d44d583f13b3cd4ccce43f59fe410f61
unhandledError: function (e)
updateQueryString: function (queryString)
user: NULL
wsClosed: function ()
Private:
.clientData: ReactiveValues, R6
.input: ReactiveValues, R6
.outputOptions: list
.outputs: list
bookmarkCallbacks: environment
bookmarkedCallbacks: environment
bookmarkExclude:
busyCount: 2
closedCallbacks: environment
createBookmarkObservers: function ()
enableTestEndpoint: function ()
fileUploadContext: environment
flushCallbacks: environment
flushedCallbacks: environment
getOutputOption: function (outputName, propertyName, defaultValue)
inputMessageQueue: list
inputReceivedCallbacks: environment
invalidatedOutputErrors: Map, R6
invalidatedOutputValues: Map, R6
outputValues: list
progressKeys: character
registerSessionEndCallbacks: function ()
restoreCallbacks: environment
restoredCallbacks: environment
sendErrorResponse: function (requestMsg, error)
sendMessage: function (...)
sendResponse: function (requestMsg, value)
shouldSuspend: function (name)
showcase: FALSE
storeOutputValues: function (values = NULL)
testEndpointUrl: session/d44d583f13b3cd4ccce43f59fe410f61/dataobj/shinyte ...
testValueExprs: list
websocket: WebSocket
write: function (json)
Una buena forma de explorar el objeto de sesión es jugar con el brillante ejemplo en la galería brillante client-data-and-query-string . Permite see
lo que está contenido, por ejemplo, en la session$clientdata
o cualquier otro elemento del objeto.
Un par de puntos adicionales y engañosamente triviales:
- ¿Cuándo comienza una sesión? Cuando un usuario se conecta con la aplicación brillante
- ¿Cuándo termina una sesión? cuando un usuario se desconecta de la brillante aplicación
Como ejemplo, para mostrar cómo el problema es bastante complejo, si actualizo el navegador, finalizo la sesión actual y creo una nueva.
Al llegar a la session$isClosed()
, esta no es la función correcta para conectarse a una acción específica cuando finaliza una sesión. Esta es en realidad la función de una brillante función de devolución de llamada
onSessionEnded(fun, session = getDefaultReactiveDomain())
Un ejemplo mínimo podría ser el siguiente:
library(shiny)
ui =(
fluidPage(
titlePanel("This is an example")
)
)
server = function(input, output, session){
session$onSessionEnded({
print("Stop!")
stopApp
})
}
runApp(list(ui = ui, server = server))
Si lo intenta, la actualización (o la separación con el navegador ()) imprimirá "Detener" y detendrá la aplicación.
26 de septiembre de 2017 Editar:
En general, creo que es mejor tener cuidado si la continuidad de una sesión es importante (y en cualquier caso, es apropiado probar el código de session
directamente en Shiny Server
o Shiny Server Pro
). Posiblemente los casos de uso más importantes vienen con Shiny Server Pro
, donde cualquier desconexión may
afectar el estado de inicio de sesión, etc.).
También sé que el shiny
equipo ha realizado cambios en estas áreas en versiones recientes. Por ejemplo, parece que mientras onSessionEnded
todavía funciona, posiblemente ya no sea la mejor función para este uso.
Vea el siguiente código como un ejemplo (de la guía de referencia shiny
), usando onStop
, que puede funcionar cuando termina una sesión, así como cuando la aplicación se detiene.
library(shiny)
cat("Doing application setup/n")
onStop(function() {
cat("Doing application cleanup/n")
})
shinyApp(
ui = basicPage("onStop demo"),
server = function(input, output, session) {
onStop(function() cat("Session stopped/n"))
}
)
Tengo algunos problemas para entender cómo funcionan las sesiones en el servidor brillante. Supongo que una sesión termina cuando el usuario cierra el navegador, sin embargo, al usar la print(session$isClosed())
en la función del servidor obtengo una respuesta FALSE
al principio (muy bien) y luego cuando cierro el navegador nada sucede. ¿Alguien puede darme una pista sobre las sesiones de servidor brillante? Me gustaría almacenar parcelas específicas de la sesión para permitir que los usuarios descarguen sus parcelas solamente.