如何阻止 PHP 向客户端发送数据,同时仍在服务器中运行 PHP 代码?

2024-02-29

当我遇到一个导致我的 PHP 程序无限循环的错误时,我想到了这个问题。下面是一个示例情况:

假设我有一个接收图片上传的PHP网页(该页面可能是图像上传表单的响应页面)。在服务器中,脚本应将图像存储在临时文件中。然后,脚本应该向客户端输出一条确认消息,然后停止发送数据,以便客户端不会等待。然后,脚本应继续执行,在结束之前处理图像(例如调整其大小)。

我认为这种“技术”可能很有用,这样客户端就不会在耗时的过程中等待,从而防止超时。

另外,可以使用 HTTP 方法解决这个问题吗?


Yes.

如果正确利用 HTTP 标头,这可以轻松完成,无需任何异步处理。

正常情况下,一旦另一端的客户端关闭连接,PHP 就会停止处理。如果您想在此事件之后继续处理,您需要做一件事:告诉 PHP 忽略用户中止。如何?

ignore_user_abort()

这将使您的脚本即使在客户端无法躲避之后也能继续运行。但我们还面临着如何告诉客户端他们发出的请求已完成以便其关闭连接的问题。通常,如果我们不指定这些标头,PHP 会透明地为我们处理发送这些标头。不过,在这里,我们需要明确地执行此操作,否则客户端将不知道我们何时希望他们停止阅读响应。

为此,我们必须发送适当的 HTTP 标头来告诉客户端何时关闭:

Connection: close
Content-Length: 42

这种标头组合告诉客户端,一旦读取了 42 字节的实体主体响应,消息就已完成,并且应该关闭连接。这种方法有几个后果:

  1. 您必须生成您的回复BEFORE发送任何输出,因为您必须确定其内容长度大小(以字节为单位),以便可以发送正确的标头。
  2. 您必须实际发送这些标头BEFORE您回显任何输出。

所以你的脚本可能看起来像这样:

<?php

ignore_user_abort();

// do work to determine the response you want to send ($responseBody)
$contentLength = strlen($responseBody);

header('Connection: close');
header("Content-Length: $contentLength");
flush();

echo $responseBody;

// --- client will now disconnect and you can continue processing here ---

The big "Gotchya" with this method is that when you're running PHP in a web SAPI you can easily run up against the max time limit directive if you do time-consuming processing after the end user client closes the connection. If this is a problem, you may need to consider an asynchronous processing option using cron because there is no time limit when PHP runs in a CLI environment. Alternatively, you could just up the time limit of your scripts in the web environment using set_time_limitdocs http://php.net/manual/en/function.set-time-limit.php.

