PHP fsockopen客户端没有收到发送的数据

时间:2015-11-18 10:34:47

标签: php fsockopen php-socket

我有以下(精简版)代码:

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);解决了我的问题,是否有更好的解决方案?

2 个答案:

答案 0 :(得分:1)

您的问题可能是您在PHP中编写了服务器代码,默认情况下您没有ignore_user_abort = true(请参阅http://php.net/manual/en/misc.configuration.php#ini.ignore-user-abort),因此当您关闭连接时,您的服务器会停止执行您的PHP代码,因此fread(fp,1)解决你的问题 - 连接在php开始编写响应之前不要关闭

您可以使用此代码使服务器测试它是否实际连接 -

const uint SPI_GETMOUSESPEED

它将在http://127.0.0.1:1337

上创建一个netcat风格的服务器

答案 1 :(得分:0)

fread需要两个参数:资源和要读取的长度字节数。 现在你只读1个字节。 fread($fp, 1);

如果您想阅读完整的结果,请将其循环直至完全退回:

while(!feof($fp)){
    echo fread($fp, 128);
}