0

背景:

我设计了一个网站并制作了一个访问点,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.phpfile 将使用上面的代码找到所需的文件并返回输出缓冲区中的内容。这是 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_onceinclude,我遇到了同样的问题。我尝试使用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 存储库。

4

0 回答 0