Javascript 当另一个持久的php脚本正在运行时,服务器上不能运行任何php脚本
我在服务器上运行了一个持久的PHP脚本。它将视频从服务器流到Javascript 当另一个持久的php脚本正在运行时,服务器上不能运行任何php脚本,javascript,php,ajax,apache,http,Javascript,Php,Ajax,Apache,Http,我在服务器上运行了一个持久的PHP脚本。它将视频从服务器流到videotag(不要问我为什么这么做:-))。它可以运行几十分钟 问题是,我同时希望使用AJAX将请求发送到服务器,但在长脚本停止之前,请求不会发生 我对这个问题进行了更多的调查,发现了一些奇怪的事情 当持久的PHP脚本运行时,我不能从同一个浏览器调用任何PHP脚本(AJAX或非AJAX) 同时,从其他浏览器服务器可以毫无问题地访问 可以毫无问题地访问非php资产(图像、视频) 如果直接从.mp4文件播放视频,则问题不存在。可以在播
video
tag(不要问我为什么这么做:-))。它可以运行几十分钟
问题是,我同时希望使用AJAX将请求发送到服务器,但在长脚本停止之前,请求不会发生
我对这个问题进行了更多的调查,发现了一些奇怪的事情
- 当持久的PHP脚本运行时,我不能从同一个浏览器调用任何PHP脚本(AJAX或非AJAX)
- 同时,从其他浏览器服务器可以毫无问题地访问
- 可以毫无问题地访问非php资产(图像、视频)
- 如果直接从.mp4文件播放视频,则问题不存在。可以在播放视频时处理对php的AJAX请求
Request GET /portal/portlet/index/id/671/call/proxyVideo?entityId=1 HTTP/1.1
Accept */*
If-Unmodified-Since Fri, 24 Apr 2015 08:18:29 GMT
If-Match "f91b54d-514740a87ff40"
Range bytes=360448-261207372
User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko
Referer http://mm.mac/content
GetContentFeatures.DLNA.ORG 1
Pragma getIfoFileURI.dlna.org
Accept-Language en-US
Accept-Encoding gzip, deflate
Host mm.mac
Connection Keep-Alive
Cache-Control no-cache
Cookie PHPSESSID=41821op72k2s24mfrsbn5gad64
Response HTTP/1.1 206 Partial Content
Date Tue, 01 Dec 2015 13:39:31 GMT
Server Apache/2.4.16 (Unix) PHP/5.6.13
X-Powered-By PHP/5.6.13
Expires Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma no-cache
Last-Modified Fri, 24 Apr 2015 08:18:29 GMT
ETag "f91b54d-514740a87ff40"
Accept-Ranges bytes
Content-Length 260846925
Access-Control-Allow-Methods GET
Content-Range bytes 360448-261207372/261207373
Keep-Alive timeout=5, max=100
Connection Keep-Alive
Content-Type video/mp4
会话锁
此问题可能由会话锁定引起。当持久的php脚本使用带有session\u start()
的会话时,进程将锁定服务器上的会话文件,直到完成。阻止尝试打开同一会话文件的所有其他PHP进程
这就是为什么您会在同一个浏览器中看到这种行为,但在另一台机器或不同的浏览器上看不到这种行为(因为会话不同)
解决问题的方法是使用
session_write_close();
当您不需要写入会话时。调用此函数时,仍然可以读取会话变量,但要再次写入会话变量,需要使用session\u start()
再次打开会话
这个问题你可以读到很多
示例:(来自链接页面)
一次只能有1个PHP脚本访问同一个用户会话 ,所有其他脚本将等待第一个脚本完成 这是因为会话文件写入锁定 解决方案:
不要问我为什么这样做:-)
-自动盗版?如果您使用默认会话存储,则会话将写入文件。长时间请求将在会话文件上创建一个锁,以防止其他请求。当您不再需要会话信息时,可以将会话移动到数据库中,或者在长效脚本中使用session\u write\u lock()
,从而释放名为session\u write\u close()
?@vanSteinenGroentjes的锁,这是正确的。我这边的打字错误:)谢谢你的详细回答。
// start the session
session_start();
// I can read/write to session
$_SESSION['latestRequestTime'] = time();
// close the session for writing
session_write_close();
// now do my long-running code.
// still able to read from session, but not write
$twitterId = $_SESSION['twitterId'];
//when you want to write again do session_start() before and close after.