我有这个包装器从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));
}
// 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 ('jd@automatem.co.nz', '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。如何引用readHeader()而不是将其放入全局函数空间。我试过了:
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'));
答案 0 :(得分:4)
看来这在
上工作正常但不是
两个版本的工作解决方法是将标题函数放在全局空间
中curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'readHeader');
答案 1 :(得分:4)
这应该有效:
curl_setopt($ch, CURLOPT_HEADERFUNCTION, array($this,'readHeader'));
答案 2 :(得分:0)
你得到像curl_init()没有定义的蚂蚁错误吗?
启用显示错误,看看是否可以收到此消息。
如果收到此消息,则说明CURL未正确安装的原因。
答案 3 :(得分:0)
无需污染全局名称空间:
curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'NZGBCComponentHelper::readHeader');