2013-05-02 53 views
2

我有一個不尋常的問題。我需要能夠爲任何給定用戶的會話(除我自己的會話之外)手動更改會話變量。該應用程序管理呼叫中心的員工。用php手動將變量寫入會話文件

每個用戶都有一個名爲「狀態」的會話變量,它可以等同於「在線」,「通話中」,「中斷」等。

當用戶在休息時,他們的$_SESSION['status']更改爲「中斷」。有些人習慣於不點擊「開始休息」按鈕,所以我的老闆問我是否可以授予她功能,將人員從她的管理員級帳戶中註銷。

我不想將「打破」功能轉換爲使用數據庫,因爲這將是一個額外的查詢,我不得不手動添加到大約50個文件。

我知道傳統上這是不可能的,但我希望有一些非常規的答案。例如,通過打開和寫入服務器本身的會話文件,這可能嗎?

+0

任何人都可以嗎?我試圖通過這種方式工作,但迄今爲止沒有運氣。 – cream 2013-05-02 06:31:51

回答

0

原來,這不僅可能,而且非常簡單。首先,將當前的session_id()保存到一個變量中,然後保存session_write_close(),然後使用要編輯的會話的會話ID開始一個新會話,編輯會話,然後再次session_write_close,並使用session_id啓動會話備份保存在上述變量中​​。

$temp = array(); 
$temp['tempid'] = session_id(); 
foreach($_SESSION as $key=>$val){ 
    $temp[$key]=$val; 
} 
$MESSAGE = "<h2>You have been remotely logged out by admin.</h2><h3>Please see ".$_SESSION['fname']." ".$_SESSION['lname']." before returning to work.</h3>"; 
session_write_close(); //end admin sesh 

session_id($_GET['session']); //start remote sesh 
session_start(); 

//Make changes to remote sesh here 

session_write_close(); 

session_id($temp['tempid']); //restart local sesh 
session_start(); 
foreach($temp as $key=>$val){ 
    $_SESSION[$key]=$val; 
} 
1

退房http://php.net/manual/en/function.session-id.php

無論你正在嘗試做的,試圖修改會話變量。如果不涉及數據庫,我不認爲有這樣做是真的。您可以使用session_id()來存儲您的主管會話ID,將她的$ _SESSION更改爲其他用戶,更改狀態,然後將其更改回自己的會話中,但我不知道如何獲取其會話ID在會話開始時放置在數據庫中的第一位。

修復無論發生什麼事情需要你改變50個不同的文件來添加一小塊功能可能會在長遠來說比「非傳統的答案」更好地爲您服務。

+0

這或多或少是我想要做的。所有會話ID在數據庫中都可用,但會話變量不是。我想我會給這個鏡頭。 – cream 2013-05-02 07:14:09

1

據我所知,你需要刪除一個用戶的會話才能將他註銷。您可以物理刪除服務器上的特定用戶會話文件,但它很脆弱且不安全(恕我直言)。

最好是在數據庫中保存會話,然後你可以很容易地操作/刪除它。編寫自定義會話處理程序的官方指南是here

如果你不想自己寫,你可以使用第三方解決方案,例如, this one

1

如果您使用的是Apache服務器,會將任何類型的會話創建保存在名爲tmp的文件夾中,名稱爲「sess409080ffgfsfs.tmp」。現在你只需要找出哪一個現存的文件是你正在尋找的文件。