深入研究 PHP 的 SESSION 阻塞问题

最近在一个基于 Web 的 IM 项目中,我采用异步向服务器发起请求拉取最新的聊天内容,服务器端通过 PHP 处理拉取请求,拉取过程是用 10 次循环查询数据库是否有最新的聊天内容。如发现新内容,则立即向浏览器输出,并结束掉本次请求的进程。在这 10 次的循环中,每次查询数据库后,均通过 Sleep 函数让进程暂停 1 秒,那么这个 PHP 进程可能会在服务器端保持 10 秒。

在测试过程中,我发现当这个拉取请求运行期间,其他向服务器端 PHP 发起的请求,均受到影响,响应变的非常慢。

经过一系列的排查,问题始终得不到解决,但当把代码中涉及到 SESSION 的部分全部跳过时,情况发生了变化,所有 PHP 进程都恢复正常的响应速度了。由此,联想到问题可能出在了 SESSION 阻塞机制上了。

阅读更多

用PHP实现验证码功能

先看看调用方法:

<img id="vcodeimages" src="vcodeimages.php"
 onclick="this.src='vcodeimages.php?t='+Math.random()"
 style="cursor:pointer;" alt="点击刷新验证码" />

 

上面的代码中,img标签的src指向了一个名为vcodeimages.php的文件,这个文件就是负责实现生成验证码图片的PHP程序,下面我们看看vcodeimages.php文件的代码,也是验证码的实现方法:

<?php
session_start();
header("Content-type: image/png");
$VerifyCode     = "";
$im             = ImageCreate(50, 20); //开始创建图形
$color_bg       = ImageColorAllocate($im, 255, 255, 255); //定义背景颜色
$color_font     = ImageColorAllocate($im, 0, 0, 0); //定义文字颜色
$color_pixel    = ImageColorAllocate($im, 0, 0, 0); //定义干扰像素颜色
for($i=0; $i<4; $i++) { //加入随机数
    $RandNum = strval(mt_rand("1", "9"));
    $VerifyCode .= $RandNum;
    ImageString($im, 5, ($i * 11) + 4, 2, $RandNum, $color_font);
}
for($i=0; $i<200; $i++) { //加入干扰象素
    ImageSetPixel($im, rand() % 70, rand() % 30, $color_pixel);
}
$_SESSION["VerifyCode"] = $VerifyCode; //将验证码存入Session
ImagePNG($im); //以PNG格式建立图形
ImageDestroy($im); //结束创建图形
?>

 

阳光部落原创,更多内容请访问 http://www.sunbloger.com/

关于PHP的Session过期问题

在PHP开发过程中,可能有朋友经常会遇到Session所产生的文件无法自动清除的问题,其实并非真的无法清除,而是有一个概率问题,只要你的站点访问量足够大,那些文件就可以自动被清除掉。如果访问量比较少,又看那些文件不顺眼的话,只要在php.ini里的配置一下即可实现Session文件自动清除的功能,具体配置如下:

找到

session.gc_probability = 1

session.gc_divisor = 1000

上面这两项参数其实就是这个概率,默认情况下是1/1000

将 session.gc_divisor = 1000  改为 session.gc_divisor = 100 即可

如果想达到完全的实时,那么可以把这个参数改为1,这样概率就是100%了,呵呵!^^