It's worth mentioning that if you do something like this, you may also want to add a check to connection_aborted()docs https://www.php.net/manual/en/function.connection-aborted.php while generating your response body so that you can avoid the additional processing if the user aborts before completing the transfer.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何阻止 PHP 向客户端发送数据,同时仍在服务器中运行 PHP 代码? 的相关文章

  • 在 WordPress 中使用 jquery 日期选择器

    我想要在我的 WordPress 模板页面的表单中使用日期选择器 但它不起作用 这是我的子主题functions php的代码 function modify jquery if is admin comment out the next
  • 如何使用 Laravel 5.3 注销并重定向到登录页面?

    我正在使用 Laravel 5 3 并尝试实现身份验证系统 我用了php artisan命令make auth来设置它 我根据我的布局编辑了视图 并将其重定向到我的仪表板页面而不是主页 在设置中设置为默认值 现在 当我尝试注销时 它向我抛出
  • cookie 在会话结束时或在特定时间过期?

    cookie 是否可以在会话结束时或在特定时间过期 是的 这很简单 HttpCookie newCookie new HttpCookie myCookie newCookie Expires DateTime Today AddDays
  • 如何从循环内的字符串中删除最后一个字符

    我正在尝试在 xml 中的一行中打印所选的不同类别 喜欢
  • 包含 WordPress 之外的 WordPress 内容

    我正在寻找构建 WordPress 网站的移动版本 并将其大部分内置于静态文件中 但我试图从运行移动网站的外部 PHP 文件内部访问 WordPress 内容 如何在不手动编写 SQL 查询的情况下访问循环或数据库 Edit 为了澄清一下
  • 在 WordPress 中挂钩 AJAX

    我一直在深入研究 Javascript 和 AJAX 的世界 我非常接近 但由于某种原因 我认为我没有正确地连接到 wordpress ajax 函数 我已经仔细阅读了文档和这个 认为 99 都在那里 这个应用程序的作用是有一个项目列表 每
  • StrRev() 不支持 UTF-8 [重复]

    这个问题在这里已经有答案了 我正在尝试编写一个代码来替换非阿拉伯支持的程序中支持的阿拉伯文本因为我需要在替换后反转文本 但它显示一些垃圾内容而不是想要的结果 这是代码 结果 After Reverse 我需要它是原来的样子 但相反 不是垃圾
  • 在非 WordPress php 页面之外显示 WordPress 帖子

    我需要在非 WordPress php 页面中显示 WordPress 博客文章 我已经尝试过以下代码
  • 传递表单变量的安全方式

    我正在为我的 WordPress 主题构建联系表单 我希望能够从后端输入接收者地址 目前我正在传递带有隐藏输入字段的变量
  • MySQL ifnull 相当于 php

    我的场景 exTime get cfg var session gc maxlifetime get cfg var session gc maxlifetime 1440 我希望它像 mysql 一样 exTime isnull get
  • Gmail 搜索怎么这么快?

    搜索这么多字符的最有效方法是什么 你怎么认为 假设网站是用 PHP 和 MySQL 构建的 我应该学习什么才能尽可能有效地构建它 有什么我应该学习的算法吗 文本索引算法 https stackoverflow com questions 4
  • MySQL分层存储:搜索所有父母/祖父母等。给定子节点 id 的节点?

    我使用分层模型存储类别 如下所示 CATEGORIES id parent id name 1 0 Cars 2 0 Planes 3 1 Hatchbacks 4 1 Convertibles 5 2 Jets 6 3 Peugeot 7
  • Codeigniter子域路由

    我正在尝试在 CodeIgniter 框架上运行的网站上设置博客脚本 我想在不对现有网站代码进行任何重大代码更改的情况下执行此操作 我认为创建一个指向另一个控制器的子域将是执行此操作的最干净的方法 我设置新设备所采取的步骤Blog涉及控制器
  • 将平面数组拆分为分组子数组,其中包含输入数组中连续键的值

    我有一个数组array diff函数 如下所示 Array 0 gt world 1 gt is 2 gt a 3 gt wonderfull 5 gt in 6 gt our 正如您所看到的 键 3 和键 5 之间有一个间隙 即没有键 4
  • 避免刷新时上传图片

    我正在使用最简单的图像上传形式 我非常希望保持这种方式 只需要一些 php 代码看起来像这样
  • PHP、in_array 和数组中的快速搜索(到最后)

    我对在数组中进行快速搜索的更好方法有疑问 我正在谈论一个特定的情况 假设我有一个数组 L A B C 当我开始时 当程序运行时 L 可能会增长 但到最后 当我进行搜索时 一个可能的原因是 L A B C D E 事实是 当我搜索时 我想要找
  • 无效数据的 REST 响应代码

    如果出现以下情况 应将什么响应代码传递给客户端 用户注册时传递了无效数据 例如电子邮件格式错误 用户名 电子邮件已存在 我选择了403 我还发现了以下我觉得可以用的 维基百科 412 前提条件失败 服务器不满足请求者要求的先决条件之一 提出
  • 将延期交货库存状态添加到 Woocommerce 可变产品下拉列表中

    我想在下拉菜单中显示可变产品的库存状态 包括 缺货 因为我网站上的大多数产品都缺货 而不是 缺货 我已经尝试过答案如何将变体库存状态添加到 Woocommerce 产品变体下拉列表中 https stackoverflow com ques
  • 如何更改数组键从 1 而不是 0 开始[重复]

    这个问题在这里已经有答案了 我在某个数组中有值 我想重新索引整个数组 以便第一个值键应该是 1 而不是零 即 默认情况下 PHP 中的数组键从 0 开始 即0 gt a 1 gt b 我想重新索引整个数组以从 key 1 开始 即1 gt
  • APC 将数据存储在哪里?

    我想用apc store 缓存一些结果 但我需要知道数据将存储在哪里 以及限制是什么 它总是存储在内存中吗 或者也写入磁盘 我希望将不经常访问的数据存储在磁盘上 我应该为此使用不同的缓存系统吗 这就是极限了吗 apc shm size 32

