Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/418.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当另一个持久的php脚本正在运行时,服务器上不能运行任何php脚本_Javascript_Php_Ajax_Apache_Http - Fatal编程技术网

Javascript 当另一个持久的php脚本正在运行时,服务器上不能运行任何php脚本

Javascript 当另一个持久的php脚本正在运行时,服务器上不能运行任何php脚本,javascript,php,ajax,apache,http,Javascript,Php,Ajax,Apache,Http,我在服务器上运行了一个持久的PHP脚本。它将视频从服务器流到videotag(不要问我为什么这么做:-))。它可以运行几十分钟 问题是,我同时希望使用AJAX将请求发送到服务器,但在长脚本停止之前,请求不会发生 我对这个问题进行了更多的调查,发现了一些奇怪的事情 当持久的PHP脚本运行时,我不能从同一个浏览器调用任何PHP脚本(AJAX或非AJAX) 同时,从其他浏览器服务器可以毫无问题地访问 可以毫无问题地访问非php资产(图像、视频) 如果直接从.mp4文件播放视频,则问题不存在。可以在播

我在服务器上运行了一个持久的PHP脚本。它将视频从服务器流到
video
tag(不要问我为什么这么做:-))。它可以运行几十分钟

问题是,我同时希望使用AJAX将请求发送到服务器,但在长脚本停止之前,请求不会发生

我对这个问题进行了更多的调查,发现了一些奇怪的事情

  • 当持久的PHP脚本运行时,我不能从同一个浏览器调用任何PHP脚本(AJAX或非AJAX)
  • 同时,从其他浏览器服务器可以毫无问题地访问
  • 可以毫无问题地访问非php资产(图像、视频)
  • 如果直接从.mp4文件播放视频,则问题不存在。可以在播放视频时处理对php的AJAX请求
我很好奇是什么导致了这个问题。在我看来,这可能是服务器和浏览器配置的组合

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

下面是一个“卡住”请求的示例。第一个请求是视频,第二个请求是我想要发送的AJAX,在第一个请求完成之前,它不会发送到任何地方。

第一次完成后,第二次立即完成。

Web服务器是Apache2。它是用IE和Chrome复制的

Ajax请求仅使用普通jQuery的$.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\u start()
的会话时,进程将锁定服务器上的会话文件,直到完成。阻止尝试打开同一会话文件的所有其他PHP进程

这就是为什么您会在同一个浏览器中看到这种行为,但在另一台机器或不同的浏览器上看不到这种行为(因为会话不同)

解决问题的方法是使用

session_write_close();
当您不需要写入会话时。调用此函数时,仍然可以读取会话变量,但要再次写入会话变量,需要使用
session\u start()
再次打开会话

这个问题你可以读到很多

示例:(来自链接页面)
一次只能有1个PHP脚本访问同一个用户会话 ,所有其他脚本将等待第一个脚本完成

这是因为会话文件写入锁定

解决方案:

  • 如果不需要会话,请不要使用会话(在长脚本中) 或
  • 尽快调用session_write_close()以解锁会话文件

  • 不要问我为什么这样做:-)
    -自动盗版?如果您使用默认会话存储,则会话将写入文件。长时间请求将在会话文件上创建一个锁,以防止其他请求。当您不再需要会话信息时,可以将会话移动到数据库中,或者在长效脚本中使用
    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.