header()如何工作?

一点背景:
我需要在浏览器中运行PHP脚本,但是我不想承担安装服务器的所有麻烦,并且承受在计算机上运行服务器以及随之运行的所有内容的开销,包括防火墙,等等等等等等。

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

是的,这是一团糟,但它的工作原理。 它做我需要做的事情。

现在提出这个问题:
我不能使用header() 。 它似乎对通过套接字连接发送回浏览器的内容没有任何影响。 我相反​​做了一个setheader()函数,并将数据头存储在一个数组中作为响应的前缀。

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


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;
}
/* }}} */

所有这些函数基本上都返回NULL0或伪造的成功消息。

对于cgi_main.c的CGI SAPI:

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...
}

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

server.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("rn", array_slice($output, $separator+1));

print_r($headers);
print $body;

script.php的

header('Content-Type: text/plain');
echo 'Hello, World!';

输出:

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

header()函数与你的实现完全一样:它只是在页面内容之前在响应中发送纯文本标题(这就是为什么如果有任何内容已经发送到客户端,它会抛出错误)。 所以,我认为你做的是正确的。 无论如何,你在实现中遇到了一些问题。 我认为安装Web服务器会容易得多。


你是否使用正确的CGI风格的调用? - 否则大多数与HTTP相关的函数都不能在PHP中工作 - 并且CGI仍然不如从Apache或IIS调用库

为什么不采取EasyPHP或类似的东西?

PS“解析请求”是什么意思?

链接地址: http://www.djcxy.com/p/9911.html

上一篇: How does header() work?

下一篇: How to extract keywords from a block of text in Haskell