如何杀死PHP会话?

时间:2011-04-24 15:40:49

标签: php sockets session hang

此常规主题之前出现过,hereherehere,毫无疑问,互联网上的其他地方也是如此。在我的情况下,与这些不同,挂起来自一个永远不会得到消息的阻塞套接字,也许这就是为什么那里描述的解决方案对我没用。我正在开发一个C ++应用程序,它通过本地套接字连接与php脚本进行通信,当C ++应用程序崩溃时,它会让php脚本的套接字等待永远不会发出的消息。我尝试过使用session_destroy和session_unset(在session_start之前的脚本中先调用它们),但它们不起作用;即使退出并重新启动浏览器也无济于事。如果我删除session_start,重新加载脚本然后通过客户端结束会话,我只能停止会话。如何在不必经历的情况下杀死会话?

编辑:我忘了提及,我也尝试用

计时套接字
socket_set_option($socket,0, SO_RCVTIMEO, array("sec"=>1, "usec"=>0));

但是我收到了“无效操作”错误,但它没有用。

编辑2:按照提示here设置手动超时,运行良好。我仍然不知道如何杀死一个例如卡在一个无限循环中,但是很好。

2 个答案:

答案 0 :(得分:3)

  

如何在不必经历的情况下杀死会话?

您拥有的问题不是将通过终止会话来解决的问题。

  

挂起来自一个永远不会收到消息的阻塞套接字

如果您使用的是默认的PHP会话处理程序,则意味着PHP正在对该文件进行锁定。只要该锁存在,其他任何PHP进程都无法操作会话。

这里有几个选项。

首先,考虑implementing you own session save routines,这意味着您可以完全控制会话数据是否存在任何类型的锁定。你可以根本不包含任何锁定,这将允许运行但挂起的PHP脚本继续在和平幸福中运行。这是最复杂的选择。

其次,您确定长时间运行的套接字脚本需要会话数据吗?如果没有,您只需提前结束会话并通过调用session_write_close释放锁定。这将释放锁,但是当套接字关闭时它实际上不会结束长时间运行的脚本。

第三,在长时间运行的脚本中查看使用套接字超时。我不确定你在这里使用套接字的确切方法是什么,并且在PHP中使用它们的经验很少,所以我不能提出具体的功能建议。

答案 1 :(得分:1)

也许你可以给套接字超时?例如socket_select有一个超时参数。

1000s作为超时的值可能太高,因为apache之前可能已经杀死了该进程(请参阅max_execution_time中的php.ini