在PHP中捕获会话创建错误

时间:2013-12-11 13:19:22

标签: php session login

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

当然,我们将从此开始。

  

在session_start();

并从这篇文章Check if session is set or not, and if not create one?我尝试添加

 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();
}

但我仍然看到这个

  

会话开始了。 fa505cbf4b232773669008495fd08b9f

即使我已经删除了对/ tmp的写入权限。似乎try catch无法正确解决问题。

2 个答案:

答案 0 :(得分:1)

您可能想尝试使用is_writable函数。

类似的东西:

<?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

答案 1 :(得分:0)

根据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");
}