2011-08-03 36 views
0

我想通过使用curl摆脱bseindia.com数据,但我只得到空数据..PHP的file_get_contents或卷曲不工作

这里是我的卷曲功能代码:

<?php 
    function load($url, $ispost=0, $data='', $header=array()){ 
     if($url=='' || ($ispost && $data=='')) return; 

     $host=parse_url($url, PHP_URL_HOST); 

     $header[]='User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:6.0) Gecko/20100101 Firefox/6.0'; 
     $header[]='Host: '.$host; 
     $header[]='Connection: keep-alive'; 
     $header[]='Referer: http://'.$host.'/'; 
     if($ispost) $header[]='Content-length: '.strlen($data); 

     $ch = curl_init("$url"); 
     if($ispost){ 
      curl_setopt($ch, CURLOPT_POST, 1); 
      curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 
     } 
     curl_setopt($ch, CURLOPT_HEADER, 0); 
     curl_setopt($ch, CURLOPT_VERBOSE, 0); 
     curl_setopt($ch, CURLOPT_FAILONERROR, 1); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
     curl_setopt($ch, CURLOPT_HTTPHEADER, $header); 

     $file = curl_exec($ch); 
     $header = curl_getinfo($ch); 
     curl_close($ch); 

     return array('http_code'=>$header['http_code'], 'output'=>$file); 
} 
    ?> 

和这里的我的电话:

<?php 
    $data = load('http://www.bseindia.com/', 0, ''); 
    if($data['http_code']!==200) exit(json_encode(array('err'=>true, 'msg'=>'Unable to get! Error='.$data['http_code']))); 
    exit(json_encode(array('err'=>false, 'msg'=>json_decode($data['output'])))); 
?> 

,但我在JSON输出是:

{"err":false,"msg":null} 

但如果我改变

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0); 

然后我正在直接印刷,但不被存储在变量输出,为什么?

所以,我的问题是如何获取数据,而无需使用:

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0); 

???

+0

是否有可能与您关闭标题('CURLOPT_HEADER,0'),但仍然要求它们('curl_getinfo')有关? – OverZealous

+0

@OverZealous:但它的工作其他网站,如:google.com ... –

+0

似乎'json_decode($ data ['output'])'返回NULL。该网站是否返回有效的* JSON数据? –

回答

0

我记得我得到相同的结果,其输出结果和我解决它让输出缓冲:

ob_start(); 
// do the functions 
$result = ob_get_contents(); 
ob_end_clean(); 

好运

编辑:

function getUrl($url, $params) 
    { 
     ob_start(); 
     $ch = curl_init($url); 
     curl_setopt($ch, CURLOPT_POST, 1); 
     curl_setopt($ch, CURLOPT_POSTFIELDS, $params); 
     curl_exec($ch); 
     curl_close($ch); 
     $output = ob_get_contents(); 
     ob_end_clean(); 
     return $output; 
    } 

例如我使用此功能做一个事后动作

+0

无法正常工作...您可以使用您的黑客更新我的加载函数并将其发布在此? ? –

+0

如果你打算使用输出缓冲来实现,使用'$ result = ob_get_clean()'而不是像这样嵌套输出缓冲区。 – adlawson

+0

看我的版;) – ZiTAL

0
if($data['http_code']!==200) 
    exit(json_encode(array('err'=>true, 'msg'=>'Unable to get! Error='.$data['http_code']))); 
exit(json_encode(array('err'=>false, 'msg'=>json_encode(utf8_encode($data['output']))))); 
+0

你需要用utf8_encode解析为utf8的结果; curl;) – ZiTAL