header()如何工作?

Nie*_*sol 7 php

一个小小的上下文:
我需要在浏览器中运行PHP脚本,但是我不想在安装服务器时遇到麻烦,并且在计算机上运行服务器以及随之而来的所有东西都会受到影响,包括防火墙,等等等等.

所以我编写了自己的服务器.这是一个简单的PHP脚本,它侦听我的局域网IP的端口80上的连接,然后我只是在我的浏览器中加载该IP并且它可以工作.它接收HTTP请求并启动第二个PHP脚本exec- 这样我就可以轻松地对其进行更改而无需重新启动服务器脚本.第二个PHP脚本解析请求,最后解析include实际调用的脚本.它从那里获取输出,并使用适当的标题(我可以更改)将响应发送回浏览器.

是的,这是一团糟,但它确实有效.它做我需要做的事情.

现在提出问题:
我不能用header().它似乎对通过套接字连接发送回浏览器的内容没有任何影响.我已经改为创建了一个setheader()函数,并将标题存储在数组中以作为响应的前缀.

我想知道header()函数在内部如何实际工作,以便我可以使用该函数而不是我的"黑客"函数.

net*_*der 2

header()CLI SAPI 完全忽略该函数。但它对 Apache 和 CGI​​ SAPI 有影响。

简而言之,CLI SAPI 不实现sapi_*_header_*函数中的任何逻辑。例如,对于 CLI SAPI,位于php_cli.c

static int sapi_cli_send_headers(sapi_headers_struct *sapi_headers TSRMLS_DC) /* {{{ */
{
    /* We do nothing here, this function is needed to prevent that the fallback
    * header handling is called. */
    return SAPI_HEADER_SENT_SUCCESSFULLY;
}
/* }}} */
Run Code Online (Sandbox Code Playgroud)

所有这些函数基本上都会返回NULL0或者一条虚假的成功消息。

对于 CGI SAPI,位于cgi_main.c

static int sapi_cgi_send_headers(sapi_headers_struct *sapi_headers TSRMLS_DC)
{
    char buf[SAPI_CGI_MAX_HEADER_LENGTH];
    sapi_header_struct *h;
    zend_llist_position pos;
    zend_bool ignore_status = 0;
    int response_status = SG(sapi_headers).http_response_code;

    // Lots of other code...
}
Run Code Online (Sandbox Code Playgroud)

您可以使用二进制和一些数组操作轻松地完成这项工作php-cgi

服务器.php

$script_to_run = 'script.php';
exec('php-cgi '.escapeshellarg($script_to_run), $output);
$separator = array_search("", $output);

$headers = array_slice($output, 0, $separator);
$body = implode("\r\n", array_slice($output, $separator+1));

print_r($headers);
print $body;
Run Code Online (Sandbox Code Playgroud)

脚本.php

header('Content-Type: text/plain');
echo 'Hello, World!';
Run Code Online (Sandbox Code Playgroud)

输出:

Array
(
    [0] => X-Powered-By: PHP/5.3.8
    [1] => Content-Type: text/plain
)
Hello, World!
Run Code Online (Sandbox Code Playgroud)