使用php fopen和流上下文从后期接收数据时遇到问题

时间:2011-01-28 21:50:34

标签: php http http-post fopen

我一直试图弄清楚我的错误在这个特定功能中的位置。 它与在线发布的功能非常相似,只有一些小的调整。无论如何,我在变量$ PAYMENTPAGE-> ipa_url中有一个特定的url。我试图发布到这个并简单地让返回数据为die('test')以验证连接是否正常进行。 相反,我不断得到一个空白页面。

我已经设法使用curl扩展使其工作,但更喜欢简单地使用流,因为它们开箱即用的任何扩展。我知道正在建立连接,因为我收到了我修复的异常错误,但现在我只是弄清楚为什么没有从帖子中返回任何信息。

function doPostRequest($url, $data, $optional_headers = null)
{
    $params = array('http' => array(
                'method' => 'POST',
                'content' => $data
             ));
    if ($optional_headers !== null) {
        $params['http']['header'] = $optional_headers;
    }
    $ctx = stream_context_create($params);
    $get_stream = true;
    try{
        $fp = @fopen($url, 'rb', false, $ctx);
        if (!$fp) {
             throw new Exception("Problem creating stream from $url, \n\t".implode("\n\t", error_get_last()));
        }
        $response = @stream_get_contents($fp);
        if ($response === false) {
           throw new Exception("Problem reading data from $url, \n\t".implode("\n\t", error_get_last()));
        }
        $get_stream = false;
    } catch(Exception $e){
        mcFatal("Error(".date('Y-m-d h:i:s').'):'.$e->getMessage()."\n");
    }


    if($get_stream){
        return false;
    }

    return $response;
}

2 个答案:

答案 0 :(得分:1)

如果您使用的是Ubuntu:这是Ubuntu发布的PHP版本中的一个错误。有关详细信息,请参阅https://bugs.launchpad.net/ubuntu/+source/php5/+bug/650779

答案 1 :(得分:-1)

您是否有任何理由不使用http协议库,例如cURL?它为您处理流,并在发生错误时生成信息。

function doPostRequest($url, $data, $optional_headers = null) 
{
   $ch = curl_init();
   curl_setopt($ch, CURLOPT_URL, $url);
   curl_setopt($ch, CURLOPT_POST, 1);
   curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

   //include array of additional headers
   if (count($optional_headers)) {
      curl_setopt($ch, CURLOPT_HTTPHEADER, $optional_headers);
   }

   return curl_exec($ch);
}