php session 读写锁

先看一个样例,功能:

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

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

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

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  2. <html>
  3. <head>
  4. <meta http-equiv="content-type" content="text/html;charset=utf-8">
  5. <script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
  6. <title> session lock </title>
  7. </head>
  8.  
  9. <body>
  10. <input type="button" value="handle" onclick="handle()">
  11. <div id="result"></div>
  12. <script type="text/javascript">
  13. function handle(){
  14. $.get("handle.php"); // 运行handle
  15.  
  16. // 每500毫秒请求,获取运行到第几步
  17. var et = setInterval(function(){
  18. $.get("getstep.php",
  19. function(data){
  20. $('#result').html('当前运行:' + data + '<br>');
  21. if(data=='complete'){
  22. clearInterval(et);
  23. }
  24. }
  25. );
  26. },500);
  27. }
  28. </script>
  29.  
  30. </body>
  31. </html>

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

  1. <?php
  2. session_start();
  3. $_SESSION['step'] = '';
  4. $n = 1;
  5. while($n<=10){
  6. $_SESSION['step'] = $n;
  7. sleep(1);
  8. $n++;
  9. }
  10. $_SESSION['step'] = 'complete';
  11. ?
  12.  
  13. >

getstep.php 获取运行到第几步

  1. <?php
  2. session_start();
  3. echo isset($_SESSION['step'])? $_SESSION['step'] : '';
  4. ?
  5.  
  6. >

运行时发现,并非每一步返回,而是等待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 按下面改动,就能获取到运行到哪一步

  1. <?php
  2. session_start();
  3. $_SESSION['step'] = '';
  4. $n = 1;
  5. while($n<=10){
  6. $_SESSION['step'] = $n;
  7. session_write_close(); // 将数据写入session文件,并结束session进程
  8. session_start(); // 又一次创建session进程
  9. sleep(1);
  10. $n++;
  11. }
  12. $_SESSION['step'] = 'complete';
  13. ?>

php session 读写锁的更多相关文章

  1. 【php】session读写锁

    事件:a文件中操作$_SESSION['start'] = 'yes'; sleep(100);  休眠100s 在这休眠的时间段中,b文件操作$_SESSION['start'] = 'no'; 结 ...

  2. 技术笔记:Delphi多线程应用读写锁

    在多线程应用中锁是一个很简单又很复杂的技术,之所以要用到锁是因为在多进程/线程环境下,一段代码可能会被同时访问到,如果这段代码涉及到了共享资源(数据)就需要保证数据的正确性.也就是所谓的线程安全.之前 ...

  3. java多线程-读写锁

    Java5 在 java.util.concurrent 包中已经包含了读写锁.尽管如此,我们还是应该了解其实现背后的原理. 读/写锁的 Java 实现(Read / Write Lock Java ...

  4. 让C#轻松实现读写锁分离

    ReaderWriterLockSlim 类 表示用于管理资源访问的锁定状态,可实现多线程读取或进行独占式写入访问. 使用 ReaderWriterLockSlim 来保护由多个线程读取但每次只采用一 ...

  5. C#读写锁ReaderWriterLockSlim的使用

    读写锁的概念很简单,允许多个线程同时获取读锁,但同一时间只允许一个线程获得写锁,因此也称作共享-独占锁.在C#中,推荐使用ReaderWriterLockSlim类来完成读写锁的功能. 某些场合下,对 ...

  6. 可重入锁 公平锁 读写锁、CLH队列、CLH队列锁、自旋锁、排队自旋锁、MCS锁、CLH锁

    1.可重入锁 如果锁具备可重入性,则称作为可重入锁. ========================================== (转)可重入和不可重入 2011-10-04 21:38 这 ...

  7. 用读写锁三句代码解决多线程并发写入文件 z

    C#使用读写锁三句代码简单解决多线程并发写入文件时提示“文件正在由另一进程使用,因此该进程无法访问此文件”的问题 在开发程序的过程中,难免少不了写入错误日志这个关键功能.实现这个功能,可以选择使用第三 ...

  8. 锁的封装 读写锁、lock

    最近由于项目上面建议使用读写锁,而去除常见的lock锁.然后就按照需求封装了下锁.以简化锁的使用.但是开发C#的童鞋都知道lock关键字用起太方便了,但是lock关键字不支持超时处理.很无奈,为了实现 ...

  9. Java多线程13:读写锁和两种同步方式的对比

    读写锁ReentrantReadWriteLock概述 大型网站中很重要的一块内容就是数据的读写,ReentrantLock虽然具有完全互斥排他的效果(即同一时间只有一个线程正在执行lock后面的任务 ...

随机推荐

  1. 很实用的FTP操作类

    using System; using System.Net; using System.Net.Sockets; using System.Text; using System.IO; using ...

  2. document.getElementById()使用方法

    document.getElementById使用 语法:oElement = document .getElementById ( sID ) 參数:sID――必选项. 字符串 (String) . ...

  3. 2014在辛星Javascript口译科

    ***************概要*************** 1.Javascript是一种原型化继承的基于对象的动态类型的脚本语言,它区分大写和小写.主要执行在client,用户即使响应用户的操 ...

  4. Sliverlight之 特效

    1,OpacityMask控件的部分渐隐(见Project16) (1) 控件的OpacityMask有什么作用 说明:设置所选区域不透明度的画笔,一般结合LinearGradientBrush或Ra ...

  5. 【6】和作为连续序列s

    称号:输入一个整数s,并打印出所有s整数的连续序列(含有至少2的数量). 如输入9,输出2.3.4和4.5两个序列 方案一:因为序列至少要2个数,则两个数上限值为(1+s)/2,我们能够枚举该序列的起 ...

  6. 【iOS】文件上传小记

    iOS由该系统提供API可以实现可以实现文件的上传和下载,有两种方法来. NSURLConnection与NSURLSession. 当中NSURLConnection是使用非常久的的一种方式.NSU ...

  7. DICOM医学图像处理:开源库mDCM与DCMTK的比較分析(一),JPEG无损压缩DCM图像

    背景介绍: 近期项目需求,须要使用C#进行最新的UI和相关DICOM3.0医学图像模块的开发.在C++语言下,我使用的是应用最广泛的DCMTK开源库,在本专栏的起初阶段的大多数博文都是对DCMTK开源 ...

  8. [LeetCode160]Intersection of Two Linked Lists

    题目: Write a program to find the node at which the intersection of two singly linked lists begins.   ...

  9. App设计相关网站

    http://sketch.im/ 设计素材 principle  动效软件 http://principleformac.com/ 官网 http://principlecn.com/ 中文网

  10. sqlite 中文排序

    看 http://www.cnblogs.com/08shiyan/archive/2012/05/11/2496491.html 这个方法 不太好用 最好的办法是 表添加pinyin字段. 插入数据 ...