php session 读写锁

本文介绍了一种使用PHP Session 和 AJAX 实现页面间数据传递的方法,通过在按钮点击事件触发AJAX 请求运行PHP 脚本记录状态,同时使用轮询获取并显示当前状态,演示了Session 锁机制及其对读写操作的影响,以及如何通过 session_write_close() 解锁并优化读取效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

php session 读写锁

先看一个样例,功能:

1.点击页面中一个button,ajax运行php,php中用session记录运行到哪一步。


2.使用ajax轮询还有一个php,获取session中数据,输出运行到哪一步。


session.html 调用php运行,并输出运行到第几步

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <meta http-equiv="content-type" content="text/html;charset=utf-8">
  <script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
  <title> session lock </title>
 </head>

 <body>
  <input type="button" value="handle" onclick="handle()">
  <div id="result"></div>
  <script type="text/javascript">
    function handle(){
        $.get("handle.php"); // 运行handle

        // 每500毫秒请求,获取运行到第几步
        var et = setInterval(function(){
            $.get("getstep.php",
                function(data){
                    $('#result').html('当前运行:' + data + '<br>');
                    if(data=='complete'){
                        clearInterval(et);
                    }
                }
            );
        },500);
    }
  </script>

 </body>
</html>

handle.php 运行并记录运行到第几步

<?php
session_start();
$_SESSION['step'] = '';
$n = 1;
while($n<=10){
    $_SESSION['step'] = $n;
    sleep(1);
    $n++;
}
$_SESSION['step'] = 'complete';
?

>


getstep.php 获取运行到第几步

<?php
session_start();
echo isset($_SESSION['step'])? $_SESSION['step'] : '';
?

>


运行时发现,并非每一步返回,而是等待10秒后直接返回complete。


当运行session_start()后,session会被锁住。直到页面运行完毕。


因此在页面运行其间。对sesssion进行写操作,仅仅会保存在内存中。并不会写入session文件。

而对session进行读取,则须要等待。直到session锁解开才干读取到。


我们能够使用session_write_close()把数据写入session文件并结束session进程。这样就不须要等待页面运行完毕,也能获取到运行到哪一步。

但这样有个问题。就是运行完sesssion_write_close()后。对session的不论什么写操作都不起作用。由于session进程已经结束。

因此须要再写session时。在前面加上session_start()


session_start — Start new or resume existing session 

session_write_close — Write session data and end session 


handle.php 按下面改动,就能获取到运行到哪一步

<?php
session_start();
$_SESSION['step'] = '';
$n = 1;
while($n<=10){
    $_SESSION['step'] = $n;
    session_write_close(); // 将数据写入session文件,并结束session进程
    session_start();       // 又一次创建session进程
    sleep(1);
    $n++;
}
$_SESSION['step'] = 'complete';
?>


转载于:https://www.cnblogs.com/mengfanrong/p/5063238.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值