本文介绍了curl_setopt($ ch,CURLOPT_HEADERFUNCTION,array(& $ this,'readHeader'))不工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有这个包装器从Joomla加载symfony项目
class NZGBCComponentHelper {
function requestAndFollow path =''){
$ c = 0; $ first = 1; $ httpcode = 0;
$ uri = JRequest :: getVar('uri');
while($ c< = 4&&($ first || $ httpcode == 302)){
$ first = 0;
$ finalSfUrl = NZGBCComponentHelper :: buildRequestUri($ uri,$ path);
$ ch = curl_init($ finalSfUrl);
if(JRequest :: getMethod()=='POST'&& $ httpcode!= 302){
curl_setopt($ ch,CURLOPT_POST,1);
$ postThrough = array_merge(JRequest :: get($ _ POST),array('_ csrf_token'=> $ _POST ['_ csrf_token'])));
curl_setopt($ ch,CURLOPT_POSTFIELDS,http_build_query($ postThrough));
}
//获取sf内容
curl_setopt($ ch,CURLOPT_REFERER,JURI :: getInstance() - > root
curl_setopt($ ch,CURLOPT_HEADERFUNCTION,'readHeader');
curl_setopt($ ch,CURLOPT_HEADER,1);
curl_setopt($ ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ ch,CURLOPT_COOKIE,'symfony ='。$ _ COOKIE ['symfony']);
$ return = curl_exec($ ch);
$ httpcode = curl_getinfo($ ch,CURLINFO_HTTP_CODE);
if(!$ return){
$ error = curl_error($ ch);
}
if($ this-> headers ['Set-Cookie']){
JResponse :: setHeader('Set-Cookie',$ mainframe-> sym_headers ['Set-Cookie']);
}
if($ httpcode> = 400){
$ return =有一个<! - $ finalSfUrl - >错误;
mail('[email protected]','symfony wrapper error',
$ finalSfUrl。\r\\\
。
$ httpcode。\r\\ \\ n。
$ return
);
} else if($ httpcode == 302){
$ query = parse_url(trim($ mainframe-> sym_headers ['Location']),PHP_URL_QUERY);
parse_str($ query);
parse_str($ uri);
if($ outside =='true'){
JApplication :: redirect(trim(urldecode($ uri)));
}
}
curl_close($ ch);
$ c ++;
}
return $ return;
}
}
if(!function_exists('readHeader')){
function readHeader($ ch,$ header){
$ mainframe =& JFactory :: getApplication();
if($ pos = strpos($ header,':')){
$ mainframe-> sym_headers [substr($ header,0,$ pos)] = substr ':'),1);
}
return strlen($ header);
}
}
requestAndFollow是静态调用的。如何引用readHeader()而不是将其放入全局函数空间。我试过:
curl_setopt($ ch,CURLOPT_HEADERFUNCTION,array(& $ this,'readHeader')); // didn我们希望这个工作 - 没有$这当静态调用
curl_setopt($ ch,CURLOPT_HEADERFUNCTION,array('NZGBCComponentHelper','readHeader'));
curl_setopt($ ch,CURLOPT_HEADERFUNCTION,array(self,'readHeader'));
解决方案
b
$ b
- libcurl 7.19.7,Ubuntu 10.10,PHP 5.3.2
但不在
- Debian Lenny上的libcurl 7.18.2,PHP 5.2.6
这两个版本的工作解决方法是将标题函数放在全局空间中
curl_setopt($ ch,CURLOPT_HEADERFUNCTION,'readHeader');
I have this wrapper to load a symfony project from within Joomla
class NZGBCComponentHelper {
function requestAndFollow($path = '') {
$c = 0;$first = 1;$httpcode = 0;
$uri = JRequest::getVar('uri');
while ($c <= 4 && ($first || $httpcode == 302)){
$first = 0;
$finalSfUrl = NZGBCComponentHelper::buildRequestUri($uri, $path);
$ch = curl_init($finalSfUrl);
if(JRequest::getMethod() == 'POST' && $httpcode != 302){
curl_setopt($ch, CURLOPT_POST, 1);
$postThrough = array_merge(JRequest::get($_POST),array('_csrf_token' => $_POST['_csrf_token']));
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postThrough));
}
// Get sf content
curl_setopt($ch, CURLOPT_REFERER, JURI::getInstance()->root().$path);
curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'readHeader');
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_COOKIE, 'symfony='.$_COOKIE['symfony']);
$return = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if (!$return){
$error = curl_error($ch);
}
if($this->headers['Set-Cookie']){
JResponse::setHeader('Set-Cookie', $mainframe->sym_headers['Set-Cookie']);
}
if ($httpcode >= 400){
$return = "There was an <!--$finalSfUrl--> error ";
mail ('[email protected]', 'symfony wrapper error',
$finalSfUrl."\r\n".
$httpcode."\r\n".
$return
);
}else if ($httpcode == 302){
$query = parse_url(trim($mainframe->sym_headers['Location']), PHP_URL_QUERY);
parse_str($query);
parse_str($uri);
if ($outside == 'true'){
JApplication::redirect(trim(urldecode($uri)));
}
}
curl_close($ch);
$c++;
}
return $return;
}
}
if (!function_exists('readHeader')){
function readHeader($ch, $header){
$mainframe =& JFactory::getApplication();
if($pos = strpos($header, ':')){
$mainframe->sym_headers[substr($header, 0, $pos)] = substr(strstr($header, ':'), 1);
}
return strlen($header);
}
}
requestAndFollow is statically called. How can I refer to readHeader() instead of putting it into the global function space. I tried:
curl_setopt($ch, CURLOPT_HEADERFUNCTION, array(&$this,'readHeader'));//didn't expect this to work - no $this when statically called
curl_setopt($ch, CURLOPT_HEADERFUNCTION, array('NZGBCComponentHelper','readHeader'));
curl_setopt($ch, CURLOPT_HEADERFUNCTION, array(self,'readHeader'));
解决方案
It appears this works fine on
- libcurl 7.19.7, Ubuntu 10.10, PHP 5.3.2
but not on
- libcurl 7.18.2 on Debian Lenny, PHP 5.2.6
A working workaround on both versions is to put the header function in the global space
curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'readHeader');
这篇关于curl_setopt($ ch,CURLOPT_HEADERFUNCTION,array(& $ this,'readHeader'))不工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!