Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá amigos, boa noite.
Depois de muito vasculhar em fóruns e materiais de apoio resolvi pedir socorro. :)
Preciso saber se existe algum método (ou gambiarra rsrsr) que torne possível eu acessar uma variável $_SESSION de outra sessão.
$GLOBALS, não resolve o problema, nem outras "superglobais" porque todas as informações que consigo "recuperar" são da sessão em que o script PHP está sendo executado.
O que eu estou tentando fazer: Reduzir os acessos contínuos ao banco de dados. O Objetivo é colocar em uma sessão de administrador para rodar um script que faz um select no banco de dados, guarda essas informações em um $_SESSION[]Array(), esse array só será gravado no banco de dados a cada 5 minutos, durante este intervalo ele sofrerá alterações feitas pela sessão de administrador. Gostaria de pegar esta mesma variável em todas as outras sessões para exibir as informações atualizadas sem ter que buscá-las no banco de dados.
function grava_banco(){
if(!$_SESSION["banco"]){
$_SESSION["banco"] = retorna_banco("SELECT * FROM clientes");
}else{
$banco = $_SESSION["banco"];
echo "Banco ja existe atualizando...<br />";
foreach($banco as $BD){
if($BR["deleta"] == 1){
mysql_query("DELETE FROM clientes WHERE ID = '" . $BD["ID"] . "';");
}
if($BD["novo"] == 1){
mysql_query("INSERT INTO clientes (...) VALUES (...);");
}else{
mysql_query("UPDATE clientes SET ... WHERE id ='" . $BD["ID"] . "';");
}
}
}
}
Dei uma resumida no código, mas dá pra entender o que estou fazendo ai... :)
Então, é possível alguém em uma outra sessão, outro navegador ou computador, pegar as informações de $_SESSION["banco"]?
Agradeço desde já (por você ter lido tudo isso hehehe).
Primeiramente muitíssimo obrigado pela resposta.
O desempenho é praticamente o mesmo uma vez que o PHP por padrão guarda os dados da sessão em arquivos.
Se essa informação procede, você me deu uma ideia, porque, eu imaginei que apenas o "id" da session era guardada em arquivo, mas que as variáveis referentes aquele ID ficavam na memória do servidor. Porque eu digo que me deu uma idéia: Já estou usando este método que disse estar "tentando" fazer ai em cima, de que forma? Já que não consegui pegar as variáveis referentes a outra session, resolvi deixar a session de administrador carregar o banco e efetuar todos os cálculos necessários / filtros, e periodicamente gravar essas informações no banco de dados, e na sessão cliente fazer uma seleção apenas no banco de dados a cada "ciclo". Com isso deixei tudo umas 20x mais rápido. É que para o sistema que estou criando, eu quero que, assim que alguém com a sessão admin fizer uma alteração, ela seja vista instantaneamente (de forma dinâmica, sem clicks ou refreshes) por todas as outras sessios (para isso estou usando uma combinação com javascript que trata de invocar o arquivo php e efetuar a atualização na página a cada ciclo. Isso já está funcionando, mas com seu comentário vou experimentar guardar os dados da session admin em um arquivo de texto, e deixar as demais sessions sem acesso ao banco de dados. Elas lidariam apenas com o arquivo que estaria sendo atualizado constantemente. Meu medo em relação a isso é a questão dos acessos simultâneos a este arquivo, mas como apenas um será para gravação, os outros apenas leitura, pode funcionar. Vou testar.
Mais uma vez obrigado por tentar ajudar no raciocínio.
PS: Mas que seria bem mais simples ter alguma coisa como: session_use_var($session_adm)["banco"] (onde $session_adm eu pegaria no banco de dados 1 vez apenas), isso seria. ;)
É que para o sistema que estou criando, eu quero que, assim que alguém com a sessão admin fizer uma alteração, ela seja vista instantaneamente (de forma dinâmica, sem clicks ou refreshes) por todas as outras sessios (para isso estou usando uma combinação com javascript que trata de invocar o arquivo php e efetuar a atualização na página a cada ciclo. Isso já está funcionando, mas com seu comentário vou experimentar guardar os dados da session admin em um arquivo de texto, e deixar as demais sessions sem acesso ao banco de dados. Elas lidariam apenas com o arquivo que estaria sendo atualizado constantemente. Meu medo em relação a isso é a questão dos acessos simultâneos a este arquivo, mas como apenas um será para gravação, os outros apenas leitura, pode funcionar. Vou testar.
hum... entendi..
a idéia está correta. No que puder maximimar a performance, melhor será o aplicativo.
O ponto negativo nesse tipo de técnica é quando precisar expandir o sistema. Um simples load balance causará conflitos entre os dados pois um server não enxergará a sessão PHP de outro server.
É até possível fazer mas aí terá que desenvolver uma enorme gambiarra que no final das contas, compensaria ter mantido no banco de dados.
Em suma, avalie primeiramente se o sistema necessitará de multiplos servers futuramente.
Caso tenha plena certeza de que isso nunca ocorrerá, mantenha do jeito que está fazendo.
Não sei se o sistema chegará a ser expandido para múltiplos servidores hinom (caso seja preciso a alteração necessária será bem simples, só voltar a utilizar a função de leitura através do banco, que já tenho), por hora agradeço as considerações. Me levaram a deixar o sistema bem mais rápido com o uso do arquivo diretamente no servidor, e tornou o acesso ao banco bem mais suave.
Valeu mesmo! Abraço.
O princípio é bom, mas a forma como você está pensando em fazer é gambiarra mesmo. A sessão funciona da seguinte forma: quando o usuário acessa seu site e a sessão é ativada o navegador começa a trabalhar com um cookie que identifica a sessão navegador/usuário. Ao receber essa identificação o PHP lê os dados de um arquivo que representa o id de sessão que o navegador enviou. Simples assim, mas também existem funções para manipular o tratamento desse id e a forma como a sessão será guardada, como guarda-las em um banco de dados por exemplo.
Então criar uma sessão global seria a mesma coisa que guardar esses dados em um arquivo e ler eles através de uma classe/função especializada. O desempenho é praticamente o mesmo uma vez que o PHP por padrão guarda os dados da sessão em arquivos.