我创建了一个小类来生成带有外部程序的缩略图(来自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()
关闭会话...我的缩略图将再次打开它!
答案 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包装器函数在第一次启动会话时设置的。