header()
函数被CLI SAPI完全忽略。但对于Apache和CGI SAPI有一定影响。
简单来说,CLI SAPI在sapi_*_header_*
函数中不实现任何逻辑。举个例子,在php_cli.c
文件中:
static int sapi_cli_send_headers(sapi_headers_struct *sapi_headers TSRMLS_DC)
{
return SAPI_HEADER_SENT_SUCCESSFULLY;
}
所有这些函数基本上都会返回
NULL
、
0
或一个虚假的成功消息。
对于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;
}
你可以通过使用
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("\r\n", 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!