2012-06-22 16 views
5

Estoy tratando de registrar la información de un golpe de cURL en un archivo de registro, pero no puedo hacerlo, Ejecuto Windows con Wamp y he dado control total a todos los usuarios de la máquina y el archivo de registro y php que invoca a cURL están en el mismo directorio para esta prueba. He utilizado el código de abajo:no se puede escribir en el archivo con PHP CURRICULUM con curlopt_stderr y curlopt_file

$session = curl_init(); 
$logfh = fopen("my_log.log", 'a+'); 
if ($logfh) { 
    print "Opened the log file without errors"; 
} 
curl_setopt($session, CURLOPT_HEADER, false); 
curl_setopt($session, CURLOPT_RETURNTRANSFER, true); 
// Optional settings for debugging 
curl_setopt($session, CURLOPT_VERBOSE, true); 
curl_setopt($session, CURLOPT_FILE, $logfh); // logs curl messages 
// curl_setopt($session, CURLOPT_STDERR, $logfh); // logs curl messages 
curl_exec($session); 
curl_close($session); 

El archivo de registro se abre sin errores y mi curvatura devuelve éxito, pero nada se registra en el file.I've utiliza CURLOPT_FILE y CURLOPT_STDERR alternativamente, pero tampoco ayuda la causa y no está seguro si tengo algo mal aquí. Cualquier sugerencia sobre la depuración esto sería apreciada.

+1

No veo su llamada a ['curl_exec()'] (http://www.php.net/manual/en/function.curl-exec.php). ¿Algo falta en tu ejemplo? – Lee

+0

se olvidó de '$ session = curl_init();' – HamZa

+0

@Lee consideró que eran obvias porque especifiqué que curl devolvió el éxito (200) pero editó la pregunta – optimusprime619

Respuesta

5

Nota: Si la URL que está tratando de curl redirige a otra URL, la salida de la escritura a un archivo fallará.

Por favor asegúrese de agregar la siguiente línea también-

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); 

También como una nota al margen, asegúrese de cerrar el archivo con fclose() para asegurarse de que el archivo se haya completado.

+0

gracias por la respuesta, he establecido 'CURLOPT_FOLLOWLOCATION' y' CURLOPT_MAXREDIRS', sin embargo no he hecho 'fclose()' ... lo intentaré – optimusprime619

+0

¡funcionó! muchas gracias .. – optimusprime619

4

Si ha añadido fclose(), e hizo las diversas "pequeñas correcciones" que se enumeran en los comentarios anteriores, pero sigue sin funcionar ... entonces sospecho que estás viendo opciones en conflicto:

  • CURLOPT_RETURNTRANSFER le dice a curl que devuelva la respuesta como el valor de retorno de la llamada curl_exec().

  • CURLOPT_FILE y CURLOPT_STDERR indica a curl que escriba la respuesta (o salida de error) en un manejador de archivo especificado.

Parece que estos pueden ser mutuamente excluyentes. Yo sugeriría que utilice uno o el otro, pero no ambos:

De cualquier uso CURLOPT_RETURNTRANSFER, así:

$session = curl_init(); 
$logfh = fopen("my_log.log", 'a+'); 
if ($logfh !== false) { 
    print "Opened the log file without errors"; 
} 
curl_setopt($session, CURLOPT_HEADER, false); 
curl_setopt($session, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($session, CURLOPT_VERBOSE, true); 
$result = curl_exec($session); 
curl_close($session); 
fwrite($logfh, $result); 
fclose($logfh); 

o uso CURLOPT_FILE, así:

$session = curl_init(); 
$logfh = fopen("my_log.log", 'a+'); 
if ($logfh !== false) { 
    print "Opened the log file without errors"; 
} 
curl_setopt($session, CURLOPT_HEADER, false); 
curl_setopt($session, CURLOPT_FILE, $logfh); 
curl_setopt($session, CURLOPT_VERBOSE, true); 
curl_exec($session); 
curl_close($session); 
fclose($logfh); 
+1

Muchas gracias, fue el 'fclose()' :) – optimusprime619

0

Hay también podría ser un problema al usar CURLINFO_HEADER_OUT = true. Creo que hay algo en CURLINFO_VERBOSE que utiliza esta opción y solo suprimimos la información VERBOSE ...

curl_setopt($ch, CURLINFO_HEADER_OUT, false); 
curl_setopt($ch, CURLOPT_VERBOSE, true); 
curl_setopt($ch, CURLOPT_STDERR, fopen('log.log', 'a+')); 

Solo por mencionar, puede utilizar:

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_VERBOSE, true); 
curl_setopt($ch, CURLOPT_STDERR, fopen('log.log', 'a+')); 

Si desea registrar la salida en un archivo y todavía podrá devolver curl_exec.

Cuestiones relacionadas