gpt4 book ai didi

fastcgi - 我可以像 register_shutdown_function 一样使用 fastcgi_finish_request() 吗?

转载 作者:行者123 更新时间:2023-12-01 01:12:02 24 4
gpt4 key购买 nike

这种缓存动态内容的简单方法使用 register_shutdown_function()退出脚本后将输出缓冲区推送到磁盘上的文件。但是,我正在使用 PHP-FPM ,这不起作用;添加到函数中的 5 秒 sleep 确实会导致从浏览器执行脚本时延迟 5 秒。 PHP 文档中的评论者指出,PHP-FPM 用户有一个特殊功能,即 fastcgi_finish_request() .但是,关于此特定功能的文档并不多。
fastcgi_finish_request()点似乎是刷新所有数据并继续执行其他任务,但我想要实现的目标通常与 register_shutdown_function() 一起使用, 基本上是将输出缓冲区的内容放入文件中,而无需用户等待此操作完成。

有什么方法可以在 PHP-FPM 下实现这一点,使用 fastcgi_finish_request()或其他功能?

$timeout = 3600; // cache time-out
$file = '/home/example.com/public_html/cache/' . md5($_SERVER['REQUEST_URI']); // unique id for this page
if (file_exists($file) && (filemtime($file) + $timeout) > time()) {
readfile($file);
exit();
} else {
ob_start();
register_shutdown_function(function () use ($file) {
// sleep(5);
$content = ob_get_flush();
file_put_contents($file, $content);
});
}

最佳答案

是的,可以使用 fastcgi_finish_request为了那个原因。您可以保存此文件并查看它是否有效:

<?php

$timeout = 3600; // cache time-out
$file = '/home/galymzhan/www/ps/' . md5($_SERVER['REQUEST_URI']); // unique id for this page
if (file_exists($file) && (filemtime($file) + $timeout) > time()) {
echo "Got this from cache<br>";
readfile($file);
exit();
} else {
ob_start();
echo "Content to be cached<br>";

$content = ob_get_flush();
fastcgi_finish_request();
// sleep(5);

file_put_contents($file, $content);
}

即使您用 sleep(5) 取消注释该行,您会看到该页面仍然立即打开,因为 fastcgi_finish_request将数据发送回浏览器,然后继续处理之后编写的任何代码。

关于fastcgi - 我可以像 register_shutdown_function 一样使用 fastcgi_finish_request() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14902917/

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