gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 00:58:37 24 4
gpt4 key购买 nike

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

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

我进一步调查了这个问题,发现了一些奇怪的事情。

  • 虽然持久的 PHP 脚本正在运行,但我无法从同一浏览器调用任何 PHP 脚本(无论是否使用 AJAX)。
  • 同时从其他浏览器服务器可以毫无问题地访问。
  • 可以毫无问题地访问非 php Assets (图像、视频)。
  • 如果直接从 .mp4 文件播放视频,则问题不存在。可以在播放视频时处理对 php 的 AJAX 请求。

我很好奇是什么导致了这个问题。据我所知,它可能是服务器和浏览器配置的组合。

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

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

第一个完成后,第二个立即完成。 enter image description here

Web 服务器是 Apache 2。它在 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

最佳答案

session 锁

此问题可能是由 session 锁定引起的。当持久的 php 脚本使用带有 session_start() 的 session 时,进程会锁定服务器上的 session 文件,直到它完成。阻止尝试打开同一 session 文件的所有其他 PHP 进程。

这就是为什么您在同一浏览器中看到此行为,但在另一台机器或不同浏览器上却看不到(因为 session 不同)。

你的问题的解决方案是使用

session_write_close();

每当您不需要写入 session 时。调用此函数时,您仍然可以从 session 变量中读取,但要再次写入 session 变量,您需要使用 session_start() 再次打开 session 。

这个题你可以看很多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.

关于javascript - 当有另一个持久的 php 脚本在运行时,没有 php 脚本可以在服务器上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34038280/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com