最近在开发一个项目,其中有1个PHP页面需要执行较长时间,而且我发现,在执行这个页面的时候,其他的页面都不能访问了,需要等这个页面执行完成以后,其他页面才能打开。
猜想了一下,有以下几种可能
- Web Server(Apache 2.2/Nginx)是不是只能同时处理1个客户端连接?
- 是不是打开MySQL数据库的时候被阻塞了?
- 是不是session_start导致了阻塞?
于是,我写了几个页面测试了一下,发现是session导致了阻塞,而其他两种情况不会造成阻塞。
查了下PHP的Bug列表,发现有人提出了这个问题:
Description:
------------
Calling session_start() appears to wait until other scripts have exited
that are using the same session. My guess is the 1st request locks the
session file for exclusive use, and the second request blocks until it
can open it.
------------
Calling session_start() appears to wait until other scripts have exited
that are using the same session. My guess is the 1st request locks the
session file for exclusive use, and the second request blocks until it
can open it.
PHP官方的回复是:
Thank you for taking the time to write to us, but this is not a bug.This is expected, the session file is locked to avoid corruption.
结合了PHP的Session机制,找到了阻塞的原因。由于PHP的Session信息是写入文件的,1个客户端占有1个session文件。因此,当 session_start被调用的时候,该文件是被锁住的,而且是以读写模式锁住的(因为程序中可能要修改session的值),这样,第2次调用 session_start的时候就被阻塞了。
最简解决方法:
查了PHP的手册,发现一个session_write_close函数,作用是Write session data and end session,也就是写session的数据,同时关闭这个session。因此,我们可以在用完session之后,调用这个函数关闭session 文件即可接触锁定。一般,session是用来记录用户身份信息的,以便PHP进行身份认证,因此完全可以将session的读写放在页面刚开始执行的时 候,在执行完以后,马上调用session_write_close函数即可。
相关推荐
本文将深入探讨PHP Session阻塞的原理、原因,并提出相应的解决方法。 ### Session阻塞原理 PHP的Session机制基于文件存储,每个用户的Session数据被序列化并保存在一个特定的文件中。当一个PHP脚本调用`session_...
首先,让我们理解Session阻塞的根本原因。PHP的Session机制依赖于将Session数据存储在文件中,每个客户端对应一个唯一的Session文件。当`session_start()`被调用时,系统会锁定相应的Session文件,以防止多个请求...
PHP的Session机制在处理并发请求时,可能会遇到一系列问题,主要涉及到锁的使用以及数据的一致性。在本文中,我们将深入探讨这些问题,并尝试找出解决方案。 首先,让我们了解PHP如何处理Session数据。当PHP程序...
7. PHP与HTML的交互:讲解如何使用PHP生成动态网页,包括表单处理、session和cookie的应用。 8. PHP内置函数:介绍常见的字符串处理、数组操作、日期时间处理、数学运算等内置函数。 下卷高级篇则深入探讨PHP的...
本文将围绕“PHP教务管理系统”这一主题,深入探讨其核心技术和应用。 PHP,全称“Hypertext Preprocessor”,是一种广泛使用的开源脚本语言,尤其适用于Web开发,并可嵌入HTML中。PHP语法简洁,学习曲线平缓,同时...
AMP(Asynchronous Multi-Platform)是一个PHP框架,专注于非阻塞并发编程,为开发者提供了构建高性能Web服务的能力。AMP框架的核心在于其事件驱动的设计,它允许服务器处理大量并发请求而无需等待每个请求完成,...
3. **Session和Cookie管理**:在线客服系统需要识别和跟踪用户,因此会涉及到PHP的Session和Cookie管理技术。 4. **AJAX异步通信**:为了提供实时的聊天体验,源码可能会用到JavaScript的XMLHttpRequest或jQuery的...
4. **max_execution_time**:限制脚本执行时间,防止长时间运行的脚本阻塞服务器,如“30”表示30秒。 5. **post_max_size**:设置POST数据的最大允许大小,影响上传文件的大小限制。 6. **upload_max_filesize**...
这里我们将深入探讨9个PHP中必备的函数,并结合文件上传、后缀名与文件类型的对应、编码转换以及实现在线人数统计等重要知识点。 1. `echo` 和 `print`: 这两个函数都是用于输出内容到页面上,`echo` 比 `print` 更...
确保只有授权的用户能触发文件压缩,可以使用PHP的session机制或身份验证。另外,压缩大量文件时要考虑性能优化,例如使用异步处理或分批压缩,避免阻塞服务器响应。 总的来说,这个功能结合了PHP的文件处理、压缩...
下面我们将深入探讨这一技术的核心知识点: 1. **FlashPaper技术**: FlashPaper是Adobe公司推出的一款工具,它可以将PDF、Word、Excel等文档快速转换成高质量的Flash(SWF)文件,这种格式的文件可以在网页上无缝...
5. **认证与授权**:飞信发送可能需要用户进行身份验证,PHP类可能包括登录、验证用户凭据的功能,并可能使用会话(session)管理来保持登录状态。 6. **异步处理**:考虑到发送短信可能涉及网络延迟,类可能采用了...
1. **会话管理**:PHP提供了会话管理功能,可以通过`session_start()`函数启动一个新的会话,并通过`$_SESSION`全局变量存储用户信息。当用户访问网站时,创建一个新会话,同时记录会话开始时间。每次用户交互时更新...
本文将围绕“PHP乘风多用户流量统计”这一主题,深入探讨其背后的实现原理和关键知识点。 一、流量统计基础 流量统计主要涉及以下几个核心指标: 1. 访客数(UV):独立访客数量,同一设备24小时内只计算一次。 2....
在本项目中,我们探讨了如何使用PHP和Node.js来抓取并分析58微聊的聊天信息。58微聊是58同城平台上的一个功能,它允许用户在平台上进行实时聊天,讨论商品或服务的详情。由于数据隐私和合法性的考虑,这个示例仅用于...
通过深入研究这个开源项目,我们可以学习到许多PHP在构建实时通信应用中的关键技术。 1. **PHP与WebSocket的结合** iWebIM采用了WebSocket技术来实现实时双向通信。WebSocket协议是HTML5的一个重要特性,允许...
4. 并发处理:聊天室需要处理大量并发请求,因此需要优化代码,避免阻塞,可能需要利用到PHP的多线程或多进程特性,或者借助于PHP扩展如pthreads。 5. 用户界面:聊天室的前端界面通常由HTML、CSS和JavaScript构建...
为了帮助学生和研究人员高效、准确地完成论文格式化,本项目开发了一款基于PHP的论文格式化系统,旨在简化论文格式设定过程,提升论文制作质量。本文将详细介绍该系统的前台设计与实现。 一、系统概述 1.1 功能...
本文将深入探讨如何利用PHP结合梦网科技的短信服务平台实现这一功能。 首先,我们需要了解梦网科技短信平台提供的API服务。这个平台通常会提供一个HTTP接口,允许开发者通过发送HTTP请求来发送和接收短信。在PHP中...
工作人(Workerman)是...通过研究这个源码解压包,开发者不仅可以了解到Workerman框架的基本架构和工作流程,还能掌握如何设计和实现高性能的实时通信服务。这对于提升PHP开发者在后端领域的技能和经验具有重要价值。