2011-01-28 38 views
0

我一直在试图找出我的错误是在这个特定的功能。 这与网上发布的功能非常相似,只需稍作调整即可。无论如何,我在变量$ PAYMENTPAGE-> ipa_url中有一个特定的URL。我试图发布到这个,只是有一个返回数据('测试')来验证连接是否正常。相反,我不断收到一个空白页面。遇到麻烦从使用PHP fopen与流上下文接收数据返回

我已经设法使用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; 
} 
+0

我在想`stream_get_contents`是否会引发任何警告。删除错误抑制`@`,并确保你的`error_reporting`足够低以查看它(以及`display_errors`或`log_errors`)。另外,我不知道用f打开一个带有二进制标志的URL是否是预期的行为?无论如何,看看用`file_get_contents`替换`fopen` +`stream_get_contents`是否有所作为。 – Fanis 2011-01-28 22:57:15

回答

-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); 
} 
+0

这是不太可能的,但是如果curl没有安装,或者升级出现问题,就不必依靠卷曲。 – Aglystas 2011-01-28 22:26:10

+0

虽然我部分同意,但我会认为cURL是一个重要的延伸。否则,你将重新实现HTTP协议来解析结果。无论如何,我没有发现你的代码有任何特别的错误,所以它很难调试(这就是为什么我们首先使用这样的扩展;)) – 2011-01-28 22:36:02