【问题标题】:PHP $_SESSION- comparison between scriptsPHP $_SESSION-脚本之间的比较
【发布时间】:2022-10-24 17:26:12
【问题描述】:

服务器上有一个 PHP 脚本,它运行大约 20 - 30 秒,具体取决于它正在处理的文件的大小。

为了在新实例启动时停止正在运行的实例,我更改了会话变量。在脚本的工作循环中,我正在检查此会话变量是否已更改以停止执行。 这行不通。为什么是这样 ?

基本上我首先开始会议:

session_start();

然后我生成一个随机数,将其分配给一个实例变量,杀死所属的会话变量并将生成的数字分配给该会话变量:

$this->number = rand();

unset( $_SESSION[ 'number' ] );

$_SESSION[ 'number' ] = $this->number;

在循环中,我让$_SESSION[ 'number' ] 被检查是否有更改,该更改应在启动新脚本实例时出现:

for( $i = 0 to 1.000.000 ){

  $s  =   $_SESSION[ 'number' ];
  
  if( $this->number !==  $s ){

     die();
  }

所以让我们说:

script1 启动会话,将 1 存储在 $_SESSION[ 'number' ] 中并检查对 $_SESSION[ 'number' ] 的更改以在循环时终止。

script2 启动并将 2 存储在 $_SESSION[ 'number' ]

那时 script1 应该意识到这个变化并停止工作

什么不是。

请善待并告诉我为什么这不起作用,因为我让脚本在启动时回显实际的$_SESSION[ 'number' ],并看到从之前启动的脚本生成的数字被上次启动的实例更改。

【问题讨论】:

  • 它与通过 Ajax 请求启动的脚本相同。
  • 只有一个脚本可以同时访问一个会话。你需要一个不同的媒介...
  • 我现在让脚本在循环中回显实际的 $_SESSION[ 'number' ]。脚本的每个实例都显示其自行生成的 $_SESSION[ 'number' ] 直到结束。如果我尝试这样做,我会让 3-5 个实例同时运行,并且每个实例都显示不同的 $_SESSION['number']。这符合您的期望吗?
  • 我可能会提到,当我让 $_SESSION[ 'number' ] 作为一阶回显(在脚本的构造内)时,会显示从之前启动的脚本生成的 $_SESSION[ 'number' ]。之后,当脚本生成自己的 $_SESSION[ 'number' ] 时,它会保持不变,直到结束。
  • @honk der hase 我很确定,当我在论坛或工作网站甚至 ebay 或 stackoverflow 上时,我可以通过用鼠标滚轮单击几乎同时打开多个站点,它们都从 $ 获取信息_SESSION 即如果我登录等等。

标签: php session die


【解决方案1】:

您对全局 $_SESSION 所做的更改不会传播到已经运行的不同脚本中...... 来自definition

包含当前脚本可用的会话变量的关联数组

该会话对于当前正在运行的脚本是唯一的,它基本上是一个在加载代码时填充的数组 - 即使您对多个脚本使用相同的会话,它们在调用时也会拥有当前值的副本。除非您重新运行脚本,否则对存储的会话值的更改不会反映出来。

您需要实现另一种机制来跨脚本“发出信号”。

最好的方法是(我的观点):

【讨论】:

    【解决方案2】:

    同时我尝试了以下方法:

    pcntl 信号 - 服务器根本没有反应,即使 pcntl 功能应该包含在 webhosting 包中。我将不得不对此进行调查。

    websockets - 我尝试了非常简单的解决方案,它在javascript中报告无法建立连接。我将此称为我正在使用的共享主机包的性质。

    PHP信号量函数:

    https://www.php.net/manual/en/ref.sem.php

    msg_send / msg_receive - 这显示不合适,因为在这个 php 消息系统中,消息在读取时被消耗,这意味着 php 脚本的所有运行实例之间的共享是不可能的,因为第一个读取消息的脚本会从堆。

    解决方案:

    现在我正在使用一个名为 AbortController 的 Fetch-native 对象

    https://javascript.info/fetch-abort

    它有效,没有我想要的那么快,但它有效。它中止异步任务。

    现在这会做..

    我会关注posix_kill。 我避免使用 db 解决方案,因为如果在脚本循环中使用它会为每个用户产生成千上万个 db 请求(即使使用定时方法)

    感谢:@Honk der Hase 和 @Shlomi Hassid

    【讨论】:

      猜你喜欢
      • 2012-03-11
      • 2021-04-15
      • 1970-01-01
      • 2014-12-25
      • 2010-12-06
      • 1970-01-01
      • 2011-08-13
      • 2011-09-03
      • 1970-01-01
      相关资源
      最近更新 更多