关于php-fpm通讯时没有REQUEST_METHOD的问题
nginx是通过fastcgi协议来和php通讯的!而php-fpm就扮演了这样的角色
fastcgi协议 中文版http://blog.chinaunix.net/uid-380521-id-2412484.html
英文版 http://www.fastcgi.com/drupal/node/6
fastcgi通讯的顺序
大概是这样
1
2
3
4
5
6
7 |
{FCGI_BEGIN_REQUEST, 1, {FCGI_RESPONDER, 0}} {FCGI_PARAMS, 1, "\013\002SERVER_PORT80\013\016SERVER_ADDR199.170.183.42 ... " } {FCGI_PARAMS, 1, "" } {FCGI_STDIN, 1, "" } {FCGI_STDOUT, 1, "Content-type: text/html\r\n\r\n<html>\n<head> ... " } {FCGI_STDOUT, 1, "" } {FCGI_END_REQUEST, 1, {0, FCGI_REQUEST_COMPLETE}} |
factcgi传输数据是的一些标志
1
2
3
4
5
6
7 |
#define FCGI_BEGIN_REQUEST 1 //开始开传输 #define FCGI_ABORT_REQUEST 2 //中断传输 #define FCGI_END_REQUEST 3 //结束输出 #define FCGI_PARAMS 4 //输出环境变量 #define FCGI_STDIN 5 //输入 #define FCGI_STDOUT 6 //接受数据 fastcgi 返回的数据 #define FCGI_STDERR 7 //接受到错误 fastcgi返回的信息x |
今天写了一个dome 是通过fastcgi协议来和php通讯!,
1 |
如果在FCGI_PARAMS值传入下面参数,出现了一个很奇怪的问题 |
1
2 |
char
name[] = "SCRIPT_FILENAME" ; //让具体脚本执行 char
value[] = "/var/www/f.php" ; |
/var/www/f.php的代码
<?php echo "Hollo World!\n"; file_put_contents("/tmp/php/test.log", "test\n" ,FILE_APPEND);
结果:test.log 没有写入数据,但是返回如下数据
1
2
3
4
5
6
7 |
read: Success X-Powered-By: PHP/5.3.9 Content-type: text/html read: Success 查看php-fpm的请求日志 127.0.0.1 - 05/Apr/2014:23:33:08 +0800 - - 200 /var/www/f.php<br>状态是200,说明成功。 但是前面有两个 - - 这个两个的位置是我在php-fpm.conf 加入的 %{REQUEST_METHOD}e、%{SERVER_PROTOCOL}e 这个两个环境变量 |
1 |
REQUEST_METHOD用来表示请发的方法,SERVER_PROTOCOL用来表示请求的协议 |
一个很奇怪的问题出现了
http状态是200,但是php文件根本没有执行
在传递FCGI_PARAMS时,加入了下面2对参数就正常了
name = "REQUEST_METHOD"; value = "GET"; name = "SERVER_PROTOCOL"; value = "HTTP/1.1";
加入REQUEST_METHOD、SERVER_PROTOCOL之后的
1
2
3
4
5
6
7
8
9 |
//fastcgi的返回信息 X-Powered-By: PHP/5.3.9 Content-type: text/html Hollo World! //php-fpm的log 127.0.0.1 - 05/Apr/2014:23:35:08 +0800 GET HTTP/1.1 200 /var/www/f.php //test。log也出现了test |
但是无法解释,在web server 传递给factcgi数据时
其FCGI_PARAMS项里面如果REQUEST_METHOD。
则php-fpm为啥不执行SCRIPT_FILENAME文件,但是日志记录是状态为什么会是200并返回如下的数据呢
1
2 |
X-Powered-By: PHP/5.3.9 Content-type: text/html |
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。