Integrando las API's de Twitter y Bit.ly (Obtener enlaces cortos) en un servidor dedicado no tuve mayor problema, pero, en ambientes compartidos, donde normalmente PHP corre en modo seguro (safe_mode = 'On') se genera una advertencia:
Cita: CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an open_basedir is set
Basandome en las funciones encontradas en:
http://www.edmondscommerce.co.uk/cur...-or-safe-mode/ hice lo siguiente para obtener las variables que ambas clases (Twitter y Bitly) requieren: $response, $headers, $errorNumber, $errorMessage.
Código PHP:
Ver originalfunction sm_curl($options){
// Hay que seguir redireccionamientos?
$follow = (isset($options[CURLOPT_FOLLOWLOCATION
])) ?
$options[CURLOPT_FOLLOWLOCATION
] : false;
// Instanciamos cURL
if(ini_get('open_basedir') != '' || ini_get('safe_mode' == 'On') && $follow) { // Aqui entramos solo si hay que seguir redireccionamientos y
// open_basedir o safe_mode estan activos
// Eliminamos la opcion CURL para seguir redireccionamientos
unset($options[CURLOPT_FOLLOWLOCATION
]);
// Establecemos las opciones
// Ejecutamos y seguimos redireccionamientos
$response = curl_redir_exec($go);
} else {
// Ejecutar
// Obtener errores
}
return $response;
}
// Seguir redireccionamientos con open_basedir o safe_mode = On
function curl_redir_exec($ch) {
static $curl_loops = 0;
static $curl_max_loops = 20;
if ($curl_loops++>= $curl_max_loops) {
$curl_loops = 0;
return array('response' => '', 'headers' => '', 'errorNumber' => '47', 'errorMessage' => 'Too many redirects'); }
$http_code = $headers['http_code'];
if ($http_code == 301 || $http_code == 302) {
preg_match('/Location:(.*?)\n/', $header, $matches); if (!$url) {
//couldn't process the url to redirect to
$curl_loops = 0;
return array('response' => '', 'headers' => '', 'errorNumber' => 3, 'errorMessage' => 'The URL was not properly formatted (redirect).'); }
if (!$url['scheme'])
$url['scheme'] = $last_url['scheme'];
if (!$url['host'])
$url['host'] = $last_url['host'];
if (!$url['path'])
$url['path'] = $last_url['path'];
$new_url = $url['scheme'] . '://' . $url['host'] . $url['path'] . ($url['query']?'?'.$url['query']:'');
return curl_redir_exec($ch);
} else {
$curl_loops=0;
'response' => $data,
'headers' => $headers,
);
}
}
$options es una matriz donde se incluyen todas las opciones cURL a ejecutar, por ejemplo, en la funcion
doCall() de la clase
Bitly es:
Código PHP:
Ver original// set options
$options[CURLOPT_URL] = $url;
$options[CURLOPT_PORT] = self::API_PORT;
$options[CURLOPT_USERAGENT] = $this->getUserAgent();
$options[CURLOPT_FOLLOWLOCATION] = true;
$options[CURLOPT_RETURNTRANSFER] = true;
$options[CURLOPT_TIMEOUT] = (int) $this->getTimeOut();
La ejecucion original es:
Código PHP:
Ver original// init
// set options
// execute
// fetch errors
// close
Y hay que reemplazarla por:
Tengo un archivo
common.php donde guardo las rutinas de uso mas frecuente o que son requeridas por dos o mas scripts en mis sitios, aqui coloque las funciones
sm_curl() y
curl_redir_exec().
Tanto para Twitter, como para Bit.ly, uso las clases creadas por
Tijs Verkoyen que pueden descargar en:
http://classes.verkoyen.eu/