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;
}
/* }}} */
所有这些函数基本上都返回NULL
, 0
或伪造的成功消息。
对于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 to extract keywords from a block of text in Haskell