草庐IT

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

coder 2024-05-02 原文

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

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

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

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

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

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

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

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

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/

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

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  3. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  4. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  5. ruby-on-rails - 渲染另一个 Controller 的 View - 2

    我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>

  6. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

  7. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  8. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  9. ruby-on-rails - 独立 ruby​​ 脚本的配置文件 - 2

    我有一个在Linux服务器上运行的ruby​​脚本。它不使用rails或任何东西。它基本上是一个命令行ruby​​脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg

  10. ruby - Sinatra:运行 rspec 测试时记录噪音 - 2

    Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/

随机推荐