jjzjj

PHP/AJAX 并发 session 仅在 Chrome 中行为不端

coder 2024-05-01 原文

长话短说;博士。有趣的部分无需先浏览 JS:我正在递增 session 计数器,但不同的请求看到相同的值。这只是 Chrome 中的一个问题。在 Firefox 和 Internet Explorer 中,每个请求都会看到一个唯一的值。

我尝试多次访问网页(以处理数据),直到获得 204 HTTP 代码。我可以一次进行一个 ajax 调用,方法是让 ajax 在成功时调用自身,并在 204 停止。

因为我想更快地完成它们,所以我在 js 中有多个“线程”都在这样做。我的意思是创建了多个相同的 ajax 调用,并且它们在完成后都会启动另一个调用,并在 204 代码处停止。

我的相关 js 如下所示:

$(function() {
    // "thread" id
    var counter = 1;

    // run 3 "threads"
    generateThreads(3);

    function generateThreads(num) {
        if (num <= 0)
            return;

        doNextItem(counter++);

        // Pause before starting the next thread
        setTimeout(function() {
                generateThreads(num-1);
            },
            50);
    }

    function doNextItem(thread) {
        $.ajax({
            url: URL,
            statusCode: {
                200: function(data) {
                    logItem(data, thread);
                    doNextItem(thread); // call itself on the same thread

                },
                204: function(data) {
                    finished(); // done, don't recurse, end the thread
                }
            }
        });
    }
});

然后在 PHP 中,我递增存储在 Session 中的整数,并在超过截止值时返回 204。

if (!isset($_SESSION["nums"]))
{
    $_SESSION["nums"] = 0;
}
else if ($_SESSION["nums"] > 10) {
    http_response_code(204);
    die();
}
echo json_encode(array("num" => $_SESSION["nums"]++));

当我运行它时,奇怪的部分出现了。 javascript 中的 logItem() 只是将线程 ID 打印到控制台,然后是来自 php 的数字。

Chrome:

1: 0 
2: 0 
2: 1 
1: 1 
3: 1 
2: 2 
1: 2 
3: 2 
1: 3 
2: 3 
3: 3 
3: 4 
1: 4 
2: 4 
3: 5 
2: 5 
1: 5 
2: 6 
3: 6 
1: 6 
1: 7 
2: 7 
3: 7 
1: 8 
3: 8 
2: 8 
1: 9 
2: 9 
3: 9 
2: 10
1: 10
3: 10

火狐/IE

1: 0
2: 1
3: 2
1: 3
2: 4
3: 5
1: 6
2: 7
3: 8
1: 9
2: 10
3: 11
1: 12
2: 13
3: 14
1: 15
2: 16 
3: 17 
1: 18  
2: 19 
3: 20

为什么 chrome 给我重复的值?

更新

真正可疑的是每个数字的重复次数恰好等于同时进行的 ajax 调用的次数。绝不会少,绝不会多,但恰恰如此。如果我同时运行 6 个 ajax 调用,它们都会得到相同的数量。如果这是一个时间问题,它就不会那么一致,特别是因为我抵消了彼此之间的不同 ajax 调用。这对我来说意味着这是一个 javascript 问题,不一定像之前出现的那样只是一个 php 问题。

更新的巨大改变 这只是 Chrome 中的一个问题。在 Firefox 或 Internet Explorer 中不会发生。在 Firefox 和 IE 中,每个请求都会获得一个新的计数器值。显然这是客户端问题。对这些信息做更多的研究会发现很多关于无效请求执行重定向导致 session 终止的事情。特别是 favicon.ico 的常见场景。我的所有请求都成功了,我的 favicon.ico 也成功加载了。

最佳答案

Chrome 正在缓存响应,因为您在短时间内多次发送相同的请求。强制 ajax 调用不缓存响应应该可以解决您的问题。试试这个:

