背景:
我设计了一个网站并制作了一个访问点,index.php
. 所以我可以在那里做一些全局设置。index.php
文件将解析请求 URI 并从客户端加载所需的文件。这是index.php
下面的文件示例。
<?php
if (!defined('MINUTE_IN_SECONDS')) {
define( 'MINUTE_IN_SECONDS', 60 );
}
// ... more constants
require_once 'functions/lib/utility.php';
// ... more require files
/**
* Load other page content.
*/
if($_SERVER['REQUEST_URI'] !== $_SERVER['PHP_SELF']){
$route = new Route();
$page = $route->guessUrl('URI');
if(!empty($page) && $page != $_SERVER['PHP_SELF']){
$page = './' .ltrim($page, '/');
if(file_exists($page)){
include_once $page; // put required file content in buffer
}else{
http_response_code(404);
}
// exit;
}
}
问题:
该网站在 Apache 下运行良好。但是我把它移到 Swoole HTTP 服务器后,我遇到了一个我无法解决的问题。
在 Swoole 请求处理函数中,我遵循相同的设计并将所有请求传递给index.php
文件。然后index.php
file 将使用上面的代码找到所需的文件并返回输出缓冲区中的内容。这是 Swoole 请求处理函数的示例。
public function getResponseContent(){
$content = '';
try {
ob_start("ob_gzhandler");
$file = $_SERVER['DOCUMENT_ROOT'] .$_SERVER['PHP_SELF'];
$type = pathinfo($file, PATHINFO_EXTENSION);
if(empty($type) || strtolower($type) == 'php'){
$file = $_SERVER['DOCUMENT_ROOT'] .'/index.php';
}
include_once $file; // How to keep reload index.php ?
} catch (Exception $e) {
error_log($e->getMessage());
} finally {
$content = ob_get_clean();
}
return $content;
}
从上面的代码可以看出,如果需要的文件是 PHP 文件,则将请求传递给index.php
文件;如果一个文件是静态文件,例如css文件,我们直接获取静态文件内容。
所以现在当我访问该网站时,我输入了http(s)://website.com/home.php
. 因为这是第一次index.php
在 Swoole 中加载文件,所以很好,我可以在浏览器中正确看到页面。但是当我转到另一个页面时,例如http(s)://website.com/service.php
,Swoole HTTP 服务器将需要再次包含 index.php 文件。然后,这一次getResponseContent
函数什么也没返回。缓冲区中根本没有内容。我无法再次在缓冲区中加载 index.php 文件。
我试图解决这个问题,但失败了。
我的第一感觉是错误应该是关于include_once
。所以我将其更改include_once
为include
,我遇到了同样的问题。我尝试使用require
,我又遇到了同样的问题。
顺便说一句,我的php版本是7.4.3,Swoole版本是openswoole 4.10.0
请帮忙。任何反馈表示赞赏。
更新
苦苦挣扎了几天,不得不向 Swoole 团队询问。这是答复。https://github.com/swoole/swoole-src/issues/4605
将文件包装在函数中确实适用于这种情况。
顺便说一句,在处理这个问题时,我发现了一件有趣的事情。Openswoole 和 Swoole 现在不是一回事了。它们是单独的项目。在线阅读openswoole文档时,我以为Swoole在v4.7.1之后已经更名为openswoole。但事实是 Swoole 仍在自我发展。现在它的版本是 v4.8.x。只是给大家提个醒。不要将问题/问题发布到错误的 GitHub 存储库。