zoukankan      html  css  js  c++  java
  • PHP自带Session隐患(session文件独占锁引起阻塞)

    PHP自带Session隐患(session文件独占锁引起阻塞)

    PHP默认的会话处理器是session.save_handler = files(即文件)。如果同一个客户端同时并发发送多个请求(如ajax在页面同时发送多个请求),且脚本执行时间较长,就会导致session文件阻塞,影响性能。因为对于每个请求,PHP执行session_start(),就会取得文件独占锁,只有在该请求处理结束后,才会释放独占锁。这样,同时多个请求就会引起阻塞。解决方案如下:

    (1)修改会话变量后,立即使用session_write_close()来保存会话数据并释放文件锁。

    [php] view plaincopy
     
    1. session_start();  
    2.    
    3. $_SESSION['test'] = 'test';  
    4. session_write_close();  
    5.    
    6. //do something  


    (2)利用session_set_save_handler()函数是实现自定义会话处理。

    [php] view plaincopy
     
    1. function open($savePath, $sessionName)  
    2. {  
    3.     echo 'open is called';  
    4.     return true;  
    5. }  
    6.    
    7. function close()  
    8. {  
    9.     echo 'close is called';  
    10.     return true;  
    11. }  
    12.    
    13. function read($sessionId)  
    14. {  
    15.     echo 'read is called';  
    16.     return '';  
    17. }  
    18.    
    19. function write($sessionId, $data)  
    20. {  
    21.     echo 'write is called';  
    22.     return true;  
    23. }  
    24.    
    25. function destroy($sessionId)  
    26. {  
    27.     echo 'destroy is called';  
    28.     return true;  
    29. }  
    30.    
    31. function gc($lifetime)  
    32. {  
    33.     echo 'gc is called';  
    34.     return true;  
    35. }  
    36.    
    37. session_set_save_handler("open", "close", "read", "write", "destroy", "gc");  
    38. register_shutdown_function ( 'session_write_close' );  
    39.    
    40. session_start();  
    41.    
    42. $_SESSION['foo'] = "bar";  


    当然,在 php 5.4.0之后,你可以通过实现 SessionHandlerInterface 接口或继承 SessionHandler 类来使用。

    [php] view plaincopy
     
    1. class MySessionHandler extends SessionHandler  {  
    2.    
    3.     public function __construct()  
    4.     {  
    5.     }  
    6.    
    7.     public function open($save_path, $session_id)  
    8.     {  
    9.     }  
    10.    
    11.     public function close()  
    12.     {  
    13.    
    14.     }  
    15.    
    16.     public function create_sid()  
    17.     {  
    18.     }  
    19.    
    20.     public function read($id)  
    21.     {  
    22.     }  
    23.    
    24.     public function write($id, $data)  
    25.     {  
    26.     }  
    27.    
    28.     public function destroy($id)  
    29.     {  
    30.     }  
    31. }  
    32.    
    33. $handler = new MySessionHandler();  
    34.    
    35. //第2个参数将函数 session_write_close()  注册为 register_shutdown_function()  函数。  
    36. session_set_save_handler($handler, true);  


    你可以对上面的代码进行具体实现和封装,利用mysql或其它内存数据库来管理会话数据。还能解决使用集群时,session数据共享问题。


    参考来源: 
    PHP自带Session隐患(session文件独占锁引起阻塞)
    http://www.lai18.com/content/407206.html

  • 相关阅读:
    树莓派研究笔记(2)-- 安装Nginx 服务器,PHP 和 SQLite
    树莓派研究笔记(1)-- 安装Mono
    Qemu虚拟机 玩树莓派最新版系统 (截止2017-04-10)
    CLRInjection
    CLRMonitor
    Xamarin Mono for VS开发窗体标题(Title)乱码解决方案
    精美3D中国象棋
    怀旧系列(5)----大学时代的疯狂
    怀旧系列(4)----文曲星编程GV-Basic
    怀旧系列(3)----Pascal
  • 原文地址:https://www.cnblogs.com/xxcn/p/4401515.html
Copyright © 2011-2022 走看看