javascript-没有php脚本可以在服务器上运行,而另一个持久的php脚本正在运行

我在服务器上运行了一个持久的PHP脚本.它将视频从服务器流式传输到视频标记(不要问我为什么这样做:-)).它可以运行数十分钟.

问题是,与此同时,我想使用AJAX将请求发送到服务器,并且在长脚本停止之前不会发生.

我已经对该问题进行了更多调查,发现了一些奇怪的事情.

>当持久的PHP脚本运行时,我无法从同一浏览器调用任何PHP脚本(无论是否为AJAX).
>同时可以从其他浏览器服务器正常访问.
>可以无问题地访问非PHP资产(图像,视频).
>如果直接从.mp4文件播放视频,则该问题不存在.播放视频时,可以处理对PHP的AJAX请求.

我很好奇什么可能导致此问题.从我看来,这可能是服务器和浏览器配置的组合.

我的问题是为什么会发生,如何解决?我希望能够在同一浏览器中运行其他PHP脚本时向服务器执行AJAX请求.

这是“卡住”请求的示例.第一个请求是视频,第二个请求是我要发送的AJAX,并且在第一个请求完成之前没有收到任何请求.

enter image description here

一个完成后,第二个立即完成.

enter image description here

Web服务器是Apache2.它是在IE和Chrome中复制的.

仅使用普通jQuery的$.ajax()调用发送Ajax请求.

这是阻止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_start()的会话时,该过程会将会话文件锁定在服务器上,直到完成为止.阻止所有其他试图打开同一会话文件PHP进程.

这就是为什么您在同一浏览器中看到此行为的原因,而在另一台计算机或其他浏览器上却没有看到此行为的原因(因为会话不同).

解决您的问题的方法是使用

session_write_close();

每当您不需要写入会话时.调用函数时,您仍然可以从会话变量中读取内容,但是要再次写入会话变量,则需要使用session_start()重新打开会话.

您可以阅读很多有关here的问题.

示例:(从链接页面)

// 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.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...