Seems like some options not mentioned on this page, but listed on http://curl.haxx.se/libcurl/c/curl_easy_setopt.html is actually supported.
I was happy to see that I could actually use CURLOPT_FTP_CREATE_MISSING_DIRS even from PHP.
curl_setopt
(PHP 4 >= 4.0.2, PHP 5)
curl_setopt — Asigna un valor a una opción de una sesión CURL
Descripción
La función curl_setopt() asigna valores para opciones de una sesión CURL identificada por el parámetro ch . El parámetro option especifica la opción a la que se desea asignar el valor indicado en el parámetro value .
value debe ser una variable de tipo bool para los siguientes valores del parámetro option :
| Opción | Valor de value | Notas |
|---|---|---|
| CURLOPT_AUTOREFERER | TRUE para establecer de forma automática el campo Referer: en las peticiones que siguen las redirecciones de tipo Location:. | Available since PHP 5.1.0. |
| CURLOPT_BINARYTRANSFER | TRUE para devolver la salida completa cuando se usa CURLOPT_RETURNTRANSFER. | |
| CURLOPT_COOKIESESSION | TRUE para marcar esta cookie como una nueva cookie de sesión. Obliga a libcurl a ignorar todas las cookies que va a cargar y que son cookies de sesión de una sesión anterior. Por defecto, libcurl guarda y carga todas las cookies, independientemente de si son de sisió o no. Las cookies de sesión son las cookies que no tienen establecida una fecha de expiración y que se supone que solamente deben aplicarse y existir en esta sesión. | Disponible desde PHP 5.1.0. |
| CURLOPT_CRLF | TRUE para convertir los caracteres de nueva línea de Unix a caracteres de nueva línea de tipo CRLF en las transferencias. | |
| CURLOPT_DNS_USE_GLOBAL_CACHE | TRUE para utilizar una cache de DNS global. Esta opción no es compatible con entornos multi-hilo y por defecto está activada. | |
| CURLOPT_FAILONERROR | TRUE para que la ejecución de la función falle de forma "silenciosa" si el código HTTP devuelto es mayor que 300. El comportamiento por defecto es devolver la página normalmente, ignorando el código. | |
| CURLOPT_FILETIME | TRUE para intentar obtener la fecha remota de modificación del documento. Se puede obtener el valor empleando la opción CURLINFO_FILETIME con la función curl_getinfo(). | |
| CURLOPT_FOLLOWLOCATION | TRUE para seguir las cabeceras "Location: " que puede enviar el servidor junto con el resto de las cabeceras HTTP (se debe tener en cuenta que el comportamiento es recursivo, por lo que PHP seguirá tantos encabezados "Location: " como se envien, a no ser que se establezca la opción CURLOPT_MAXREDIRS). | |
| CURLOPT_FORBID_REUSE | TRUE para forzar que la conexión se cierre de forma explícita cuando la transmisión ha finalizado y por tanto que no se reserve para su posterior reutilización. | |
| CURLOPT_FRESH_CONNECT | TRUE para forzar el uso de una conexión nueva en vez de reutilizar una conexión cacheada. | |
| CURLOPT_FTP_USE_EPRT | TRUE para emplear EPRT (y LPRT) cuando se están realizado descargas de tipo FTP. Se puede indicar FALSE para deshabilitar EPRT y LPRT y utilizar solamente PORT. | Se incluyó en la versión de PHP 5.0.0. |
| CURLOPT_FTP_USE_EPSV | TRUE para intentar en primer lugar un comando de tipo EPSV en las transferencias FTP y en segundo lugar un comando de tipo PASV. Se puede indicar FALSE para deshabilitar EPSV. | |
| CURLOPT_FTPAPPEND | TRUE para escribir a partir del final del archivo remoto en vez de sobreescribirlo. | |
| CURLOPT_FTPASCII | Se trata de un alias de la opción CURLOPT_TRANSFERTEXT, que se recomienda utilizar en vez de esta opción. | |
| CURLOPT_FTPLISTONLY | TRUE para obtener el listado de los elementos de un directorio de FTP. | |
| CURLOPT_HEADER | TRUE para que el encabezado se incluya en la salida. | |
| CURLOPT_HTTPGET | TRUE para volver a establecer el método HTTP al tipo GET. El método por defecto es GET, así que solamente es necesaria esta opción si el método ha sido modificado. | |
| CURLOPT_HTTPPROXYTUNNEL | TRUE para encaminar la transferencia a través de un tunel establecido con el servidor proxy HTTP indicado. | |
| CURLOPT_MUTE | TRUE para que las funciones CURL se comporten de forma completamente "silenciosa". | |
| CURLOPT_NETRC | TRUE para obtener el nombre de usuario y la contraseña necesarios para acceder a un sitio remoto a partir del archivo ~/.netrc. | |
| CURLOPT_NOBODY | TRUE para no incluir en la salida el contenido del body. | |
| CURLOPT_NOPROGRESS |
TRUE para deshabilitar el medidor del progreso de las transferencias de tipo CURL.
|
|
| CURLOPT_NOSIGNAL | TRUE para que ninguna de las señales generadas por las funciones CURL se notifiquen la proceso de PHP. En entornos de ejecución de SAPIs multi-hilo está activado por defecto, de forma que las opciones de timeout puedan utilizarse. | Se incluyó en la versión de CURL 7.10 y de PHP 5.0.0. |
| CURLOPT_POST | TRUE para ejecutar una petición de tipo HTTP POST. El método empleado por el POST es el de application/x-www-form-urlencoded, que es el habitualmente empleado por los formularios HTML. | |
| CURLOPT_PUT | TRUE para ejecutar el método HTTP PUT sobre un archivo. El archivo debe indicarse mediante las opciones CURLOPT_INFILE y CURLOPT_INFILESIZE. | |
| CURLOPT_RETURNTRANSFER | TRUE para devolver el resultado como una cadena de texto que contiene el valor devuelto por la función curl_exec(), en vez de mostrar la salida directamente en la ventana del navegador. | |
| CURLOPT_SSL_VERIFYPEER | FALSE para evitar que CURL verifique el certificado del otro extremo. Se pueden especificar otros certificados para verificar mediante la opción CURLOPT_CAINFO y también se puede especificar un directorio de certificados mediante la opción CURLOPT_CAPATH. La opción CURLOPT_SSL_VERIFYHOST se debe establecer a TRUE o FALSE si la opción CURLOPT_SSL_VERIFYPEER está deshabilitada (su valor por defecto es 2). | TRUE por defecto en la versión CURL 7.10. Conjunto instalado por defecto con la versión CURL 7.10. |
| CURLOPT_TRANSFERTEXT | TRUE para emplear el modo de transmisión ASCII en las transferencias de FTP. Para LDAP, obtiene los datos en formato de texto plano en vez de en formato HTML. En los sistemas Windows, no establece la salida STDOUT a modo binario. | |
| CURLOPT_UNRESTRICTED_AUTH | TRUE para enviar el nombre de usuario y la contraseña cuando se siguen las cabeceras de tipo "Location: " (al activar la opción CURLOPT_FOLLOWLOCATION). El nombre de usuario y contraseña se envín aun cambiando el nombre del host en las redirecciones. | Se incluyó en la version de PHP 5.0.0. |
| CURLOPT_UPLOAD | TRUE para preparar una subida. | |
| CURLOPT_VERBOSE | TRUE para obtener la información completa sobre la salida. La salida se escribe en STDERR o en el fichero especificado mediante la opción CURLOPT_STDERR. |
El parámetro value debe ser un entero para los siguientes valores del parámetro option :
| Opción | Valor de value | Notas |
|---|---|---|
| CURLOPT_BUFFERSIZE | El tamaño del buffer que se va a utilizar en cada operación de lectura. No se garantiza que la petición consiga llenar el buffer. | Se incluyó en la versión de CURL 7.10 y de PHP 5.0.0. |
| CURLOPT_CLOSEPOLICY | Puede ser o CURLCLOSEPOLICY_LEAST_RECENTLY_USED o CURLCLOSEPOLICY_OLDEST . Existen otros tres valores para CURLCLOSEPOLICY_, pero CURL no los soporta todaví. | |
| CURLOPT_CONNECTTIMEOUT | El número de segundos que se pueden esperar como máximo intentando establecer la conexión. Si se le da un valor de 0 (cero), se espera indefinidamente. | |
| CURLOPT_DNS_CACHE_TIMEOUT | El número de segundos que se mantienen las entradas de DNS en memoria. Por defecto toma un valor de 120 segundos (2 minutos). | |
| CURLOPT_FTPSSLAUTH | El método de autenticación de FTP (si se utiliza autenticación): CURLFTPAUTH_SSL (intentar primero SSL), CURLFTPAUTH_TLS (intentar primero TLS) o CURLFTPAUTH_DEFAULT (dejar que CURL decida el método). | Se incluyó en la versión de CURL 7.12.2 y de PHP 5.1.0. |
| CURLOPT_HTTP_VERSION | CURL_HTTP_VERSION_NONE (por defecto se deja a CURL que decida que versión usar), CURL_HTTP_VERSION_1_0 (fuerza a usar HTTP/1.0), o CURL_HTTP_VERSION_1_1 (fuerza a usar HTTP/1.1). | |
| CURLOPT_HTTPAUTH |
El método de autenticación HTTP a utilizar. Las opciones son: CURLAUTH_BASIC , CURLAUTH_DIGEST , CURLAUTH_GSSNEGOTIATE , CURLAUTH_NTLM , CURLAUTH_ANY y CURLAUTH_ANYSAFE . Se puede utilizar el operador bitwise | (conocido como "or") para combinar más de un método. Si se utiliza una combinación de métodos, CURL sondea al servidor para comprobar qué métodos soporta y así elegir el mejor de los soportados. CURLAUTH_ANY es un alias de CURLAUTH_BASIC | CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM. CURLAUTH_ANYSAFE es un alias de CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM. |
Se incluyó en la versión de PHP 5.0.0. |
| CURLOPT_INFILESIZE | El tamaño esperado en bytes del archivo empleado en una operación de subida de un archivo a un sitio remoto. | |
| CURLOPT_LOW_SPEED_LIMIT | La velocidad de transmisión, en bytes por segundo, que la transferencia debe obtener de manera continua durante CURLOPT_LOW_SPEED_TIME segundos para que PHP considere la transferencia demasiado lenta y la aborte. | |
| CURLOPT_LOW_SPEED_TIME | El número de segundos que la transferencia debe obtener de manera continua una velocidad de transferencia inferior a CURLOPT_LOW_SPEED_LIMIT bytes por segundo para que PHP considere la transferencia demasiado lenta y la aborte. | |
| CURLOPT_MAXCONNECTS | El número máximo de conexiones persistentes permitidas. Cuando se alcanza el límite establecido, se utiliza la opción CURLOPT_CLOSEPOLICY para determinar que conexión se cierra. | |
| CURLOPT_MAXREDIRS | El número máximo de redirecciones HTTP que se siguen. Se utiliza junto con la opción CURLOPT_FOLLOWLOCATION. | |
| CURLOPT_PORT | Un número de puerto alternativo para realizar la conexión. | |
| CURLOPT_PROXYAUTH | Los métodos de autenticación HTTP empleados para una conexión proxy. Se emplean las mismas máscaras de bits que las descritas para la opción CURLOPT_HTTPAUTH. Para la autenticación proxy, solo se permiten los valores CURLAUTH_BASIC y CURLAUTH_NTLM . | Se incluyó en la versión de CURL 7.10.7 y de PHP 5.1.0. |
| CURLOPT_PROXYPORT | El número de puerto que se utiliza en las conexiones proxy. Este número se puede establecer también mediante la opción CURLOPT_PROXY. | Se incluyó en la versión de PHP 5.0.0. |
| CURLOPT_PROXYTYPE | Puede tomar el valor CURLPROXY_HTTP (valor por defecto) o CURLPROXY_SOCKS5 . | Se incluyó en la versión de CURL 7.10 y de PHP 5.0.0. |
| CURLOPT_RESUME_FROM | La posición en bytes desde la que se reanuda la transferencia. | |
| CURLOPT_SSL_VERIFYHOST | 1 para comprobar la existencia de un nombre común en el certificado SSL del otro extremo. 2 para comprobar la existencia de un nombre común y además comprobar si coincide el nombre del host proporcionado. | |
| CURLOPT_SSLVERSION | La versión de SSL a utilizar (puede ser 2 o 3). Por defecto PHP trata de determinarlo por si mismo, aunque en algunos casos puede ser necesario indicarlo manualmente. | |
| CURLOPT_TIMECONDITION | Manera en la que se trata la opción CURLOPT_TIMEVALUE. Si se indica el valor CURL_TIMECOND_IFMODSINCE , se devuelve la página solamente si ha sido modificada desde la fecha indicada en la opción CURLOPT_TIMEVALUE. Si no ha sido modificada, se devuelve una cabecera de tipo "304 Not Modified" si la opción CURLOPT_HEADER es TRUE. Si se indica el valor CURL_TIMECOND_ISUNMODSINCE el efecto conseguido es el contrario. El valor por defecto es CURL_TIMECOND_IFMODSINCE . | Se incluyó en la versión de PHP 5.1.0. |
| CURLOPT_TIMEOUT | El número máximo de segundos que CURL espera a que se ejecuten las funciones. | |
| CURLOPT_TIMEVALUE | La fecha en número de segundos transcurridos desde el 1 de Enero de 1970. La fecha se utiliza con la opción CURLOPT_TIMECONDITION. Por defecto, se utiliza el parámetro CURL_TIMECOND_IFMODSINCE . |
value debe ser una cadena de texto para los siguientes valores del parámetro option :
| Opción | Valor de value | Notas |
|---|---|---|
| CURLOPT_CAINFO | El nombre del archivo que contiene uno o más certificados utilizados para la verificación con el otro extremo. Solamente es útil cuando se utiliza conjuntamente con la opción CURLOPT_SSL_VERIFYPEER. | |
| CURLOPT_CAPATH | El directorio que contiene los certificados de las CA. Se utiliza junto con la opción CURLOPT_SSL_VERIFYPEER. | |
| CURLOPT_COOKIE | El contenido de la cabecera "Set-Cookie: " que se utiliza en la petición HTTP. | |
| CURLOPT_COOKIEFILE | El nombre del archivo que contiene los datos de las cookies. El archivo puede tener el formato definido por Netscape o el formato de cabeceras HTTP volcadas directamente a un archivo en texto plano. | |
| CURLOPT_COOKIEJAR | El nombre del archivo en el que se guardan todas las cookies internas cuando se cierra la conexión. | |
| CURLOPT_CUSTOMREQUEST |
Un método personalizado a utilizar en lugar de
"GET" o "HEAD" cuando se
hace una petición HTTP. Se utiliza cuando se quieren realizar peticiones
HTTP no habituales como por ejemplo "DELETE".
Los valores válidos son del tipo "GET",
"POST", "CONNECT" y similares;
esto es, no se debe introducir un valor complejo como por ejemplo
"GET /index.html HTTP/1.0\r\n\r\n".
|
|
| CURLOPT_EGBSOCKET | Es como CURLOPT_RANDOM_FILE, salvo que se indica un socket al demonio generador de entropía. | |
| CURLOPT_ENCODING | Los contenidos de la cabecera "Accept-Encoding: ". De esta forma, se permite la decodificación de la respuesta. Los valores permitidos son los de "identity", "deflate" y "gzip". Si se indica una cadena vací (""), se envía una cabecera que incluye todos los tipos de codificación. | Se incluyó en la versión de PHP 5.0.0. |
| CURLOPT_FTPPORT | El valor que se utiliza para obtener la dirección IP que se emplea en la instrucción "POST" de FTP. La instrucción "POST" indica al servidor remoto que se conecte a la dirección IP especificada. La cadena puede ser una dirección IP, el nombre de un host, el nombre de un interfaz de red (en entornos Unix) o el valor '-' para utilizar la dirección IP por defecto del sistema. | |
| CURLOPT_INTERFACE | El nombre del interfaz de red de salida a utilizar. Se puede indicar como nombre de interfaz, dirección IP o nombre de host. | |
| CURLOPT_KRB4LEVEL | El nivel de seguridad de KRB4 (Kerberos 4). Se permite cualquiera de los siguientes valores (ordenados de menos a m´s fuerte): "clear", "safe", "confidential", "private".. Si la cadena proporcionada no contiene ninguno de esos valores, se utiliza el valor "private". Si se proporciona un valor de NULL, se deshabilita la seguridad KRB4. Actualmente, este tipo de seguridad solamente funciona en las transferencias FTP. | |
| CURLOPT_POSTFIELDS | Los datos a enviar en una operación de tipo HTTP "POST". | |
| CURLOPT_PROXY | El proxy HTTP a través del que se encaminan las peticiones. | |
| CURLOPT_PROXYUSERPWD | El nombre de usuario y contraseña (indicados con el formato "[username]:[password]") que se van a utilizar para realizar la conexión con el proxy. | |
| CURLOPT_RANDOM_FILE | El nombre del archivo que se va a emplear para alimentar el generador de números aleatorios empleado por SSL. | |
| CURLOPT_RANGE | Rango de datos que se quieren obtener indicados de la forma "X-Y", donde X o Y son opcionales. Las transferencias HTTP soportan varios rangos diferentes simultaneos separados por comas, de la forma "X-Y,N-M". | |
| CURLOPT_REFERER | El contenido de la cabecera "Referer: " empleada en la petición HTTP. | |
| CURLOPT_SSL_CIPHER_LIST | La lista de algoritmos de tipo cipher a emplear por SSL. Los siguientes valores son válidos: RC4-SHA y TLSv1. | |
| CURLOPT_SSLCERT | El nombre del archivo que contiene el certificado almacenado en formato PEM. | |
| CURLOPT_SSLCERTPASSWD | La contraseña necesaria para utilizar el certificado CURLOPT_SSLCERT. | |
| CURLOPT_SSLCERTTYPE | El formato del certificado. Los formatos soportados son "PEM" (valor por defecto), "DER" y "ENG". | se incluyó en la versión de CURL 7.9.3 y de PHP 5.0.0. |
| CURLOPT_SSLENGINE | El identificador del generador criptográfico de la clave privada de SSL especificada en la opción CURLOPT_SSLKEY. | |
| CURLOPT_SSLENGINE_DEFAULT | El identificador del generador criptográfico empleado en las operaciones criptográficas simétricas. | |
| CURLOPT_SSLKEY | El nombre del archivo que contiene la clave privada de SSL. | |
| CURLOPT_SSLKEYPASSWD |
La contraseña secreta necesaria para utilizar la clave privada de SSL
especificada en la opció CURLOPT_SSLKEY.
|
|
| CURLOPT_SSLKEYTYPE | El tipo de clave privada de SSL especificada en CURLOPT_SSLKEY. Los valores permitidos son "PEM" (valor por defecto), "DER" y "ENG". | |
| CURLOPT_URL | La URL que se quiere obtener. También se puede establecer su valor al inicializar una sesión con la función curl_init(). | |
| CURLOPT_USERAGENT | El contenido de la cabecera "User-Agent: " enviada en las peticiones HTTP. | |
| CURLOPT_USERPWD | El nombre de usuario y contraseña (con el formato "[username]:[password]") que se va a utilizar para realizar la conexión. |
value debería ser una variable de tipo array para los siguientes valores del parámetro option :
| Opción | Valor de value | Notas |
|---|---|---|
| CURLOPT_HTTP200ALIASES | Array de respuestas HTTP de tipo 200 que se tratarán como respuestas válidas y no errores. | Se incluyó en la versió de CURL 7.10.3 y de PHP 5.0.0. |
| CURLOPT_HTTPHEADER | Array de valores de cabeceras HTTP que se van a enviar. | |
| CURLOPT_POSTQUOTE | Array de comandos FTP que se van a ejecutar en el servidor remoto después de que se haya ejecutado la petición FTP. | |
| CURLOPT_QUOTE | Array de comandos FTP que se van a ejecutar en el servidor remoto antes de que se haya ejecutado la petición FTP. |
value debe ser un recurso de tipo stream (obtenido por ejemplo mediante la función fopen()) para los siguientes valores del parámetro option :
| Opción | Valor de value | Notas |
|---|---|---|
| CURLOPT_FILE | Archivo al que se van a volcar los datos de la transferencia. Por defecto es STDOUT (por tanto, generalmente la ventana del navegador). | |
| CURLOPT_INFILE | Archivo del que la transferencia debe obtener los datos para las peticiones de tipo subida. | |
| CURLOPT_STDERR | Recurso alternativo para escribir los errores producidos en lugar de STDERR. | |
| CURLOPT_WRITEHEADER | Archivo en el que se escribe la parte de las cabeceras de la transferencia. |
value debe ser una cadena de texto con el nombre válido de una función de tipo callback para los siguientes valores del parámetro option :
| Opción | Valor de value | Notas |
|---|---|---|
| CURLOPT_HEADERFUNCTION | Nombre de la función de callback que requiere de 2 argumentos. El primero es el recurso CURL y el segundo es una cadena que contiene los datos de la cabecera que se deben escribir. Si se utiliza esta función de callback, el programador tiene la responsabilidad de escribir los datos de la cabecera. La función devuelve el número de bytes escritos. | |
| CURLOPT_PASSWDFUNCTION | Nombre de la función de callback que requiere de 3 argumentos. El primero es el recurso CURL, el segundo es una cadena de texto que solicita que se introduzca una contraseña y el tercero es la longitud máxima de la contraseña. La función devuelve una cadena de texto que contiene la contraseña. | |
| CURLOPT_READFUNCTION | Nombre de la función de callback que requiere de 2 argumentos. El primero es el recurso CURL y el segundo es una cadena con los datos a leer. Si se utiliza esta función, el programador tiene la responsabilidad de leer los datos. La función devuelve el número de bytes leidos y devuelve 0 (cero) si se llega al final del archivo (EOF). | |
| CURLOPT_WRITEFUNCTION | Nombre de la función de callback que requiere de 2 argumentos. El primero es el recurso CURL y el segundo es una cadena de texto con los datos a escribir. Si se utiliza esta función, el programador tiene la responsabilidad de escribir los datos. La función debe devolver el número exacto de bytes que se han escrito o se producirá un error. |
Example #1 Inicializar una nueva sesión CURL y obtener una página web
<?php
// Se crea un manejador CURL
$ch = curl_init();
// Se establece la URL y algunas opciones
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch, CURLOPT_HEADER, false);
// Se obtiene la URL indicada
curl_exec($ch);
// Se cierra el recurso CURL y se liberan los recursos del sistema
curl_close($ch);
?>
curl_setopt
03-Jul-2009 11:12
02-Jul-2009 04:14
As of php 5.3 CURLOPT_PROGRESSFUNCTION its supported here's how:
<?php
function callback($download_size, $downloaded, $upload_size, $uploaded)
{
// do your progress stuff here
}
$ch = curl_init('http://www.example.com');
// This is required to curl give us some progress
// if this is not set to false the progress function never
// gets called
curl_setopt($ch, CURLOPT_NOPROGRESS, false);
// Set up the callback
curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, 'callback');
// Big buffer less progress info/callbacks
// Small buffer more progress info/callbacks
curl_setopt($ch, CURLOPT_BUFFERSIZE, 128);
$data = curl_exec($ch);
?>
Hope this help.
14-Jun-2009 11:56
I noticed that if you want to get current cookie file after curl_exec() - you need to close current curl handle (like it said in manual), but if you want cookies to be dumped to file after any curl_exec (without curl_close) you can:
<?php
#call it normally
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_COOKIEFILE, "cookiefile");
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookiefile");
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/');
$result1 = curl_exec($ch);
#and then make a temp copy
$ch_temp=curl_copy_handle(ch);
curl_close($ch);
$ch=$ch_temp;
?>
Only this way, if you close $ch_temp - cookies wont be dumped.
04-Jun-2009 10:06
if you need to send a SOAP string that is the CURL you must use :
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, XML_POST_URL);
curl_setopt ($ch, CURLOPT_HTTPHEADER, array('SOAPAction: ""'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_POSTFIELDS, XML_PAYLOAD);
curl_setopt($ch, CURLOPT_HEADER, 0);
$output = curl_exec($ch);
?>
Note : Having based my snipet on Chemo demonstration (oscommerce user know who he is), XML_POST_URL and XML_PAYLOAD where defined as constant with define().
The point is : at the opposite of .xml , SOAP must send the header 'SOAPAction: ""' that can be a valid URI, an empty string (that is here) or nothing ('SOAPAction: '). The later case baing not accepted by all server, the second one indicating the target is the URI used to post the SOAP.
http://www.w3.org/TR/2000/NOTE-SOAP-20000508/#_Toc478383528
19-May-2009 10:11
Example how to connect to FTPES (FTP explicit SSL). This script will connect to any FTPES server and out put the list of directories.
<?php
$username = 'username';
$password = 'password';
$url = 'url';
$ftp_server = "ftp://" . $username . ":" . $password . "@" . $url;
echo "Starting CURL.\n";
$ch = curl_init();
echo "Set CURL URL.\n";
//curl FTP
curl_setopt($ch, CURLOPT_URL, $ftp_server);
//For Debugging
//curl_setopt($ch, CURLOPT_VERBOSE, TRUE);
//SSL Settings
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_FTP_SSL, CURLFTPSSL_TRY);
//List FTP files and directories
curl_setopt($ch, CURLOPT_FTPLISTONLY, TRUE);
//Output to curl_exec
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
echo "Executing CURL.\n";
$output = curl_exec($ch);
curl_close($ch);
echo "Closing CURL.\n";
echo $output . "\n";
$files = explode("\n", $output);
print_r($files);
?>
22-Mar-2009 11:28
When passing CURLOPT_POSTFIELDS a url-encoded string in order to use Content-Type: application/x-www-form-urlencoded, you can pass a string directly:
<?php
curl_setopt(CURLOPT_POSTFIELDS, 'field1=value&field2=value2');
?>
rather than passing the string in an array, as in fred at themancan dot com's example.
02-Feb-2009 02:36
if unserialize() returns FALSE on a serialized PHP object due to an extraneous string (e.g. "1") appended at the end of the object, you need to set the ff cURL option:
<?php
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
?>
28-Jan-2009 02:49
To send a post as a different content-type (ie.. application/json or text/xml) add this setopt call
<?php
curl_setopt($ch, CURLOPT_HTTPHEADERS,array('Content-Type: application/json'));
?>
[EDIT BY danbrown AT php DOT net: Contains a typofix by 'KdoubleU' on 3-FEB-09.]
01-Dec-2008 07:28
Note that CURLOPT_RETURNTRANSFER when used with CURLOPT_WRITEFUNCTION has effectively three settings: default, true, and false.
default - callbacks will be called as expected.
true - content will be returned but callback function will not be called.
false - content will be output and callback function will not be called.
Note that CURLOPT_HEADERFUNCTION callbacks are always called.
19-Nov-2008 09:31
Passing in PHP's $_SESSION into your cURL call:
<?php
session_start();
$strCookie = 'PHPSESSID=' . $_COOKIE['PHPSESSID'] . '; path=/';
session_write_close();
$curl_handle = curl_init('enter_external_url_here');
curl_setopt( $curl_handle, CURLOPT_COOKIE, $strCookie );
curl_exec($curl_handle);
curl_close($curl_handle);
?>
This worked great for me. I was calling pages from the same server and needed to keep the $_SESSION variables. This passes them over. If you want to test, just print_r($_SESSION);
Enjoy!
10-Oct-2008 09:20
This may not be a surprise for many, but I know I bled my eyes out trying to implement this in php. And when I knew it was this simple, I really felt extremely stupid. So I put this just so google will save somebody some time in the future.
PHP NTLM AUTH
Make sure you have the 'curl' extension loaded
now just do...
<?php
curl_setopt($ch,CURLAUTH_NTLM);
curl_setopt($ch,CURLOPT_USERPWD,"$username:$password");
?>
and just continue to use curl in the ordinary fashion.
26-Sep-2008 07:37
To fetch (or submit data to) multiple pages during one session,use this:
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_COOKIESESSION, TRUE);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_COOKIEFILE, "cookiefile");
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookiefile");
curl_setopt($ch, CURLOPT_COOKIE, session_name() . '=' . session_id());
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_URL, 'http://example.com/page1.php');
$result1 = curl_exec($ch);
curl_setopt($ch, CURLOPT_URL, 'http://example.com/page2.php');
$result2 = curl_exec($ch);
curl_close($ch);
?>
16-Sep-2008 08:34
Some of you may noticed that curl is not transferring cookies between sequent calls to a host. This is because you must activate curl`s "cookie parser". That is achieved using an external file like this:
<?php
curl_setopt(CURLOPT_FILE, '/tmp/cookies_file');
?>
If you don`t need to read any cookies but you still want the "cookie parser" use the same code but with dummy file with no data like '/dev/null', that way curl is storing cookies internaly per curl_handle:
<?php
curl_setopt(CURLOPT_FILE, '/dev/null');
?>
[EDIT BY danbrown AT php DOT net: In a note dated 26-SEP-08, (adamplumb AT gmail DOT com) offered the following addendum:
[It] should really be CURLOPT_COOKIEFILE. I was bitten by this issue myself with code that previously worked for logging into a website and posting a form. However, at some point the code just stopped working, and I eventually found that I needed to set this option to /dev/null for it to work.
]
23-Aug-2008 12:14
If you set CURLOPT_RESUME_FROM to resume the file, and then reuse the same Curl handle to download another file, you must reset the resume status by calling curl_setopt( $ch, CURLOPT_RESUME_FROM, 0 ). It will not reset, and will apply to all subsequent transfers even if the URL is the same.
12-Aug-2008 05:12
Just a small detail I too easily overlooked.
<?php
/* If you set: */
curl_setopt ($ch, CURLOPT_POST, 1);
/* then you must have the data: */
curl_setopt ($ch, CURLOPT_POSTFIELDS, $PostData);
?>
I found with only the CURLOPT_POST set (from copy, paste editing of course) cookies were not getting sent with CURLOPT_COOKIE. Just something subtle to watch out for.
05-Aug-2008 11:28
To find what encoding a given HTTP POST request uses is easy -- passing an array to CURLOPT_POSTFIELDS results in multipart/form-data:
<?php
curl_setopt(CURLOPT_POSTFIELDS, array('field1' => 'value'));
?>
Passing a URL-encoded string will result in application/x-www-form-urlencoded:
<?php
curl_setopt(CURLOPT_POSTFIELDS, array('field1=value&field2=value2'));
?>
I ran across this when integrating with both a warehouse system and an email system; neither would accept multipart/form-data, but both happily accepted application/x-www-form-urlencoded.
05-Aug-2008 11:56
if you use
<?php
curl_setopt($ch, CURLOPT_INTERFACE, "XXX.XXX.XXX.XXX");
?>
to specify IP adress for request, sometimes you need to get list of all your IP's.
ifconfig command will output something like:
rl0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
options=8<VLAN_MTU>
inet 82.146.XXX.XXX netmask 0xffffffff broadcast 82.146.XXX.XXX
inet 78.24.XXX.XXX netmask 0xffffffff broadcast 78.24.XXX.XXX
inet 82.146.XXX.XXX netmask 0xffffffff broadcast 82.146.XXX.XXX
inet 82.146.XXX.XXX netmask 0xffffffff broadcast 82.146.XXX.XXX
inet 82.146.XXX.XXX netmask 0xffffffff broadcast 82.146.XXX.XXX
inet 78.24.XXX.XXX netmask 0xffffffff broadcast 78.24.XXX.XXX
inet 78.24.XXX.XXX netmask 0xffffffff broadcast 78.24.XXX.XXX
ether XX:XX:XX:XX:XX:XX
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500
Opened by PID 564
tun1: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500
Opened by PID 565
Opened by PID 565
My solution for FreeBSD 6 and PHP 5 was:
<?php
ob_start();
$ips=array();
$ifconfig=system("ifconfig");
echo $ifconfig;
$ifconfig=ob_get_contents();
ob_end_clean();
$ifconfig=explode(chr(10), $ifconfig);
for ($i=0; $i<count($ifconfig); $i++) {
$t=explode(" ", $ifconfig[$i]);
if ($t[0]=="\tinet") {
array_push($ips, $t[1]);
}
}
for ($i=0; $i<count($ips); $i++) {
echo $ips[$i]."\n";
}
?>
You will get list of IP adresses in $ips array, like:
82.146.XXX.XXX
78.24.XXX.XXX
82.146.XXX.XXX
82.146.XXX.XXX
82.146.XXX.XXX
78.24.XXX.XXX
78.24.XXX.XXX
10-Jul-2008 05:08
If you want to connect to a server which requires that you identify yourself with a certificate, use following code. Your certificate and servers certificate are signed by an authority whose certificate is in ca.ctr.
<?php
curl_setopt($ch, CURLOPT_VERBOSE, '1');
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, '1');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, '1');
curl_setopt($ch, CURLOPT_CAINFO, getcwd().'/cert/ca.crt');
curl_setopt($ch, CURLOPT_SSLCERT, getcwd().'/cert/mycert.pem');
curl_setopt($ch, CURLOPT_SSLCERTPASSWD, 'password');
?>
If your original certificate is in .pfx format, you have to convert it to .pem using following commands
# openssl pkcs12 -in mycert.pfx -out mycert.key
# openssl rsa -in mycert.key -out mycert.pem
# openssl x509 -in mycert.key >> mycert.pem
07-Jul-2008 04:18
Although CURLOPT_CLOSEPOLICY and the applicable choices are valid constants, setting this option with curl_setopt() always returns false. A quick google search suggests the option is deprecated and/or never worked.
19-Jun-2008 09:19
Someone posted this under tmpfile (http://us3.php.net/manual/en/function.tmpfile.php#69419), and I thought it was particularly useful:
[The PHP function tmpfile()] is really useful for libcurl's CURLOPT_PUT feature if what you're trying to PUT is a string. For example:
<?php
/* Create a cURL handle. */
$ch = curl_init();
/* Prepare the data for HTTP PUT. */
$putString = "Hello, world!";
$putData = tmpfile();
fwrite($putData, $putString);
fseek($putData, 0);
/* Set cURL options. */
curl_setopt($ch, CURLOPT_URL, "http://www.example.com");
curl_setopt($ch, CURLOPT_PUT, true);
curl_setopt($ch, CURLOPT_INFILE, $putData);
curl_setopt($ch, CURLOPT_INFILESIZE, strlen($putString));
/* ... (other curl options) ... */
/* Execute the PUT and clean up */
$result = curl_exec($ch);
fclose($putData);
curl_close($ch);
?>
19-Jun-2008 04:02
In PHP5, for the "CURLOPT_POSTFIELDS" option, we can use:
<?php
$ch = curl_init($URI);
$Post = http_build_query($PostData);
curl_setopt($ch, CURLOPT_POSTFIELDS, $Post);
$Output = curl_exec($ch);
curl_close($ch);
?>
10-Apr-2008 12:55
If you are doing a POST, and the content length is 1,025 or greater, then curl exploits a feature of http 1.1: 100 (Continue) Status.
See http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html#sec8.2.3
* it adds a header, "Expect: 100-continue".
* it then sends the request head, waits for a 100 response code, then sends the content
Not all web servers support this though. Various errors are returned depending on the server. If this happens to you, suppress the "Expect" header with this command:
<?php
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
?>
See http://www.gnegg.ch/2007/02/the-return-of-except-100-continue/
04-Apr-2008 04:22
Clarification for the CURLOPT_NOBODY option: by excluding the body from your request, you're effectively making a HEAD request. Use the CURLOPT_NOBODY option to return only the headers in the remote response.
Example:
<?php
function check_url($url) {
$c = curl_init();
curl_setopt($c, CURLOPT_URL, $url);
curl_setopt($c, CURLOPT_HEADER, 1); // get the header
curl_setopt($c, CURLOPT_NOBODY, 1); // and *only* get the header
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1); // get the response as a string from curl_exec(), rather than echoing it
curl_setopt($c, CURLOPT_FRESH_CONNECT, 1); // don't use a cached version of the url
if (!curl_exec($c)) { return false; }
$httpcode = curl_getinfo($c, CURLINFO_HTTP_CODE);
return ($httpcode < 400);
}
?>
04-Mar-2008 09:16
if you would like to send xml request to a server (lets say, making a soap proxy),
you have to set
<?php
curl_setopt($ch, CURLOPT_HTTPHEADER, Array("Content-Type: text/xml"));
?>
makesure you watch for cache issue:
the below code will prevent cache...
<?php
curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
?>
hope it helps ;)
16-Feb-2008 06:26
If you try to upload file to a server, you need do CURLOPT_POST first and then fill CURLOPT_POSTFIELDS.
<?php
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postvars);
// ^^ This will post multipart/form-data
?>
07-Jan-2008 05:48
After much struggling, I managed to get a SOAP request requiring HTTP authentication to work. Here's some source that will hopefully be useful to others.
<?php
$credentials = "username:password";
// Read the XML to send to the Web Service
$request_file = "./SampleRequest.xml";
$fh = fopen($request_file, 'r');
$xml_data = fread($fh, filesize($request_file));
fclose($fh);
$url = "http://www.example.com/services/calculation";
$page = "/services/calculation";
$headers = array(
"POST ".$page." HTTP/1.0",
"Content-type: text/xml;charset=\"utf-8\"",
"Accept: text/xml",
"Cache-Control: no-cache",
"Pragma: no-cache",
"SOAPAction: \"run\"",
"Content-length: ".strlen($xml_data),
"Authorization: Basic " . base64_encode($credentials)
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_USERAGENT, $defined_vars['HTTP_USER_AGENT']);
// Apply the XML to our curl call
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_data);
$data = curl_exec($ch);
if (curl_errno($ch)) {
print "Error: " . curl_error($ch);
} else {
// Show me the result
var_dump($data);
curl_close($ch);
}
?>
12-Dec-2007 08:34
hey hey hey!
the problem: curl_setopt($ch,FOLLOW_LOCATION,1);
the error: trouble with open_basedir and safe_mode
the solution: a function already developed by someone
the solution n 2: the same function, modifed, works great for me..
<?php
function curl_redir_exec($ch,$debug="")
{
static $curl_loops = 0;
static $curl_max_loops = 20;
if ($curl_loops++ >= $curl_max_loops)
{
$curl_loops = 0;
return FALSE;
}
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
$debbbb = $data;
list($header, $data) = explode("\n\n", $data, 2);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($http_code == 301 || $http_code == 302) {
$matches = array();
preg_match('/Location:(.*?)\n/', $header, $matches);
$url = @parse_url(trim(array_pop($matches)));
//print_r($url);
if (!$url)
{
//couldn't process the url to redirect to
$curl_loops = 0;
return $data;
}
$last_url = parse_url(curl_getinfo($ch, CURLINFO_EFFECTIVE_URL));
/* 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']:'');
curl_setopt($ch, CURLOPT_URL, $new_url);
// debug('Redirecting to', $new_url);
return curl_redir_exec($ch);
} else {
$curl_loops=0;
return $debbbb;
}
}
?>
just use this function without de FOLLOW_LOCATION and should work. the problem was that when you get to the line where you return the data if http_code was different than 301 oe 302, $data has obsolete information or none. so $debbbb does the job.
hope this helps someone out there
thanks from argentina
25-Sep-2007 05:52
<?php
/*
* Author: Ojas Ojasvi
* Released: September 25, 2007
* Description: An example of the disguise_curl() function in order to grab contents from a website while remaining fully camouflaged by using a fake user agent and fake headers.
*/
$url = 'http://www.php.net';
// disguises the curl using fake headers and a fake user agent.
function disguise_curl($url)
{
$curl = curl_init();
// Setup headers - I used the same headers from Firefox version 2.0.0.6
// below was split up because php.net said the line was too long. :/
$header[0] = "Accept: text/xml,application/xml,application/xhtml+xml,";
$header[0] .= "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
$header[] = "Cache-Control: max-age=0";
$header[] = "Connection: keep-alive";
$header[] = "Keep-Alive: 300";
$header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
$header[] = "Accept-Language: en-us,en;q=0.5";
$header[] = "Pragma: "; // browsers keep this blank.
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_USERAGENT, 'Googlebot/2.1 (+http://www.google.com/bot.html)');
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($curl, CURLOPT_REFERER, 'http://www.google.com');
curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate');
curl_setopt($curl, CURLOPT_AUTOREFERER, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
$html = curl_exec($curl); // execute the curl command
curl_close($curl); // close the connection
return $html; // and finally, return $html
}
// uses the function and displays the text off the website
$text = disguise_curl($url);
echo $text;
?>
Ojas Ojasvi
01-Sep-2007 09:27
FYI,
Anyone trying to connect to .NET with CURL to send a simple XML post, pay attention to the following. This will save you hours! There is a previous note that I saw either on this page, or somewhere else on this site that explains the correct way to specify the header option is to create an array, then reference the array from the CURLOPT.
ie. Do something like this:
<?php
// Req. HTTP Header Values
$header[] = "Content-type: text/xml";
// Target URL
$sendTo = "http://www.example.com";
// Post Data
$post = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n....etc, etc,";
// Create CURL Connection
$ch = curl_init();
curl_setopt($ch, CURLOPT_USERAGENT, 'XtraDoh xAgent');
curl_setopt($ch, CURLOPT_URL, $sendTo);
curl_setopt($ch, CURLOPT_TIMEOUT, 900);
curl_setopt($ch, CURLOPT_CONNECTIONTIMEOUT, 30);
curl_setopt($ch, CURLOPT_FAILONERROR, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
?>
Notice the HTTPHEADER, $header above. I have not been able to get .NET to properly read the HTTP header as specified (in this case as text/xml) when using the following:
<?php
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type'=>'text/xml'));
?>
Although this may work when working with other PHP, IIS, or even PHP, Apache, it does not (at least in my experience) work with .NET, IIS.
20-Aug-2007 09:03
This is very clear in hindsight, but it still cost me several hours:
<?php curl_setopt($session, CURLOPT_HTTPPROXYTUNNEL, 1); ?>
means that you will tunnel THROUGH the proxy, as in "your communications will go as if the proxy is NOT THERE".
Why do you care? - Well, if you are trying to use, say, Paros, to debug HTTP between your cURL and the server, with CURLOPT_HTTPPROXYTUNNEL set to TRUE Paros will not see or log your traffic thus defeating the purpose and driving you nuts.
There are other cases, of course, where this option is extremely useful...
05-Jul-2007 10:09
if you are trying to connect to 'https://...' and after that want to work with POST data - that's the way:
<?php
$curl = curl_init();
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_COOKIEFILE, "cookiefile");
curl_setopt($curl, CURLOPT_COOKIEJAR, "cookiefile"); # SAME cookiefile
curl_setopt($curl, CURLOPT_URL, "url1"); # this is where you first time connect - GET method authorization in my case, if you have POST - need to edit code a bit
$xxx = curl_exec($curl);
curl_setopt($curl, CURLOPT_URL, "url2"); # this is where you are requesting POST-method form results (working with secure connection using cookies after auth)
curl_setopt($curl, CURLOPT_POSTFIELDS, "var1=value&var2=value&var3=value&"); # form params that'll be used to get form results
$xxx = curl_exec($curl);
curl_close ($curl);
echo $xxx;
?>
27-Jun-2007 06:18
Two things that I noted, one of which has been mentioned earlier, if you are connecting to an SSL site (https) and don't have the appropriate certificate, don't forget to set CURLOPT_SSL_VERIFYPEER as "false"... it's set to "true" by default. Scratched my head over 2 hours to figure this one out as I had a machine with an older version installed and everything worked fine without using this option on that one - but failed on other machines with newer versions.
Second very important thing, I've never had my scripts work (tried on various machines, multiple platforms) with a Relative path to a COOKIEJAR or COOKIEFILE. In my experience I HAVE to specify the absolute path and not the relative path.
Small script I wrote to connect to a page, gather all cookies into a jar, connect to another page to login, taking the cookiejar with you for authentication:
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_COOKIEJAR, "/Library/WebServer/Documents/tmp/cookieFileName");
curl_setopt($ch, CURLOPT_URL,"https://www.example.com/myaccount/start.asp");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
ob_start(); // Prevent output
curl_exec ($ch);
ob_end_clean(); // End preventing output
curl_close ($ch);
unset($ch);
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "field1=".$f1."&field2=".$f2."&SomeFlag=True");
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_COOKIEFILE, "/Library/WebServer/Documents/tmp/cookieFileName");
curl_setopt($ch, CURLOPT_URL,"https://www.example.com/myaccount/Login.asp");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$result = curl_exec ($ch);
curl_close ($ch);
?>
12-Jun-2007 09:35
If you are getting the following error:
SSL: certificate subject name 'example.com' does not match target host name 'example.net'
Then you can set the following option to get around it:
<?php curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); ?>
12-Jun-2007 08:55
Please note that the CURLOPT_INTERFACE setting only accepts IP addresses and hostnames of the local machine. It is not meant to send a URL to a specific IP address.
03-Jun-2007 11:51
In case you wonder how come, that cookies don't work under Windows, I've googled for some answers, and here is the result: Under WIN you need to input absolute path of the cookie file.
This piece of code solves it:
<?php
if ($cookies != '')
{
if (substr(PHP_OS, 0, 3) == 'WIN')
{$cookies = str_replace('\\','/', getcwd().'/'.$cookies);}
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookies);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookies);
}
?>
12-May-2007 04:52
curl will sometimes return an "Empty reply from server" error if you don't send a User-Agent string. Use the CURLOPT_USERAGENT option.
24-Apr-2007 04:01
Options not included in the above, but that work (Taken from the libcurl.a C documentation)
CURLOPT_FTP_SSL
Pass a long using one of the values from below, to make libcurl use your desired level of SSL for the ftp transfer. (Added in 7.11.0)
CURLFTPSSL_NONE
Don't attempt to use SSL.
CURLFTPSSL_TRY
Try using SSL, proceed as normal otherwise.
CURLFTPSSL_CONTROL
Require SSL for the control connection or fail with CURLE_FTP_SSL_FAILED.
CURLFTPSSL_ALL
Require SSL for all communication or fail with CURLE_FTP_SSL_FAILED.
14-Mar-2007 12:26
Seems that CURLOPT_RETURNTRANSFER Option set to TRUE, returns a "1" when the transaction returns a blank page.
I think is for eliminate the FALSE to can be with a blank page as return
08-Mar-2007 02:50
How to get rid of response after POST: just add callback function for returned data (CURLOPT_WRITEFUNCTION) and make this function empty.
<?php
function curlHeaderCallback($ch, $strHeader) {
}
curl_setopt($ch, CURLOPT_WRITEFUNCTION, 'curlHeaderCallback');
?>
27-Nov-2006 09:42
I was having problems with Authorize.net and the SSL cert matching even after adding:
<?php
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
?>
What I found after a lot of stumbling was I needed to set VERIFYHOST to FALSE. So if you are still have a problem with Authorize.NET SSL and cURL add this:
<?php
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
?>
22-Nov-2006 06:33
I was working on using php to interface with an authorize.net gateway, and I ran into a problem with certificates using curl to talk the https:// url.
curl_error() told me "SSL certificate problem, verify that the CA cert is OK."
I googled it and found the same "solution" over and over again: bypass verification by adding this line after curl_init():
<?php
curl_setopt($connection, CURLOPT_SSL_VERIFYPEER, false);
?>
This worked great, but I was required to verify, so here's what I did. Add the following lines:
<?php
curl_setopt($connection, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($connection, CURLOPT_CAINFO, "path:/ca-bundle.crt");
?>
with "path:/ca-bundle.crt" being the path to that certificate file. You can get this file by downloading the curl package (http://curl.haxx.se/download.html) and looking for it in the lib folder.
Feel free to email me.
22-Nov-2006 04:40
If you are trying to use CURLOPT_FOLLOWLOCATION and you get this warning:
Warning: curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an open_basedir is set...
then you will want to read http://www.php.net/ChangeLog-4.php which says "Disabled CURLOPT_FOLLOWLOCATION in curl when open_basedir or safe_mode are enabled." as of PHP 4.4.4/5.1.5. This is due to the fact that curl is not part of PHP and doesn't know the values of open_basedir or safe_mode, so you could comprimise your webserver operating in safe_mode by redirecting (using header('Location: ...')) to "file://" urls, which curl would have gladly retrieved.
Until the curl extension is changed in PHP or curl (if it ever will) to deal with "Location:" headers, here is a far from perfect remake of the curl_exec function that I am using.
Since there's no curl_getopt function equivalent, you'll have to tweak the function to make it work for your specific use. As it is here, it returns the body of the response and not the header. It also doesn't deal with redirection urls with username and passwords in them.
<?php
function curl_redir_exec($ch)
{
static $curl_loops = 0;
static $curl_max_loops = 20;
if ($curl_loops++ >= $curl_max_loops)
{
$curl_loops = 0;
return FALSE;
}
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
list($header, $data) = explode("\n\n", $data, 2);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($http_code == 301 || $http_code == 302)
{
$matches = array();
preg_match('/Location:(.*?)\n/', $header, $matches);
$url = @parse_url(trim(array_pop($matches)));
if (!$url)
{
//couldn't process the url to redirect to
$curl_loops = 0;
return $data;
}
$last_url = parse_url(curl_getinfo($ch, CURLINFO_EFFECTIVE_URL));
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']:'');
curl_setopt($ch, CURLOPT_URL, $new_url);
debug('Redirecting to', $new_url);
return curl_redir_exec($ch);
} else {
$curl_loops=0;
return $data;
}
}
?>
01-Oct-2006 11:51
As Yevgen mentioned earlier sometimes we can't use CURLOPT_COOKIEJAR and CURLOPT_COOKIEFILE. Below is a header callback function I wrote back in January that lets you maintain cookies between cURL requests. Cookies are added to $ch during all requests even during redirection, so you can use it together with CURLOPT_FOLLOWLOCATION.
Here is the code:
<?php
function read_header($ch, $string)
{
global $location; #keep track of location/redirects
global $cookiearr; #store cookies here
global $ch;
# ^overrides the function param $ch
# this is okay because we need to
# update the global $ch with
# new cookies
$length = strlen($string);
if(!strncmp($string, "Location:", 9))
{ #keep track of last redirect
$location = trim(substr($string, 9, -1));
}
if(!strncmp($string, "Set-Cookie:", 11))
{ #get the cookie
$cookiestr = trim(substr($string, 11, -1));
$cookie = explode(';', $cookiestr);
$cookie = explode('=', $cookie[0]);
$cookiename = trim(array_shift($cookie));
$cookiearr[$cookiename] = trim(implode('=', $cookie));
}
$cookie = "";
if(trim($string) == "")
{ #execute only at end of header
foreach ($cookiearr as $key=>$value)
{
$cookie .= "$key=$value; ";
}
curl_setopt($ch, CURLOPT_COOKIE, $cookie);
}
return $length;
}
?>
Using the header function with curl (add this before curl_exec):
<?php
#don't forget globals, especially if you are using this in function
curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'read_header');
?>
This code assumes that you will reuse $ch without initializing it every time (call curl_init only once, in the beginning). If you need to initialize $ch again at any point in your code you can access the currently stored cookies in $cookiearr and include them in the new $ch.
I wrote this function before I had enough experience with regular expressions so you won't find any preg_match calls here. I have used this code for quite a while and without any problems accessing gmail, yahoo, hotmail, aol etc. where I had to go through login and a few pages before getting to what I was looking for.
Svetlozar Petrov (http://svetlozar.net)
23-Aug-2006 05:35
Note that if you want to use a proxy and use it as a _cache_, you'll have to do:
<?php curl_setopt($ch, CURLOPT_HTTPHEADER, array("Pragma: ")); ?>
else by default Curl puts a "Pragma: no-cache" header in and thus force cache misses for all requests.
30-May-2006 06:31
Clarification on the callback methods:
- CURLOPT_HEADERFUNCTION is for handling header lines received *in the response*,
- CURLOPT_WRITEFUNCTION is for handling data received *from the response*,
- CURLOPT_READFUNCTION is for handling data passed along *in the request*.
The callback "string" can be any callable function, that includes the array(&$obj, 'someMethodName') format.
-Philippe
14-Apr-2006 02:22
Sometimes you can't use CURLOPT_COOKIEJAR and CURLOPT_COOKIEFILE becoz of the server php-settings(They say u may grab any files from server using these options). Here is the solution
1)Don't use CURLOPT_FOLLOWLOCATION
2)Use curl_setopt($ch, CURLOPT_HEADER, 1)
3)Grab from the header cookies like this:
preg_match_all('|Set-Cookie: (.*);|U', $content, $results);
$cookies = implode(';', $results[1]);
4)Set them using curl_setopt($ch, CURLOPT_COOKIE, $cookies);
Good Luck, Yevgen
23-Feb-2006 09:57
The examples below for HTTP file upload work great, but I wanted to be able to post multiple files through HTTP upload using HTML arrays as specified in example 38.3 at
http://us3.php.net/features.file-upload
In this case, you need to set the arrays AND keys in the $post_data, it will not work with just the array names. The following example shows how this works:
<?php
$post_data = array();
$post_data['pictures[0]'] = "@cat.jpg";
$post_data['pictures[1]'] = "@dog.jpg";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://example.com/my_url.php" );
curl_setopt($ch, CURLOPT_POST, 1 );
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$postResult = curl_exec($ch);
if (curl_errno($ch)) {
print curl_error($ch);
}
curl_close($ch);
print "$postResult";
?>
17-Feb-2006 12:19
load https:// or http://example.com/exam.php
with POST data (name=alex&year=18) and apply COOKIEs
<?php
$sessions = curl_init();
curl_setopt($sessions,CURLOPT_URL,'http://example.com/exam.php');
curl_setopt($sessions, CURLOPT_POST, 1);
curl_setopt($sessions,CURLOPT_POSTFIELDS,'name=alex&year=18');
curl_setopt($sessions,CURLOPT_COOKIEJAR,
dirname(__FILE__).'/cookie.txt');
curl_setopt($sessions,CURLOPT_FOLLOWLOCATION,0);
curl_setopt($sessions, CURLOPT_HEADER , 1);
curl_setopt($sessions, CURLOPT_RETURNTRANSFER,1);
$my_load_page = curl_exec($this->sessions);
?>
02-Feb-2006 11:55
If you're getting trouble with cookie handling in curl:
- curl manages tranparently cookies in a single curl session
- the option
<?php curl_setopt($ch, CURLOPT_COOKIEJAR, "/tmp/cookieFileName"); ?>
makes curl to store the cookies in a file at the and of the curl session
- the option
<?php curl_setopt($ch, CURLOPT_COOKIEFILE, "/tmp/cookieFileName"); ?>
makes curl to use the given file as source for the cookies to send to the server.
so to handle correctly cookies between different curl session, the you have to do something like this:
<?php
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_COOKIEJAR, COOKIE_FILE_PATH);
curl_setopt ($ch, CURLOPT_COOKIEFILE, COOKIE_FILE_PATH);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec ($ch);
curl_close($ch);
return $result;
?>
in particular this is NECESSARY if you are using PEAR_SOAP libraries to build a webservice client over https and the remote server need to establish a session cookie. in fact each soap message is sent using a different curl session!!
I hope this can help someone
Luca
27-Dec-2005 10:24
To further expand upon use of CURLOPT_CAPATH and CURLOPT_CAINFO...
In my case I wanted to prevent curl from talking to any HTTPS server except my own using a self signed certificate. To do this, you'll need openssl installed and access to the HTTPS Server Certificate (server.crt by default on apache)
You can then use a command simiar to this to translate your apache certificate into one that curl likes.
$ openssl x509 -in server.crt -out outcert.pem -text
Then set CURLOPT_CAINFO equal to the the full path to outcert.pem and turn on CURLOPT_SSL_VERIFYPEER.
If you want to use the CURLOPT_CAPATH option, you should create a directory for all the valid certificates you have created, then use the c_rehash script that is included with openssl to "prepare" the directory.
If you dont use the c_rehash utility, curl will ignore any file in the directory you set.
22-Dec-2005 10:13
There is really a problem of transmitting $_POST data with curl in php 4+ at least.
I improved the encoding function by Alejandro Moreno to work properly with mulltidimensional arrays.
<?php
function data_encode($data, $keyprefix = "", $keypostfix = "") {
assert( is_array($data) );
$vars=null;
foreach($data as $key=>$value) {
if(is_array($value)) $vars .= data_encode($value, $keyprefix.$key.$keypostfix.urlencode("["), urlencode("]"));
else $vars .= $keyprefix.$key.$keypostfix."=".urlencode($value)."&";
}
return $vars;
}
curl_setopt($ch, CURLOPT_POSTFIELDS, substr(data_encode($_POST), 0, -1) );
?>
23-Oct-2005 01:34
Resetting CURLOPT_FILE to STDOUT won't work by calling curl_setopt() with the STDOUT constant or a php://output stream handle (at least I get error messages when trying the code from phpnet at andywaite dot com). Instead, one can simply reset it as a side effect of CURLOPT_RETURNTRANSFER. Just say
<?php curl_setopt($this->curl,CURLOPT_RETURNTRANSFER,0); ?>
and following calls to curl_exec() will output to STDOUT again.
20-Oct-2005 08:42
A little mistake, that took a half-day to fix it:
When specifing CURLOPT_COOKIEFILE or CURLOPT_COOKIEJAR options, don't forget to "chmod 777" that directory where cookie-file must be created.
21-Sep-2005 02:09
<?php
/*
Here is a script that is usefull to :
- login to a POST form,
- store a session cookie,
- download a file once logged in.
*/
// INIT CURL
$ch = curl_init();
// SET URL FOR THE POST FORM LOGIN
curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/Members/Login.php');
// ENABLE HTTP POST
curl_setopt ($ch, CURLOPT_POST, 1);
// SET POST PARAMETERS : FORM VALUES FOR EACH FIELD
curl_setopt ($ch, CURLOPT_POSTFIELDS, 'fieldname1=fieldvalue1&fieldname2=fieldvalue2');
// IMITATE CLASSIC BROWSER'S BEHAVIOUR : HANDLE COOKIES
curl_setopt ($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
# Setting CURLOPT_RETURNTRANSFER variable to 1 will force cURL
# not to print out the results of its query.
# Instead, it will return the results as a string return value
# from curl_exec() instead of the usual true/false.
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
// EXECUTE 1st REQUEST (FORM LOGIN)
$store = curl_exec ($ch);
// SET FILE TO DOWNLOAD
curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/Members/Downloads/AnnualReport.pdf');
// EXECUTE 2nd REQUEST (FILE DOWNLOAD)
$content = curl_exec ($ch);
// CLOSE CURL
curl_close ($ch);
/*
At this point you can do do whatever you want
with the downloaded file stored in $content :
display it, save it as file, and so on.
*/
?>
23-Aug-2005 03:10
when specifing the file for either CURLOPT_COOKIEFILE or CURLOPT_COOKIEJAR you may need to use the full file path instead of just the relative path.
07-Jun-2005 09:08
After setting CURLOPT_FILE, you may want want to revert back to the normal behaviour of displaying the results. This can be achieved using:
<?php
$fp = fopen ("php://output", "w") or die("Unable to open stdout for writing.\n");
curl_setopt($ch, CURLOPT_FILE, $fp);
?>
01-Jun-2005 09:57
Problems can occur if you mix CURLOPT_URL with a 'Host:' header in CURLOPT_HEADERS on redirects because cURL will combine the host you explicitly stated in the 'Host:' header with the host from the Location: header of the redirect response.
In short, don't do this:
<?php
$host = "www.example.com";
$url = "http://$host/";
$headers = array("Host: $host");
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
Do this instead:
$host = "www.example.com";
$url = "http://$host/";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
?>
14-May-2005 01:09
About CURLOPT_ENCODING:
added in curl in 7.10 - Oct 1 2002
In 7.10.5 - May 19 2003 syntax was chnaged:
"setting CURLOPT_ENCODING to "" automaticly enables all supported encodings"
09-May-2005 04:26
Using cURL, I needed to call a third-party script which was returning binary data as attachment to pass on retrieved data again as attachment.
Problem was that the third-party script occassionally returned HTTP errors and I wanted to avoid passing on zero-length attachment in such case.
Combination of using CURLOPT_FAILONERROR and CURLOPT_HEADERFUNCTION callback helped to process the third-party script HTTP errors neatly:
<?php
function curlHeaderCallback($resURL, $strHeader) {
if (preg_match('/^HTTP/i', $strHeader)) {
header($strHeader);
header('Content-Disposition: attachment; filename="file-name.zip"');
}
return strlen($strHeader);
}
$strURL = 'http://www.example.com/script-whichs-dumps-binary-attachment.php';
$resURL = curl_init();
curl_setopt($resURL, CURLOPT_URL, $strURL);
curl_setopt($resURL, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($resURL, CURLOPT_HEADERFUNCTION, 'curlHeaderCallback');
curl_setopt($resURL, CURLOPT_FAILONERROR, 1);
curl_exec ($resURL);
$intReturnCode = curl_getinfo($resURL, CURLINFO_HTTP_CODE);
curl_close ($resURL);
if ($intReturnCode != 200) {
print 'was error: ' . $intReturnCode;
}
?>
21-Feb-2005 05:38
Another way to automate a login process and store multiple cookies for additional transfers.
(The easiest way is probably just to use CURLOPT_COOKIEJAR and CURLOPT_COOKIEFILE and save them to a file. But if you need to change those cookie values or add/delete them then you can use the code below to set them.)
Continuing with Paul Ebermann's parsing function.
<?php
function parse_response($this_response)
{
// Split response into header and body sections
list($response_headers, $response_body) = explode("\r\n\r\n", $this_response, 2);
$response_header_lines = explode("\r\n", $response_headers);
// First line of headers is the HTTP response code
$http_response_line = array_shift($response_header_lines);
if(preg_match('@^HTTP/[0-9]\.[0-9] ([0-9]{3})@',$http_response_line, $matches)) { $response_code = $matches[1]; }
// put the rest of the headers in an array
$response_header_array = array();
foreach($response_header_lines as $header_line)
{
list($header,$value) = explode(': ', $header_line, 2);
$response_header_array[$header] .= $value."\n";
}
return array("code" => $response_code, "header" => $response_header_array, "body" => $response_body);
}
// Do transfer, and make sure to include header in response
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "[login process]");
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);
curl_close($ch);
// Parse the response message
$response = parse_response($response);
// Create the basic header
$this_header = array(
"MIME-Version: 1.0",
"Content-type: text/html; charset=iso-8859-1",
"Content-transfer-encoding: text"
);
// Add each cookie that has been returned in the response
// If cookies need to be added/deleted or value changed, then add code here
$cookies = explode("\n", $response["header"]["Set-Cookie"]);
foreach($cookies as $this_cookie) { array_push($this_header, "Cookie: ".$this_cookie); }
// Next set of transfers
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "[new transfer]");
curl_setopt($ch, CURLOPT_HTTPHEADER, $this_header);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);
curl_close($ch);
?>
11-Nov-2004 05:51
The parse_response code below does not return multiple cookies as the value of 'Set-Cookie' if multiple cookies are set by the server. It appears to only return the last cookie set.
21-Jul-2004 08:19
Hi!
I have found some information I am sure it could help lot of programmers when they want to connect with curl to any https website and they haven't a good or right CA Cert :)
I give you just one example It has resolved me 2 hours of my time looking for a solution.
It is simple, just if you get any error in the curl_exec (use curl_error(...) to see the error to trace it) add the next line and everything is solved:
(note: replace $ch with the right curl variable)
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
<?php
$ch = curl_init();
$res= curl_setopt ($ch, CURLOPT_URL,"https://yoururl/cgi");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt ($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "Idc=si&");
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
$xyz = curl_exec ($ch);
curl_close ($ch);
echo $xyz;
if ($xyz == NULL) {
echo "Error:<br>";
echo curl_errno($ch) . " - " . curl_error($ch) . "<br>";
}
?>
I hope this helps.
Raul Mate Galan
Ceo Navenetworks Corp.
Note: Thanks to Ruben Lopez Gea for his help too.
07-May-2004 03:00
If you specify a CAINFO, note that the file must be in PEM format! (If not, it won't work).
Using Openssl you can use:
openssl x509 -in <cert> -inform d -outform PEM -out cert.pem
To create a pem formatted certificate from a binary certificate (the one you get if you download the ca somewhere).
29-Apr-2004 02:48
I found it very annoying that cURL did not offer any easy way to extract the response headers. If you do
<?php curl_setopt($ch, CURLOPT_HEADER, 1); ?>
then you only get the headers output inline with the rest of your response. Here's a nice little function to parse the cURL response when you use CURLOPT_HEADER. I took it from an example on another site and turned it into a function. It assumes you're using CURLOPT_RETURNTRANSFER to return the response to some variable that is then passed to the function. You just pass it a curl_exec result and it returns the result parsed into an array with headers broken up into their correct parts.
<?php
function parse_response($response){
/*
***original code extracted from examples at
***http://www.webreference.com/programming/php/cookbook/chap11/1/3.html
***returns an array in the following format which varies depending on headers returned
[0] => the HTTP error or response code such as 404
[1] => Array
(
[Server] => Microsoft-IIS/5.0
[Date] => Wed, 28 Apr 2004 23:29:20 GMT
[X-Powered-By] => ASP.NET
[Connection] => close
[Set-Cookie] => COOKIESTUFF
[Expires] => Thu, 01 Dec 1994 16:00:00 GMT
[Content-Type] => text/html
[Content-Length] => 4040
)
[2] => Response body (string)
*/
list($response_headers,$response_body) = explode("\r\n\r\n",$response,2);
$response_header_lines = explode("\r\n",$response_headers);
// first line of headers is the HTTP response code
$http_response_line = array_shift($response_header_lines);
if (preg_match('@^HTTP/[0-9]\.[0-9] ([0-9]{3})@',$http_response_line,
$matches)) {
$response_code = $matches[1];
}
// put the rest of the headers in an array
$response_header_array = array();
foreach ($response_header_lines as $header_line) {
list($header,$value) = explode(': ',$header_line,2);
$response_header_array[$header] = $value;
}
return array($response_code,$response_header_array,$response_body);
}
?>
04-Apr-2004 08:20
A bit more documentation (without minimum version numbers):
- CURLOPT_WRITEFUNCTION
- CURLOPT_HEADERFUNCTION
Pass a function which will be called to write data or headers respectively. The callback function prototype:
long write_callback (resource ch, string data)
The ch argument is CURL session handle. The data argument is data received. Note that its size is variable. When writing data, as much data as possible will be returned in all invokes. When writing headers, exactly one complete header line is returned for better parsing.
The function must return number of bytes actually taken care of. If that amount differs from the amount passed to this function, an error will occur.
- CURLOPT_READFUNCTION
Pass a function which will be called to read data. The callback function prototype:
string read_callback (resource ch, resource fd, long length)
The ch argument is CURL session handle. The fd argument is file descriptor passed to CURL by CURLOPT_INFILE option. The length argument is maximum length which can be returned.
The function must return string containing the data which were read. If length of the data is more than maximum length, it will be truncated to maximum length. Returning anything else than a string means an EOF.
[Note: there is more callbacks implemented in current cURL library but they aren't unfortunately implemented in php curl interface yet.]
19-Nov-2003 02:18
The page http://curl.haxx.se/libcurl/c/curl_easy_setopt.html at the cURL site has a list of all the CURLOPTS, including many not mentioned here. Also see http://curl.haxx.se/libcurl/php/examples/ for cURL examples in PHP.
07-Jul-2003 04:38
I managed to use curl to retrieve information from severs on ports other than 80 or 443 (for https) on some installations but not on all.
If you get an "CURLE_COULDNT_CONNECT /* 7 */" error, try adding the port : (for example)
<?php curl_setopt($ch, CURLOPT_PORT, $_SERVER['SERVER_PORT']); ?>
14-May-2003 04:36
Just a reminder: When setting your CURLOPT_POSTFIELDS remember to replace the spaces in your values with %20
02-Apr-2003 11:08
If you want to Curl to follow redirects and you would also like Curl to echo back any cookies that are set in the process, use this:
<?php curl_setopt($ch, CURLOPT_COOKIEJAR, '-'); ?>
'-' means stdout
-dw
13-Nov-2002 12:19
About the CURLOPT_HTTPHEADER option, it took me some time to figure out how to format the so-called 'Array'. It fact, it is a list of strings. If Curl was already defining a header item, yours will replace it. Here is an example to change the Content Type in a POST:
<?php curl_setopt ($ch, CURLOPT_HTTPHEADER, Array("Content-Type: text/xml")); ?>
Yann
beware that not all cURLlib constants are supported under php :
e.g. CURLOPT_PROGRESSFUNCTION or CURLOPT_WRITEDATA are not supported.
CURLOPT_WRITEFUNCTION, although undocumented is supported. It takes the name of a user_defined function.
the function should take two arguments (the curl handle, and the inputdata) and return the length of the written data
e.g.
<?php
function myPoorProgressFunc($ch,$str){
global $fd;
$len = fwrite($fd,$str);
print("#");
return $len;
}
curl_setopt($ch,CURLOPT_WRITEFUNCTION,"myPoorProgressFunc");
?>
Also be aware that CURLOPT_WRITEFUNCTION does NOT take the CURLOPT_FILE as a parameter!
in curl lib it would take CURLOPT_WRITEDATA but this is not supported by php; that's why I use "global $fd;" in my exemple function.
CURLOPT_HEADERFUNCTION works the same, and is guaranteed to receive complete header lines as input!
Hope this helps
Ivan
13-Sep-2002 09:34
If you set return transfer to 1 and are sending a post form and find that this crashes php try setting follow location to 1 also. I'm not exactly sure why this crashed, but after i used follow it stopped.
<?php
curl_setopt ($sess, CURLOPT_FOLLOWLOCATION, '1');
curl_setopt ($sess, CURLOPT_RETURNTRANSFER, '1');
?>
26-Aug-2002 09:31
To make a POST in multipart/form-data mode
this worked for me, the " \n" at the end of the variables was very important on my OS X server.
<?php
$file = "file_to_upload.txt";
$submit_url = "http://www.example.com/upload_page.php";
$formvars = array("cc"=>"us \n");
$formvars[variable_1] = "bla bla \n";
$formvars[variable_2] = "bla bla \n";
$formvars[variable_3] = "bla bla \n";
$formvars[variable_4] = "bla bla \n";
$formvars[upfile] = "@$file"; // "@" causes cURL to send as file and not string (I believe)
// init curl handle
$ch = curl_init($submit_url);
curl_setopt($ch, CURLOPT_COOKIEJAR, "my_cookies.txt"); //initiates cookie file if needed
curl_setopt($ch, CURLOPT_COOKIEFILE, "my_cookies.txt"); // Uses cookies from previous session if exist
curl_setopt($ch, CURLOPT_REFERER, "http://www.example.net"); //if server needs to think this post came from elsewhere
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1); // follow redirects recursively
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $formvars);
// perform post
echo $pnp_result_page = curl_exec($ch);
curl_close ($ch);
?>
03-Apr-2002 09:14
CURLOPT_HTTPHEADER is NOT like the -H command line switch. The command line switch adds or replaces headers (much like the header() line in PHP, but for HTTP clients instead of servers), but the curl extension will eliminate the headers cURL sends by default.
For instance, your Authorization, Host, Referer, Pragma, and Accept headers which are normally written by default or by other CURLOPT_*'s.
Also, it might seem intuitive that this should accept an array hash of header->values, but this is not the case. It accepts an array of strings of the format "Header: Value", much like the -H command-line switch.
Hope this helps,
terry
01-Mar-2002 03:18
It's possible to take advantage of multiple URLs on the same host in one curl_exec transaction ... just use multiple instances of CURLOPT_URL.
Example:
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://example.com/a.html");
curl_setopt($ch, CURLOPT_URL, "http://example.com/b.html");
curl_setopt($ch, CURLOPT_URL, "http://example.com/c.html");
curl_exec($ch);
curl_close($ch);
?>
... the URLs appear to be hit in the same order they are entered. This takes advantage of cURL's Persistant Connection capability if all the URLs are on the same host!
18-Dec-2001 09:35
To collect cookies recieved with a request, set CURLOPT_COOKIEJAR "cookieFileName". Then use CURLOPT_COOKIEFILE "cookieFileName" to recall them in subsequent transactions.
To make a POST in multipart/form-data mode
(to upload a file for example) you can use
<?php curl_setopt($ch,CURLOPT_POSTFIELDS,$post); ?>
where $post is an array :
<?php
$post['key1'] = 'data1';
// like a text field in a POST
$post['file1'] = '@filename1'
// upload filename1
?>
For more informations see the
curl_formparse man page.
14-May-2001 09:00
CURLOPT_RETURNTRANSFER has the interesting behaviour of tacking a null char onto the end of the string. This null char is actually on the end of the php string, and can cause some odd results if you're not expecting it to be there.
22-Feb-2001 01:50
If you want to connect to a secure server for posting info/reading info, you need to make cURL with the openSSL options. Then the sequence is nearly identical to the previous example (except http_S_://, and possibly add the useragent):
<?php
curl_setopt($ch, CURLOPT_URL,"https://example.com");
//some sites only accept your request if your browser looks legit, so send a useragent profile...
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");
?>
07-Feb-2001 03:09
If you'd like to include extra headers in your POST request, you can accomplish this by setting the following option:
CURLOPT_HTTPHEADER
This is similar to the CURL -H command line switch.
Thanks to Daniel Stenberg for pointing out this usefull feature!
Note: this option was first supported in PHP version 4.03 .
25-Jan-2001 07:33
Just because the docs are rather sparse on this, to set multiple values in a cookie, you separate them with a semicolon, as usual. An example, yo set j to j and k to k:
<?php curl_setopt($ch,CURLOPT_COOKIE,"j=j;k=k"); ?>
-- Alex
17-Jan-2001 10:31
I used to download www pages to my script and one of the pages was different in MS explorer and different, when I downloaded it. Namely, information, I was really interested in was missing. That was because the server on the other bank of the river was looking at who is downloading the page. Everything got fixed when I pretended I was MSIE. It is done with curl. Here is a function, that you may use in similar situation
<?php
function download_pretending($url,$user_agent) {
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_USERAGENT, $user_agent);
curl_setopt ($ch, CURLOPT_HEADER, 0);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec ($ch);
curl_close ($ch);
return $result;
}
?>
