gpt4 book ai didi

php - 从外部php脚本编写/读取joomla session 变量时,如何防止出现竞争情况?

转载 作者:可可西里 更新时间:2023-11-01 12:19:22 25 4
gpt4 key购买 nike

问题

  • session 数据的间歇性丢失是否可能是由于竞争条件引起的?如果不是,则可能是什么问题?
  • 编写/阅读joomla时如何防止比赛条件
    来自外部php脚本的 session 变量?

  • 详细信息

    我正在使用
  • Joomla 2.5
  • PHP 5.4.3
  • Apache 2.2.22
  • mysql 5.5.24
  • localhost上的
  • wampserver 2。
  • 我的脚本在Joomla外部。
  • (cometchat版本3.0.1)

  • 该脚本使用异步ajax请求多次获取和设置joomla变量。我在 session 中存储的数据是一个数组。 间歇性地丢失了一些数组数据。 一旦用户登录并使用脚本,这种情况似乎会更加一致。

    老实说,我不确定是什么问题,但是我开始认为我的代码遇到了竞争问题。我认为Joomla可能正在尝试在未完成写入或未设置之前读取 session 信息。丢失的信息似乎是随机选择的,并且数据丢失是间歇性发生的。

    SCRIPT1

    脚本1使用异步ajax请求来获取/设置Joomla session 变量。这将被多次调用。根据设计,在ajax响应成功之前,无法再次调用脚本1。
    $.ajax(
    { cache:false,
    url: 'script2.php',
    data: { 'change': change},
    dataType: 'json',
    success: function(data)
    {
    //do something
    }
    });

    这是我在脚本2中用来访问Joomla和获取/设置 session 数据的代码的粗略概念。

    SCRIPT2
    <?php
    //some code omitted for brevity

    $app = &JFactory::getApplication('site');/
    $app->initialise();

    $nottimedout=false;
    $session = JFactory::getSession();
    $jquizstart = date( 'Y-m-d H:i:s', time() ); //<<-- time of access
    $nottimedout = $session->has('jtimedout');

    if ($nottimedout==true)
    {
    $jqid = $session->get('jqid'); //<<-- get array from session
    if (isset($_GET['change']))
    {
    $qnumber=$_GET['change'];
    $firephp->log($qnumber, 'qnumber');
    $jqid[$qnumber][3]=$jquizstart; //<<-- add time of access to array
    $firephp->log($jqid[$qnumber][3], '$jqid[$qnumber][3]');
    $session->set('jqid', $jqid); //<<-- store array in Joomla with updated data
    }
    else
    {
    $firephp->log('CHANGE NOT SET');
    }

    echo json_encode(
    array("nottimedout" => $nottimedout)
    );
    }
    else
    {
    //Do something
    }
    ?>

    竞赛条件测试

    我认为数据可能会被覆盖,因此我使用下面的代码进行了快速测试。每次更新 session 数组时,我都会使用更新后的数据创建一个新的 session 变量。
    $qnum[$qnumber]=$jquizstart;
    $session->set('var'.$qnumber, $qnum);

    在网站完成更新的另一个脚本中,我检查了每个单独的 session 以查看是否已设置它们。
    //Test for race condition in Joomla session

    for ($counter=0; $counter<=$totalnumber-1; $counter++)
    {
    $racecondition=$session->get('var'.$counter);
    $firephp->log($racecondition, 'var'.$counter.'=');
    }

    测试结果

    jqid中缺少的数组信息在相应的单个 session (仅包含更新数据的 session )中也丢失了,因此看来这不是数据被覆盖的问题。我不确定这是否可以证明比赛条件。

    任何有关您认为可能会发生什么以及如何解决此问题的建议都将受到欢迎。

    编辑

    即使是关于如何预防Joomla种族状况的一般性解答,也欢迎。谢谢

    EDIT2

    我开始怀疑php5.4和Joomla是否不是问题。我听说他们在一起玩的不好,在我从php5.3更新之前,我不记得有这个问题。我可能是错的。

    EDIT3

    我机智。我将网站安装在使用php 5.3.10的其他服务器上。我以未登录用户的身份尝试了十次或更多次。没有数据丢失。然后,我登录Joomla,几乎每次访问该页面时,数据都会丢失。如果我不必使用Joomla session ! GRRRrrrrr

    EDIT4

    现在变得绝望,只是尝试任何事情。 JRequest没有用,尽管我还是应该使用它。

    由于该问题在登录时更频繁地发生,因此我认为这一定是因为 session 中存储的内容比用户为访客时要多得多。 Jqid是一个大型数组,因此,我一直在尝试制作几个较小的数组,并在适当时进行更新,而不是一直进行更新。它绝对没有效果。同样,我可能还是应该这样做。

    EDIT5B

    在尝试找到一个临时解决方案时,我尝试测试该 session 是否已成功更新(这是在更新 session 的同一脚本中完成的)。

    这是我用来检查jstart的代码。
    //jstart updated
    $session->close('jstart');
    $try_again_session = JFactory::getSession();
    $newjstart=$try_again_session->get('jstart');
    $firephp->log($newjstart[$qnumber], 'confirm_jstart_set=');

    我发现有趣的是,jstart在检查过程中包含更新的信息,但在完成时却丢失了。
    我不太确定这是什么意思,但是我想如果我们将 JFactory::getSession()视为变量,则仅针对该脚本更新该变量(有点像本地变量?),无论出于何种原因, JFactory::getSession()的数据库值均未写入到数据库。因此,稍后,当再次触发该脚本时,它将检索保存在数据库中的 JFactory::getSession()的旧值。

    仍然不知道是什么导致 session 未写入数据库。

    最佳答案

    虽然我没有找到解决问题的方法,但已经找到解决方法。这不是一个好东西,但是可以。每当 session 变量更新时,就将信息存储在cookie中作为备份。在脚本的后面,检查是否缺少信息,并根据需要从cookie中进行更新。

    我宁愿不这样做,但看起来我没有选择。

    关于php - 从外部php脚本编写/读取joomla session 变量时,如何防止出现竞争情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13052495/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com