随机推荐

  • oauth2Client.getToken 缺少刷新令牌

    我有一个小型快递服务器 有两条路线 然后它将 json 令牌写入文件 我知道非常不安全 由于某种原因没有refresh token 在文档中有一条评论offline for access type gets refresh token 已经
  • 在 Maven 构建期间将文件添加到 jar

    我试图在执行 Maven 构建时将许可证文件添加到我的所有 jar 中 我有每个类文件的许可证 但我希望将 License txt 添加到每个 jar 中的每个 META INF 文件夹 我的项目有一个主 pom 其中有六个模块 然后这些模
  • 发送相机意图后立即调用 onActivityResult

    我正在使用相机意图在我的应用程序中启动相机 但是一旦意图被触发onActivityResult被解雇了 我什至还没有拍照 当我拍照时 选择它并返回到我的活动onActivityResult根本没有被叫到 这是我启动相机的方法 Package
  • 使用 Visual Studio 构建伪语言 (qps-ploc) 附属程序集

    我已经生成了应用程序资源文件的伪本地化版本 例如Order Summary and Payment本地化为 O r d e r S u m m a r y a n d P a y m e n t 以便我们可以在获得实际翻译之前测试本地化错误
  • 如何在Reactjs中点击按钮重定向到另一个页面

    我想使用 React 创建一个基本的 Web 应用程序 我已经实现了创建按钮 我想在单击按钮时重定向到另一个页面 下面是我的 App js 代码 import React from react import logo from logo s
  • 在Python中使用PIL压缩PNG图像

    我有一个用 Selenium Builder 记录的 python 脚本 它使用以下命令获取网页的完整浏览器屏幕截图 fileName Screenshot1 png webDriverInstance save screenshot fi
  • 如何将 WooComerceAPI 集成到 React 中?

    我想通过 API 在 React 上接收数据到我的网站 我按照文档中所述执行了所有操作 执行了安装npm install save woocommerce api 使用文档中的参数创建对象http woocommerce github io
  • 无法验证包:727047181.itmsp

    我在存档文件后在应用程序商店中上传了构建版本 它将在我收到此错误时上传构建版本 1 Apple的Web服务操作不成功 2 无法验证包 727047181 itmsp 3 错误 ITMS 9000 无法更改捆绑包标识符的当前值 ue com
  • 使用 PHP 从 Google Chrome 书签导出中提取数据

    我想将我的 google chrome 书签放入数据库 所以我的第一步是使用 PHP 从 chrome 导出 html 文件并将数据放入变量中 我希望获得一些能够运行的 PHP 代码下面的数据 它会将 URL ADD DATE ICON 和
  • 无法通过管道以自定义方式重命名下载的图像

    我使用 python 的 scrapy 模块创建了一个脚本 从 torrent 站点下载并重命名电影图像 并将它们存储在 scrapy 项目内的文件夹中 当我按原样运行脚本时 我发现它正确地下载了该文件夹中的图像 此时 脚本正在使用 req
  • javascript从所选国家/地区值中选择城市

    我有来自这里的国家数据库http www webmasterworld com html 3018309 htm http www webmasterworld com html 3018309 htm有239个国家 每个国家都有价值 在选
  • 这个指针类型防水吗?

    我正在尝试设计一种自定义类型 可以在需要窗口句柄或其他类型指针的 API 中使用 并且适用于 VBA 可以运行的所有系统 这是我所得到的 If Win64 1 And VBA7 0 Then Public Type LongLong 64
  • Chart.js 上的悬停模式

    当您未将鼠标悬停在折线图中的特定 点 上时 是否可以激活悬停 I want that每当我将鼠标悬停在图表的任何部分上时就会激活特定的工具提示 Edit 像这样的东西http watchstocks herokuapp com http w
  • 减少纬度和经度点数的最快方法

    我正在尝试减少并组合一些点到这些位置的中心点 现在 我通过找到最接近的一对 将它们组合起来并重复 直到将其减少到我的目标 旁注 实际上我通过排序来减少问题 lat lat long long 然后在每个点的两侧搜索 10 根据我的测试 总是
  • Swift 框架在 lldb 中返回“模糊使用”方法扩展

    我已升级到 Xcode 11 和 swift 5 并在通过框架提供方法扩展时遇到了问题 更具体地说 在一个结构如下的项目中 gt Main Project gt Framework created from sources in Main
  • Keras 1.0 支持 scipy 稀疏矩阵吗?

    我找不到关于 keras 是否支持 scipy 稀疏矩阵作为训练 测试向量的明确答案 我已阅读此链接 这似乎意味着它没有https www kaggle com c walmart recruiting trip type classifi
  • R闪亮滑块输入显示时间

    我有一个与 R Shiny 中的 sliderInput 相关的问题 在 sliderInput 中 该值是一个数字 一些示例显示该数字是 number 但是 如果我想将 sliderInput 的值显示为时间 例如 10 00 15 00
  • 如何循环匹配正则表达式的所有元素?

    案例如下 我想找到与正则表达式匹配的元素 targetText SomeT1extSomeT2extSomeT3extSomeT4extSomeT5extSomeT6ext 我在 javascript 中使用正则表达式 如下所示 reg n
  • Xcode 自动完成块内块(以及它们所在的块......)

    如何设置一个块属性 该属性将另一个块属性作为参数 以便自动完成功能为两个块提供所有必需的参数 为了进一步解释 我将演示自动完成功能如何仅适用于一个块属性 In AppDelegate h 为所有需要访问 block 属性的类创建一个引用 A
  • 如何阻止 PHP 向客户端发送数据,同时仍在服务器中运行 PHP 代码?

    当我遇到一个导致我的 PHP 程序无限循环的错误时 我想到了这个问题 下面是一个示例情况 假设我有一个接收图片上传的PHP网页 该页面可能是图像上传表单的响应页面 在服务器中 脚本应将图像存储在临时文件中 然后 脚本应该向客户端输出一条确认