РЕДАКТИРОВАТЬ - 2: См. Решение Сэма для случая. Старые методы, которые я все еще оставлю здесь, а также саму проблему, но новое решение было построено на основе решения Сэма, и оно доступно в репозитории на github для проекта, который я храню
РЕДАКТИРОВАТЬ - 1: ПОСМОТРЕТЬ МЕТОД уничтожить (id) для обхода
В настоящее время у меня есть необходимость в некоторых случаях в моей Системе, которая требует обновления сеанса других пользователей с новым значением. Текущий случай теперь требует изменения одного значения в файле сеанса некоторых пользователей при выполнении определенного действия.
В моем проекте я создал класс SessionHandlerCustom, который реализует SessionHandlerInterface, и с этим я реализовал логику, которая создает сеанс Custom с идентификатором для каждого пользователя. Я могу получить доступ к файлу в пользовательском каталоге, но, как ни странно, я не могу использовать file_put_contents или file_get_contents для этих файлов сеанса. Я попытался обойти функции Session, и с помощью функции read (), представленной в SessionHandlerCustom, я смог получить все содержимое сеанса пользователя, используя его SessionId.
Рабочий метод, SessionFileGetValueByHashCode , - это тот, который получает содержимое из сеанса, и с некоторым ключом (обычно это имя поля, которое я хочу в файле) он получит именно эту строку ключ с его значениями.
Второй метод, который вообще не работает, это тот, который на самом деле изменит значение в сеансе, но он просто не работает. Я попытался манипулировать файлом напрямую, но безуспешно, и попытался использовать метод SessionHandlerCustom-> write (), но он не дал никакого эффекта.
Может ли кто-нибудь помочь мне и объяснить, как правильно изменить / манипулировать сеансом другого пользователя?
Пример системы: зарегистрирован обычный пользователь, в то же время администратор использует функции администратора и изменяет некоторые значения для этого пользователя. Если значение не является чем-то, полученным из базы данных каждый раз, переменная сеанса для текущего пользователя, вошедшего в систему, должна изменить свое значение.
Если вам интересно, система с открытым исходным кодом, и вы можете получить к ней доступ здесь:
https://github.com/msiqueira-dev/InfraTools
\*
This should be in the class that implements SessionHandlerInterface. This will actually delete the users session and force it to reload the whole session when it makes another request. The $SavePath variable is variable create and stored with the directory folder of the Session.
*/
public function destroy($id)
{
$file = $this->SavePath . "/sess_" . $id;
if (file_exists($file))
unlink($file);
return true;
}
SessionFileGetValueByHashCode
//The &$Value will be filled with the whole $Key and its values presented in the Session File. For example: SomeValue|s:0:"";
public function SessionFileGetValueByHashCode(&$Value, $Application, $SessionId, $Key)
{
$Value = NULL;
if(isset($Application) && !empty($Application) && isset($SessionId) && !empty($SessionId) && isset($Key) && !empty($Key))
{
$file = SESSION_PATH . $Application . "/sess_" . $SessionId;
if(file_exists(($file)))
{
$str = $this->InstanceSessionHandlerCustom->read($SessionId);
$start = strpos($str, $Key);
$end=$start;
while($str[$end] != '"')
{
$Value .= $str[$end];
$end++;
}
$Value .= '"';
$end++;
while($str[$end] != '"')
{
$Value .= $str[$end];
$end++;
}
$Value .= '"';
if($Value != NULL)
return Config::RET_OK;
}
}
return Config::RET_ERROR;
}
SessionFileUpdateValueByHashCode
public function SessionFileUpdateValueByHashCode($Application, $SessionId, $OldValue, $NewValue)
{
if(isset($Application) && !empty($Application) && isset($SessionId) && !empty($SessionId)
&& isset($OldValue) && !empty($OldValue) && isset($NewValue) && !empty($NewValue))
{
$file = SESSION_PATH . $Application . "/sess_" . $SessionId;
if(file_exists(($file)))
{
$str = $this->InstanceSessionHandlerCustom->read($SessionId);
$str = str_replace($OldValue, $NewValue, $str, $count);
if($count > 0)
{
echo $str . "<br>";
if($this->InstanceSessionHandlerCustom->write($SessionId, $str))
return Config::RET_OK;
}
}
}
return Config::RET_ERROR;
}