$.ajax({
    url: URL,
    cache: false,
    statusCode: {
...

关于PHP/AJAX 并发 session 仅在 Chrome 中行为不端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15317792/

有关PHP/AJAX 并发 session 仅在 Chrome 中行为不端的更多相关文章

  1. jquery - 我的 jquery AJAX POST 请求无需发送 Authenticity Token (Rails) - 2

    rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送

  2. ruby-on-rails - Rails 优雅地处理超时 session ? - 2

    使用rails4,ruby2。我在rails配置中为我的cookiesession设置了30分钟的超时时间。问题是,如果我转到表单,让session超时,然后提交表单,我会收到此ActionController::InvalidAuthenticityToken错误。如何在Rails中优雅地处理这个错误?比如说,重定向到登录屏幕? 最佳答案 在您的ApplicationController:rescue_fromActionController::InvalidAuthenticityTokendoredirect_tosome_p

  3. ruby-on-rails - 为什么在 Rails 5.1.1 中删除了 session 存储初始化程序 - 2

    我去了这个website查看Rails5.0.0和Rails5.1.1之间的区别为什么5.1.1不再包含:config/initializers/session_store.rb?谢谢 最佳答案 这是删除它的提交:Setupdefaultsessionstoreinternally,nolongerthroughanapplicationinitializer总而言之,新应用没有该初始化器,session存储默认设置为cookie存储。即与在该初始值设定项的生成版本中指定的值相同。 关于

  4. jquery - 如何将 AJAX 变量从 jQuery 传递到他们的 Controller ? - 2

    我有一个电子邮件表格。但是我正在制作一个测试电子邮件表单,用户可以在其中添加一个唯一的电子邮件,并让电子邮件测试将其发送到该特定电子邮件。为了简单起见,我决定让测试电子邮件通过ajax执行,并将整个内容粘贴到另一个电子邮件表单中。我不知道如何将变量从我的HAML发送到我的Controllernew.html.haml-form_tagadmin_email_blast_pathdoSubject%br=text_field_tag'subject',:class=>"mass_email_subject"%brBody%br=text_area_tag'message','',:nam

  5. ruby-on-rails - 使用 javascript 更改数据方法不会更改 ajax 调用用户的什么方法? - 2

    我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的

  6. ruby - 下载位置 Selenium-webdriver Cucumber Chrome - 2

    我将Cucumber与Ruby结合使用。通过Selenium-Webdriver在Chrome中运行测试时,我想将下载位置更改为测试文件夹而不是用户下载文件夹。我当前的chrome驱动程序是这样设置的:Capybara.default_driver=:seleniumCapybara.register_driver:seleniumdo|app|Capybara::Selenium::Driver.new(app,:browser=>:chrome,desired_capabilities:{'chromeOptions'=>{'args'=>%w{window-size=1920,1

  7. ruby-on-rails - 获取并发布相同匹配项的请求 - 2

    在我的路线文件中我有:match'graphs/(:id(/:action))'=>'graphs#(:action)'如果是GET请求(工作)或POST请求(不工作),我想匹配它我知道我可以使用以下方法在资源中声明POST请求:post'/'=>:show,:on=>:member但是我怎样才能为比赛做到这一点呢?谢谢。 最佳答案 如果你同时想要POST和GETmatch'graphs/(:id(/:action))'=>'graphs#(:action)',:via=>[:get,:post]编辑默认值可以设置如下match'g

  8. ruby-on-rails - NameError(未初始化常量 Unzipper::Zip)但仅在 Heroku 部署(Rails)上 - 2

    我有一个类unzipper.rb,它使用Rubyzip解压文件。在我的本地环境中,我可以成功解压缩文件,而无需使用require'zip'明确包含依赖项但是在Heroku上,我得到一个NameError(uninitializedconstantUnzipper::Zip)我只能通过使用明确的require来解决问题:为什么这在H​​eroku环境中是必需的,但在本地主机上却不是?我的印象是Rails自动需要所有gem。app/services/unzipper.rbrequire'zip'#OnlyrequiredforHeroku.Workslocallywithout!class

  9. ruby - Sinatra session 未按预期持续 - 2

    我正在尝试使用Sinatra中的重定向和session在网站周围传递一些数据。这是一个简化的示例,使用PrettyPrint进行调试:require'pp'require'rubygems'require'sinatra'enable:sessionsget'/'dosession[:foo]='12345'puts'session1'ppsessionredirectto('/redir')endget'/redir'doputs'session2'ppsession'helloworld'end查看Thin的输出,我看到:>>Listeningon0.0.0.0:4567,CTRL

  10. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

随机推荐