用workerman做web服务器,执行的php文件如何实现header跳转?

小七他哥

用 workerman 实现的web服务器,执行 php 文件的方法如下:

function exec_php_file($file) {
    \ob_start();
    // Try to include php file.
    try {
        include $file;
    } catch (\Exception $e) {
        echo $e;
    }
    return \ob_get_clean();
}

现在被执行的文件需要 header,请问该如何实现呢?不要回答用 response,然后 connection send 这种答案了,我的这个文件里面没有 connection 这个变量的,谢谢。

另外请问一下站长,为和标签里面没有workerman标签?都没有适合我这个问题的标签啊。

900 2 0
2个回答

six
return \ob_get_clean();

改成

$headers = [];
return new Response(200, headers, \ob_get_clean());

这样

  • 小七他哥 2022-09-09

    大神您好,还请问下这种情况下,php文件该如何获取 $_POST 变量的值呢?谢谢。

  • six 2022-09-09

    onMessage 里加一行 $_POST = $request->post();

  • 小七他哥 2022-09-09

    谢谢,$_POST 这个问题解决了,但是 header 这个不行啊,主要代码如下:

    if (pathinfo($path, PATHINFO_EXTENSION) === 'php' && file_exists($file)) {
                    $_POST = $request->post();
                    return $connection->send(exec_php_file($file));
                } else {
                    $response->withFile($file);
                }

    $file 里面定义的 $header 变量没法传到 exec_php_file 函数里面去。

six
function exec_php_file($file) {
    \ob_start();
    // Try to include php file.
    try {
        $headers = include $file;
    } catch (\Exception $e) {
        echo $e;
    }
    return new Response(200, headers, \ob_get_clean());
}

file里返回一个header数组。

  • 小七他哥 2022-09-09

    我改成这样了,它不跳转啊:

    $_POST = $request->post();
                    $response->withBody(exec_php_file($file));
                    $response->withHeaders(['Location' => 'http://www.phpernote.com/']);
                    return $connection->send($response);
  • 小七他哥 2022-09-09

    但是我打开这个页面看返回的 headers ,确实有 Location 的,但是就是没跳转:

    Access-Control-Allow-Credentials: true
    Access-Control-Allow-Headers: *
    Access-Control-Allow-Methods: *
    Access-Control-Allow-Origin: *
    Connection: keep-alive
    Content-Length: 851
    Content-Type: text/html;charset=utf-8
    Location: http://www.phpernote.com/
    Server: workerman
  • six 2022-09-09

    跳转是3xx,不是200

  • 小七他哥 2022-09-09

    谢谢指点,改成这样,终于可以了,但是代码写的太难看了,哈哈,看来这个还是不适合做 http 服务器啊:

    if (pathinfo($path, PATHINFO_EXTENSION) === 'php' && file_exists($file)) {
                    $_POST = $request->post();
    
                    $content = exec_php_file($file);
                    if (!empty($_SERVER['header']['Location'])) {
                        $response->withStatus(301);
                        $response->withHeaders(['Location' => $_SERVER['header']['Location']]);
                    }
    
                    $response->withBody($content);
                    return $connection->send($response);
                } else {
                    $response->withFile($file);
                }
  • six 2022-09-09

    它本身就是底层的,不懂机制底层机制不会抽象当然乱了。
    http直接用官网的webman就好了,和平时业务一样的写法,一点不乱

  • 小七他哥 2022-09-09

    谢谢建议,主要是我在用 gatework 做一个即时通讯的东西,里面涉及到一点点 http 请求相关的东西,不想再用 webman 这个重型框架搞了,就想直接用 workerman 解决试一下。

年代过于久远,无法发表回答
🔝