session_set_start_handler 抛出警告
session_set_start_handler throwing warnings
我正在如下编写我自己的会话处理程序以使 Aerospike
作为会话管理器。但是,它会抛出有关会话处理程序的警告。
Warning: session_start(): Cannot find save handler '' - session startup failed in /var/www/session.php on line 165
我已将 session.save_path
和 session.save_handler
的值设置为 php.ini
中的 ""
,因为我想使用以下 [=管理会话数据存储和检索自己 class.
注意:我可以使用默认的 aerospike 会话处理,但它将会话数据保存为字节(十六进制格式),我不能像其他应用程序需要的那样使用它也可以读取此数据,因此我尝试将数据保存为 json 编码字符串。
一个奇怪的行为是 close
方法总是在脚本关闭时被调用,即使 session_set_save_handler
的 return 值为 false!
这有时可以正常工作,有时会抛出如上所示的警告。不确定缺少什么。
代码:
<?php
ini_set( 'display_errors', 1 );
ini_set( 'error_reporting', E_ALL );
define('SESS_ID', '66ac548234f96b48b42e18b2d3d7b73a3f1aceb01fa4c20647d3dcaa055b5099');
class MySessionHandler implements SessionHandlerInterface {
private $database = null;
private $recordKey = null;
public function __construct(){
$this->init();
}
private function init() {
$this->database = new \Aerospike(
[
"hosts" => [
0 => [
"addr" => "IP_HERE",
"port" => 3000
]
]
], false);
$this->recordKey = $this->database->initKey( 'cache', 'data', SESS_ID);
}
private function isConnected() : bool {
return ( $this->database instanceof \Aerospike ) && $this->database->isConnected();
}
public function open($savepath = '', $id = ''){
// If successful
if( is_null($this->database) ) {
$this->init();
}
$status = $this->database->get($this->recordKey, $data);
if ($status == \Aerospike::OK) {
$data = json_decode($data['bins']['PHP_SESSION'], 1);
if( !is_array($data) ) {
$data = [];
}
} else {
$data = [];
}
return true;
}
public function read($id)
{
if( is_null($this->database) ) {
$this->init();
}
$status = $this->database->get($this->recordKey, $data);
if ($status == \Aerospike::OK) {
$data = json_decode($data['bins']['PHP_SESSION'], 1);
if( !is_array($data) ) {
$data = [];
}
} else {
$data = [];
}
$_SESSION = $data;
return json_encode($data);
}
public function write($id, $dataNode)
{
if( is_null($this->database) ) {
$this->init();
}
$data = false;
if( $this->isConnected() ) {
$bins = [
"PHP_SESSION" => json_encode($_SESSION)
];
$status = $this->database->put( $this->recordKey, $bins );
if ($status == \Aerospike::OK) {
$data = true;
} else {
// error while saving data, log it
}
}
return $data;
}
public function destroy($id)
{
$removeStatus = false;
if( $this->isConnected() ) {
$status = $this->database->remove( $this->recordKey );
if ($status == \Aerospike::OK) {
$removeStatus = true;
} else {
// error while saving data, log it
}
}
return $removeStatus;
}
public function close(){
// Close the database connection
if($this->isConnected() && $this->database->close()){
// Return True
return true;
}
// Return False
return false;
}
public function gc($max)
{
return 0;
}
public function __destruct()
{
$this->close();
}
}
$s = new MySessionHandler();
// Set handler to overide SESSION
$newSession = session_set_save_handler($s, true);
var_dump($newSession); // this returns false sometimes and throws a warning
register_shutdown_function('session_write_close');
session_id(SESS_ID);
session_start();
$_SESSION['dfc'] = 'xdc1';
//unset($_SESSION['dfc']);
pr($_SESSION);
unset($s);
function pr($data) {
if( is_object($data) ) {
// $data = serialize($data);
}
echo '<pre>' . var_export($data, 1) . '</pre>';
}
这些警告是间歇性出现的,我不确定是什么原因造成的。任何帮助,将不胜感激。
Aerospike 的 PHP 客户端附带了一个 session handler. Set session.save_handler=aerospike
. See the php.ini
options 模块。
如果您正在编写自己的会话处理程序
- 不要设置
session.save_handler=''
。你想在你的 php.ini 中注释掉它,因为它首先被加载和执行(在你的脚本之前)并且它是没有意义的。没有这样的处理程序。这应该会抑制警告。
- 注意空字节。 PHP 字符串可以在中间有那些,但 Aerospike 字符串将在那里终止,因此它会在该点被截断。阅读有关 Handling Unsupported Types, which is why you're provided the
\Aerospike\Bytes
包装器 class. 的文档
我正在如下编写我自己的会话处理程序以使 Aerospike
作为会话管理器。但是,它会抛出有关会话处理程序的警告。
Warning: session_start(): Cannot find save handler '' - session startup failed in /var/www/session.php on line 165
我已将 session.save_path
和 session.save_handler
的值设置为 php.ini
中的 ""
,因为我想使用以下 [=管理会话数据存储和检索自己 class.
注意:我可以使用默认的 aerospike 会话处理,但它将会话数据保存为字节(十六进制格式),我不能像其他应用程序需要的那样使用它也可以读取此数据,因此我尝试将数据保存为 json 编码字符串。
一个奇怪的行为是 close
方法总是在脚本关闭时被调用,即使 session_set_save_handler
的 return 值为 false!
这有时可以正常工作,有时会抛出如上所示的警告。不确定缺少什么。
代码:
<?php
ini_set( 'display_errors', 1 );
ini_set( 'error_reporting', E_ALL );
define('SESS_ID', '66ac548234f96b48b42e18b2d3d7b73a3f1aceb01fa4c20647d3dcaa055b5099');
class MySessionHandler implements SessionHandlerInterface {
private $database = null;
private $recordKey = null;
public function __construct(){
$this->init();
}
private function init() {
$this->database = new \Aerospike(
[
"hosts" => [
0 => [
"addr" => "IP_HERE",
"port" => 3000
]
]
], false);
$this->recordKey = $this->database->initKey( 'cache', 'data', SESS_ID);
}
private function isConnected() : bool {
return ( $this->database instanceof \Aerospike ) && $this->database->isConnected();
}
public function open($savepath = '', $id = ''){
// If successful
if( is_null($this->database) ) {
$this->init();
}
$status = $this->database->get($this->recordKey, $data);
if ($status == \Aerospike::OK) {
$data = json_decode($data['bins']['PHP_SESSION'], 1);
if( !is_array($data) ) {
$data = [];
}
} else {
$data = [];
}
return true;
}
public function read($id)
{
if( is_null($this->database) ) {
$this->init();
}
$status = $this->database->get($this->recordKey, $data);
if ($status == \Aerospike::OK) {
$data = json_decode($data['bins']['PHP_SESSION'], 1);
if( !is_array($data) ) {
$data = [];
}
} else {
$data = [];
}
$_SESSION = $data;
return json_encode($data);
}
public function write($id, $dataNode)
{
if( is_null($this->database) ) {
$this->init();
}
$data = false;
if( $this->isConnected() ) {
$bins = [
"PHP_SESSION" => json_encode($_SESSION)
];
$status = $this->database->put( $this->recordKey, $bins );
if ($status == \Aerospike::OK) {
$data = true;
} else {
// error while saving data, log it
}
}
return $data;
}
public function destroy($id)
{
$removeStatus = false;
if( $this->isConnected() ) {
$status = $this->database->remove( $this->recordKey );
if ($status == \Aerospike::OK) {
$removeStatus = true;
} else {
// error while saving data, log it
}
}
return $removeStatus;
}
public function close(){
// Close the database connection
if($this->isConnected() && $this->database->close()){
// Return True
return true;
}
// Return False
return false;
}
public function gc($max)
{
return 0;
}
public function __destruct()
{
$this->close();
}
}
$s = new MySessionHandler();
// Set handler to overide SESSION
$newSession = session_set_save_handler($s, true);
var_dump($newSession); // this returns false sometimes and throws a warning
register_shutdown_function('session_write_close');
session_id(SESS_ID);
session_start();
$_SESSION['dfc'] = 'xdc1';
//unset($_SESSION['dfc']);
pr($_SESSION);
unset($s);
function pr($data) {
if( is_object($data) ) {
// $data = serialize($data);
}
echo '<pre>' . var_export($data, 1) . '</pre>';
}
这些警告是间歇性出现的,我不确定是什么原因造成的。任何帮助,将不胜感激。
Aerospike 的 PHP 客户端附带了一个 session handler. Set session.save_handler=aerospike
. See the php.ini
options 模块。
如果您正在编写自己的会话处理程序
- 不要设置
session.save_handler=''
。你想在你的 php.ini 中注释掉它,因为它首先被加载和执行(在你的脚本之前)并且它是没有意义的。没有这样的处理程序。这应该会抑制警告。 - 注意空字节。 PHP 字符串可以在中间有那些,但 Aerospike 字符串将在那里终止,因此它会在该点被截断。阅读有关 Handling Unsupported Types, which is why you're provided the
\Aerospike\Bytes
包装器 class. 的文档