捕获PHP中的会话创建错误


Catch session creation error in PHP

我希望能够在PHP中捕获会话创建中的错误。我的主要目标是能够知道问题的原因。是因为我们没有写入会话的文件夹的写入权限,还是因为我们没有可用的磁盘空间。

所以我们当然要从这个开始。

session_start();

从这篇文章中,检查会话是否已设置,如果未创建会话?我确实尝试添加

 if(session_id() == '')
 {
      // session has NOT been started
      session_start();
      echo "Session is started";
 }
 else
 {
      // session has been started
 }

为了测试这一点,我使用命令删除了/tmp/中该组和其他组的写入权限

chmod 755 tmp/

但根据我的测试,我仍然看到会话已经开始。有趣的是,我可以登录,但当我试图注销时,我不能。

任何关于如何正确获得会话创建错误原因的见解都将得到极大的重视。谢谢

编辑:

我试过弗雷德里克的建议并做到了。

try{
    // Start session
    session_start();
    echo "Session started. " . session_id();
}catch(Exception $e){
    echo "Session not started. " . $e->getMessage();
}

但我仍然看到这个

会话已启动。fa505cbf4b23277369008495fd08b9f

即使我已经具有删除/tmp的写入权限。尝试接球似乎没能很好地抓住问题。

您可能想要尝试is_writeable函数。

类似于:

<?php
    $dirname = '/tmp';
    if (is_writable($dirname)) {
        echo 'The folder is writable';
    } else {
        echo 'The folder is not writable';
    }
?>

您可以将其用于文件或文件夹。

更多信息:http://id1.php.net/is_writable

Frederik建议我检查/tmp是否有写权限,我决定在检查用户名和密码之前只检查写权限和磁盘空间。所以我写了这个代码

if (is_writable(session_save_path())){
    if ( $diskfree is <= 0){
        // check for authentication here
    }else{
        header("Location: login.php?error=true&nodisk=true");
        return;
    }
}else {
    header("Location: login.php?error=true&nowrite=true");
    return;
}

然后在login.php中,我用这个来捕获错误代码。

// If we have an error show error message
if (  isset($_GET["error"]) && $_GET["error"]  ) {
    //If not enough disk space show disk space message
    if( isset($_GET["nodisk"]) && $_GET["nodisk"] ){
        alert("disk free problem");
    }
    //If we don't have permission to session save path show session creation error
    if( isset($_GET["nowrite"]) && $_GET["nowrite"] ){
        alert("write permission error");
}