我希望能够在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无法正确解决问题。
答案 0 :(得分:1)
您可能想尝试使用is_writable函数。
类似的东西:
<?php
$dirname = '/tmp';
if (is_writable($dirname)) {
echo 'The folder is writable';
} else {
echo 'The folder is not 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");
}