推荐的检测会话的方法

时间:2010-12-29 17:39:19

标签: php session

我创建了一个小类来生成带有外部程序的缩略图(来自ImageMagick的gm,以防您感兴趣)。该类会发出exec()调用以启动gm.exe但我遇到了一个PHP bug,当有并发执行并且有一个打开的PHP会话时,会使httpd.exe冻结。有一种解决方法如下:

session_write_close();
exec('gm convert -resize 100x100 source.jpg target.jpg');
session_start();

到目前为止一切顺利。现在我想在其他现在和将来的项目中重用缩略图类。如果我希望能够删除代码并在不进行更改的情况下调用它,我需要在不是会话时省略会话解决方法,我需要以编程方式执行此操作。否则,我的缩略图会产生令人讨厌的副作用,即自行启动会话。

如何正确检测是否存在活动会话?或者,换句话说,调用我的函数的PHP脚本是否已发出对session_id()和“避难所”的调用t以任何方式关闭或销毁会话,因此操作系统可能持有一个锁定会话文件的打开句柄,以便其他可能冻结httpd.exe的正在运行的进程无法访问它。

我试过这个:

if( session_id() ){
    session_write_close();
    exec('gm convert -resize 100x100 source.jpg target.jpg');
    session_start();
}

但是我注意到session_id()如果脚本曾经使用过会话就返回一个值,即使它们此时没有活动。如果脚本已使用session_write_close()关闭会话...我的缩略图将再次打开它!

3 个答案:

答案 0 :(得分:1)

你真的不能。看起来没有任何功能可以做到这一点。 http://www.php.net/manual/en/book.session.php

您可以对session_save_path()返回的目录中的文件进行一些分析。但是,对于使用不同平台和非标准会话处理程序,您可能会遇到问题。

答案 1 :(得分:1)

我找到的唯一方法是使用session_regenerate_id(),如果没有活动会话,则返回false。但是这有一个明显的缺点,它可能会破坏之后依赖旧会话ID的脚本。

答案 2 :(得分:1)

PHP中没有任何方法可以执行此操作。我最终不得不做一些简单的包装器函数来检查一个全局变量(bleah),这是我的session-start包装器函数在第一次启动会话时设置的。