2011-08-18 111 views
1

我想从PHP脚本发布一些数据(一个JSON字符串)到一个Java服务器(全部由我自己写的)并得到响应回来。 我尝试下面的代码:在PHP缓慢的HTTP POST请求

$url="http://localhost:8000/hashmap"; 
$opts = array('http' => array('method' => 'POST', 'content' => $JSONDATA,'header'=>"Content-Type: application/x-www-form-urlencoded")); 
$st = stream_context_create($opts); 
echo file_get_contents($url, false,$st); 

现在,这个代码实际工作(我回来的结果是正确的答案),但的file_get_contents挂起每次20秒执行(我之前打印的时间和指令后)。服务器执行的操作只需要很少的时间,我相信等待所有这些时间来获得响应是不正常的。 我错过了什么吗?

+1

为什么你不使用curl? –

+0

tbh我不能看到或知道任何有助于这一切的东西,在代码中似乎都是正常的,但是,一个建议是,为什么不把所有的代码放在一个函数中,然后在需要时调用该函数。 – RSM

+0

@Daniel A. White:我知道,但我想避免使用这个项目的扩展名,它应该独立于其他库。 – breathe0

回答

0

尝试增加Connection: closeContent-Length: strlen($JSONDATA)头到$opts。另外,如果您想避免使用扩展名,请查看this class,我前一段时间写过使用PHP核心执行HTTP请求。它适用于PHP4(这就是我写它的原因)和PHP5,它所需要的唯一扩展是OpenSSL,并且只有在需要执行HTTPS请求时才需要。在顶部的评论中记录(ish)。

支持各种东西 - GET,POST,PUT等,包括文件上传,cookies,自动重定向处理。我在一个经常使用PHP的平台上使用它很多,它坚持使用PHP/4.3.10,并且它运行的非常漂亮...即使我自己这样说...

+0

工作就像一个魅力。非常感谢!请,你能解释为什么它必须完成吗? – breathe0

+1

'Content-Length'告诉服务器你要发送多少数据 - 如果你没有包含它,服务器不知道你已经完成数据发送,并且不会处理响应,直到服务器上的定时器机制过期 - 这取决于服务器多长时间。 'Connection:close'告诉服务器在完成这个请求后立即删除TCP连接,因为HTTP/1.1在单个TCP会话上支持多个请求。如果您感兴趣,请阅读RFC(http://www.w3.org/Protocols/HTTP/1.1/draft-ietf-http-v11-spec-01.html#Keep-Alive)。 – DaveRandom

+0

我在编辑之前编写了previuos注释,并且询问关于连接的信息:close(即使没有strlen($ jsondata)也可以工作)。我看到你的班级,很酷的队友!谢谢,我会用它 – breathe0

1

严重错误配置的服务器可能不会发送正确的内容大小和使用HTTP/1.1。

请修复服务器或请求该数据作为HTTP/1.0

+0

内容大小是否正确。我使用httpserver sun api,并检查了内容的大小。尝试1.0和1.1,但它不影响行为。不管怎么说,还是要谢谢你! – breathe0