【发布时间】:2015-11-18 10:34:46
【问题描述】:
我有以下(精简的)代码:
function curl_request_async($url, $params)
{
foreach ($params as $key => $val) {
$post_params[] = $key.'='.urlencode($val);
}
$post_string = implode('&', $post_params);
$parts=parse_url($url);
$fp = fsockopen($parts['host'],
isset($parts['port'])?$parts['port']:80,
$errno, $errstr, 30);
fwrite($fp, "$type ".$parts['path']." HTTP/1.1\r\n");
fwrite($fp, "Host: ".$parts['host']."\r\n");
fwrite($fp, "Content-Type: application/x-www-form-urlencoded\r\n");
fwrite($fp, "Content-Length: ".strlen($post_string)."\r\n");
fwrite($fp, "Connection: Close\r\n\r\n");
$bytes_written = fwrite($fp, $post_string);
var_dump($bytes_written, strlen($post_string));
// fread($fp, 1);
// fflush($fp);
fclose($fp);
}
这段代码的问题是我没有发现请求到达被调用服务器的证据。 var_dump($bytes_written, strlen($post_string));这一行输出了int(493) int(493),所以它应该已经收到了所有的数据,但它没有。
如果我取消注释 fread($fp, 1); 它可以正常工作。这可能是可行的解决方案,但似乎没有意义。必须有更好的方法!
那么我的问题有两个:为什么fread($fp, 1); 解决了我的问题,是否有更好的解决方案?
【问题讨论】:
-
不要尝试用 PHP 编写自己的 http 客户端,除非您在这两种技术方面都非常胜任并且有几个月的空闲时间来全职工作。仅列举您提供的代码中的错误将超出此处的答案范围。使用卷曲。我知道 PHP 文档很差,但是 C 库文档要好一些,而且可以正常工作。
-
@symcbean 并不难,如果您想支持 httpS 和内容编码协商以及重定向和内容长度以及所有花哨的东西,当然,但如果您只是想要一个简单的http GET 客户端,其实并不难。获取网址\r\nheader1\r\nheader2\r\n\r\nbody ~
-
@hansherik:查看您提供的代码似乎超出了您的能力范围。 TCP套接字不是硬位。您在上面提供的示例比 Lex 的代码更离谱。
标签: php fsockopen php-socket