【问题标题】:How to forcing set header content length?如何强制设置标题内容长度?
【发布时间】:2019-09-11 14:22:03
【问题描述】:

我有一个很大的 PHP 文件,执行需要很长时间。 所以我想设置 Content-Length = 26。不要等到最后。 但问题是服务器总是将“内容长度”设置为实际长度。 如何强制 Content-Length?


header('Connection: close');
header('Cache-control: no-store');
// set Content-Length for just 26
header('Content-Length: 26');
echo 'Received and Processing...';
flush();ob_flush();


//// some codes...
//// some codes...
//// some codes...

echo 'end!';

我在本地服务器上尝试输出:Received and Processing...

但在我的网站服务器中,输出为: 已收到并正在处理...结束!

我该如何解决这个问题。

【问题讨论】:

    标签: php


    【解决方案1】:

    HTTP Content-Length 标头不是超时。它告诉 HTTP 消息的接收者消息正文包含多少字节,以便接收者知道何时停止从连接中读取更多字节。如果Content-Length 标头包含错误的值,事情就会中断。您应该永远必须手动设置该标题。

    为了限制 PHP 脚本的执行时间,函数 set_time_limit 和全局配置变量 max_execution_time 似乎是您的选择。

    【讨论】:

    • 我不想限制执行时间。我想设置“内容长度”,但服务器将其设置为实际长度
    • @BaselKhatib 在你的问题中你说你不想等待文件完成执行,我一定是误解了。在任何情况下,您都不应该自己设置 Content-Type 标头,因为这导致接收器出现问题,如果不是之前的话。
    【解决方案2】:

    如果我已理解您在问题和后续 cmets 中所说的内容,您希望服务器尽快确认操作,而不是等待处理完成。

    修改 http 标头不是正确的方法。假设您对处理过程中可能出现的任何新信息不感兴趣,那么有多种方法可以实现这一点,但您需要将处理的执行与导航线程分离。

    如果您触发第二个 PHP 进程(使用第一个 PHP 进程发出 http 请求或从浏览器中的 JavaScript 发出请求)并在该操作上设置超时,并以 ignore_user_abort(true) 开始第二个脚本,那么您将拥有实现了这一点。有other solutions

    但如果延迟是由于带宽限制,您别无选择,只能等待。

    【讨论】:

    • 是的,这就是我想要的!但是如何通过这种方式向 longThing.php 发送 POST 请求?
    • 文件在服务器上后,您使用单独的进程来执行需要很长时间的事情。您无法做任何事情来加快传输文件的过程。您可以通过 ajax 或在 iframe 中更改页面其他地方的内容来阻止上传。
    • 我找到了解决方案stackoverflow.com/questions/8024821/…
    猜你喜欢
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 2012-05-01
    • 2012-05-26
    • 2011-10-27
    • 2015-01-06
    相关资源
    最近更新 更多