本文实例讲述了php基于session锁防止阻塞请求的方法。分享给大家供大家参考,具体如下:
说明:
这是一篇参考国外网站http://konrness.com/php5/how-to-prevent-blocking-php-requests/ 的译文,前面一篇文章PHP编程中的Session阻塞问题与解决方法简单分析了php session阻塞的解决方法,这里给出另一种解决方法。
正文:
现代浏览器限制到一个host并发连接的数量一般为4或6。这意味着,如果您的web页面加载几十个来自同一个host的assert file(js、图像、css)时,由于并发数的限制,会产生排队。同样甚至更糟的是,这个问题也会发生在使用了session的php脚本中。
问题:
php的session缺省用文件存储,当请求一个需要操作session的php文件(session_start())时,这个文件是会被第一个操作session的进程锁定,导致其他请求阻塞。其他请求会挂起在session_start()直到session文件解锁。
解决:
由于锁定的session文件直到脚本执行结束或者session正常关闭才会解锁,为了防止大量的php请求(需要使用$_SESSION数据)被锁定,可以在写完session后马上关闭,这样就释放了锁。
关闭session:
session_write_close();
这个技巧非常管用,尤其对于一个处理时间长的脚本。并且这个函数只是关闭了写session,读还是可以的。
// session_start(); //可以读写session $_SESSION['latestRequestTime'] = time(); //关闭session session_write_close(); //读取session $twitterId = $_SESSION['twitterId'];
译注:
在php5.4以后,session_set_save_handler 支持了传递SessionHandlerInterface 的方式,第二个参数就是指定session_write_close() 作为回调方法的(缺省就是true),将函数 session_write_close() 注册为 register_shutdown_function() 函数。
用Memcache或者Redis做session的存储,是能解决“锁定”的问题,但处理不好会导致连接数标高(在session操作后如果有耗时操作,连接是不回收的,可以主动在session写操作完成后做session_write_close() 操作)
更多关于PHP相关内容感兴趣的读者可查看本站专题:《php缓存技术总结》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《PHP网络编程技巧总结》及《php字符串(string)用法总结》
希望本文所述对大家PHP程序设计有所帮助。
我对JPA中乐观锁定的好处有点困惑。 我在版本化实体表上用两个线程和一行进行了测试。 这是我的发现: 第二次测试。请注意select语句的添加。 我真的没想到在使用乐观锁定时会发生任何阻塞,但是我的理解是,这里必须有一个数据库事务,以便从 select 语句返回正确的数据。 由于JPA似乎只在绝对必要时输入数据库事务,谁能解释一下乐观锁定的好处是什么?
本文向大家介绍PHP编程中的Session阻塞问题与解决方法分析,包括了PHP编程中的Session阻塞问题与解决方法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP编程中的Session阻塞问题与解决方法。分享给大家供大家参考,具体如下: 使用session过程中,在开启session后,同一浏览器,执行同一程序,不同页面会被锁。不同浏览器不会出现这种情况。 疑问:是不是ses
问题内容: 我正在使用PHP从远程服务器下载一个(大)文件,并且此下载是通过单击网页上的下载按钮触发的。 因此,当我单击网页上的按钮时,就会向PHP函数发出请求(带有angulars )。该函数使用触发下载。 同时,我想使用Ajax向我的PHP网站提出其他请求。但是,只要下载正在进行,所有其他Ajax请求都会显示状态。 因此,基本上,下载阻止了对PHP的所有其他请求。有什么办法可以避免这种阻塞?
问题内容: 我正在创建一个网站,该网站依赖于对PHP页面的AJAX调用。有没有办法防止访问原始数据?(即通过他们自己的帖子请求访问php文件)。 我想最好的方法(如果可能的话)是防止PHP将数据发送到不来自AJAX的任何内容(因为必须来自同一域)。有什么建议? 问题答案: if (strtolower($_SERVER[‘HTTP_X_REQUESTED_WITH’]) == ‘xmlhttpre
问题内容: 我在芹菜中使用Python进行大量的(〜10 / sec)API调用(包括GET,POST,PUT,DELETE)。每个请求大约需要5-10秒才能完成。 我尝试在池中运行芹菜工人,并发数为1000。 由于正在阻塞进程,每个并发连接都在等待一个请求。 如何使异步? 问题答案: 使用eventlet Monkey patching使所有纯python库都无阻塞。 补丁单库 import e