無標題文檔

诡异的 Session 丢失问题

由于服务器损坏 ,所以不得不重新发布网站。当 Anakin 兄弟全部将环境搞定,并且 Gracecode.com 也能正常浏览的时候,我发现我的网站竟然不能登录了。

起初,我怀疑是环境问题,于是我联系 Anakin 兄,他说一切正常。于是,我就开始检查起我的代码,几段 DEBUG 代码下来,我发现竟然连 POST 数据都收不到(var_dump($_POST);),而 GET 是正常的!非常地让人匪夷所思。

继续 DEBUG 发现,我输错了用户名和密码是能 var_dump 出 POST 与 SESSION 的,一切正常。唯独就是我输入正确的用户名与密码以后,老问题就出现了。

经过充分的调试与徘徊以后,我开始静下心来思索 Session 的流程:Session 由客户端的 Cookie(或者是其他验证方式)提供验证值,然后服务器端根据这个值,从文件系统(或者数据库、或者内存文件系统、任何你想得到的媒介)获得对应的值。

https://friable.rocks/_/2009_11_05/4945852f554a.jpg

那么先从客户端入手,看看是否存在异常。首先,查看客户端是否有保存的 Cookie,的确是有的 -- 这就证明客户端是没有问题的。继续推断,既然客户端方面问题不大,那么问题到底是出在哪里呢?

登录不进去,那么我将判断是否登录的函数修改成始终返回 true(请未成年的小朋友在家长的陪同下操作)。发现登录后台与操作一切都没有问题的,这就说明 POST 过去的数据服务器也是能够接收的。

那么,单从这点上说明,肯定是服务器端的 Session 出了问题。我打印出 Session 的配置,如下图。

https://friable.rocks/_/2009_11_05/3985052f554a.jpg

根据我的经验,并没有发现配置上有什么异常的地方。此时,我突然有种「邪恶」的想法,于是乎就 DEBUG 了下述的代码

var_dump(is_writeable(ini_get("session.save_path")));

噢,「卖蛋糕、牙膏、×膏药」的!竟然返回的是 false,看来 Anakin 这小子又要被我「诅咒」了。问题终于有了个水落石出的结果,原来新安装好的系统,忘记把 session.save_path 设置成可写的了。这样导致登录成功以后,需要写入的 Session 无法保存在文件系统中,而此时 Session 的的确确有又是 start 的。

绕过这一问题很简单,只需要在 session_start 之前用 session_save_path 设置成自己的某个可读的目录就可以了。

马上联系 Anakin 兄那小子,并将相应的目录修改了回来。证明我的推断是正确的,现在又可以登录进去了。至于 POST 为何无法接收到,在事后也找到了原因,是因为 301 重定向带到了新的页面。

看来,忙乱中,总是会出现不大不小的问题,共勉之。

Smarty Cheat Sheet

本人很喜欢偷懒,所以很喜欢 Cheat Sheet 快速查找一些东西。现在,网络上找到份 Smarty 的 Cheat Sheet。 Smarty 一直我都认为是一个好东西,所以这份 Cheat Cheet 对于我来说会很重要。

另外还有 jQuery 和 Prototype 的 Cheat Sheet 以及 MySQL 的 Cheat Sheet 提供下载(实在是居家旅行,开发糊口的必备利器)。

废话不多说,在这里提供 ZIP 格式打包下载 。此文档为 PDF 格式,出处在 这里

另外,还有一位 更牛的家伙收集了大量的 Cheat Sheet ,看来还有比我更懒的。

转换字符串至 NCR

看见 PHPChina 上转帖 andot 的一篇文章《 在任意字符集下正常显示网页的方法 》,非常的受用,于是将代码粘贴到这里收藏一下。

同个页面呈现不同语言字符的编码使用 UTF-8 是目前主流的应用方案。但是在一些极端的情况下,我们不得不在某些西方字符编码的页面上显示中文。

这时候,作者非常「取巧」地想到了使用 Numeric character reference 解决这一问题。原理引述原文:

原理很简单,就是把除了 ISO-8859-1 编码中前 128 个字符以外的所
有其他的编码都用 NCR(Numeric character reference) 来表示。比如
「汉字」这两个字,如果我们写成「汉字」这种形式,
那么它在任意字符集下都可以正确显示。

下面是我做的一些无关痛痒的修改,希望作者见谅:

/**
 * nochaoscode - 转换字符串至 NCR
 *
 * @param  string $str     原字符串
 * @param  string $encode  原字符串的编码,默认 UTF-8
 * @return string 原字符串的 NCR 字符
 * @see http://en.wikipedia.org/wiki/Numeric_character_reference
 */
function nochaoscode($str, $encode = "utf-8")
{
    if (!function_exists("iconv") || !function_exists("mb_strlen")) {
        return $str;
    }

    $str = iconv($encode, "utf-16", $str); 
    for ($i = 0; $i < mb_strlen($str); $i+=2) { 
        $code = ord($str{$i}) * 256 + ord($str{$i + 1}); 
        if ($code < 128) {
            $output .= chr($code); 
        } else if ($code != 65279) {
            $output .= "&#" . $code . ";"; 
        }
    }

    return $output; 
}

原作者的 DEMO 在这里 ,但是不知道什么原因我打不开,请各位了解的告之。

我的照片

嗨!我叫「明城」,八零后、码农、宁波佬,现居杭州。除了这里,同时也欢迎您关注我的 GitHubTwitterInstagram 等。

这个 Blog 原先的名字叫 Gracecode.com 、现在叫 「無標題文檔」 。 要知道作为码农取名是件很难的事情,所以不想在取名这事情上太费心思。

作为八零后,自认为还仅存点点可能不怎么被理解的幽默感,以及对平淡生活的追求和向往。 为了避免不必要的麻烦,声明本站所输出的内容以及观点仅代表个人,不代表自己所服务公司或组织的任何立场。

如果您想联系我,可以发我邮件 `echo bWluZ2NoZW5nQG91dGxvb2suY29tCg== | base64 -d`

分类

搜索

文章