【问题标题】:How to kill a PHP session?如何杀死 PHP 会话?
【发布时间】:2011-08-11 21:42:26
【问题描述】:

这个一般性话题之前出现过,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 设置手动超时,效果很好。一般来说,我仍然不知道如何杀死一个会话,例如陷入了无限循环,但还好。

【问题讨论】:

  • 好的,现在值 1 我不知道,问题是什么:)
  • @levu 看起来这个选项甚至还没有设置好。你不能为本地套接字设置 SO_RCVTIMEO 吗?我看不出我的语法有什么问题。 '0' 作为协议适用于 socket_create。

标签: php sockets session freeze


【解决方案1】:

我怎样才能在不经历的情况下终止会话?

您遇到的问题不是可以通过终止会话来解决的问题。

挂起是由于从不收到消息的阻塞套接字

如果您使用默认的 PHP 会话处理程序,这意味着 PHP 正在对该文件进行锁定。只要该锁存在,就没有其他 PHP 进程能够操作会话。

这里有几个选项。

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

第二,你确定长时间运行的套接字脚本需要写入会话数据吗?如果没有,您可以简单地提前结束会话并通过调用session_write_close 释放锁定。这将释放锁,但它实际上不会在套接字关闭时结束长时间运行的脚本。

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

【讨论】:

  • 为了测试你的想法,我为本地套接字使用了一个不同的文件——/tmp/sock1 而不是 /tmp/sock。该文件是新文件,因此 php 无法对其进行锁定。它仍然挂起,实际上从未达到那个点——它挂在 login.php 的第一行,即 session_start。
  • @Matt,锁在 session 文件上。 session_start 阻塞等待锁释放。
  • @Charles 好的,谢谢,我对 php 很陌生,此时可能很明显。 :) session_write_close 也不起作用,只能重新启动浏览器。
  • @Matt,所以在获取您需要的会话数据之后但在使用套接字之前将session_write_close 添加到长时间运行的脚本中不会释放锁定? (将它添加到其他脚本中没有任何作用——您需要在长时间运行的脚本中使用它,这样它才会释放锁。)
  • @Charles,我能说什么?我把 session_write_close 放在我使用的每个 php 脚本的顶部,删除了 session_start,这样我就可以在不挂起的情况下运行每个脚本,但是当我把 session_starts 放回去时,它挂在 login.php。
【解决方案2】:

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

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

【讨论】:

  • 谢谢,这当然是显而易见的解决方案,我忘了说我已经尝试过了(见编辑)。
  • 这太愚蠢了——我在想毫秒。将 sec 设置为 1,同样的问题,即使我注释掉 session_start。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-19
  • 2012-09-27
相关资源
最近更新 更多