El uso de cookies es práctico para marcar y diferenciar a los usuarios, y para almacenar del lado del cliente información de personalización de la experiencia de usuario de manera sencilla.

Para ello en PHP contamos con el array global $_COOKIE y el método setcookie() .

$_COOKIE nos permite leer todas las cookies que el navegador tiene almacenadas asociadas al dominio desde el que está recibiendo la página. En cada carga de página, el navegador volverá a enviar toda la información de los datos almacenados en las cookies. Igualmente el navegador se asegurará (si tiene algún bug) de que no nos envía cookies de otros dominios.

Hay que tener en cuenta que al insertar un frame o script desde otro sitio en nuestra página (por ejemplo publicitario, o un botón de me gusta de facebook), éste está recibiendo sus propias cookies de su dominio, diferentes de las nuestras. Pero también puede por javascript analizar el contenido HTML del documento principal, por lo que sí es un elemento muy omnipresente, puede monitorizar la información de los usuarios entre multitud de páginas.

También hay que tener en cuenta que desde el ordenador del usuario es muy fácil leer todas las cookies del navegador, con todos los valores asociados a las mismas, por lo que no es una herramienta adecuada para guardar información sensible como contraseñas.

Con setcookie() podemos no solamente asociar un par clave => valor para ser almacenado, sino especificar si el ámbito de aplicación es un subdominio concreto de la página que se está visitando, o la fecha de caducidad de esta información. Pasa dicha fecha, el navegador debería automáticamente borrar la cookie.

Una forma de forzar el borrado de una cookie antes del tiempo de caducidad que se estableció originalmente, es establecer de nuevo una caducidad, con una fecha del pasado. De esta manera, el navegador la eliminará directamente.

Nótese que todo esto no aplica a las cookies de sesión, que se lee y establecen mediante $_SESSION . En este caso, la cookie del navegador solo almacena un identificador, que el servidor PHP asocia a unos datos que están en éste y no en el navegador (por lo que la información almacenada en principio es accesible solo desde el servidor). Este tipo de cookie se elimina automáticamente al cerrar totalmente el navegador (todas las pestañas), o al utilizar desde PHP unset() sobre la variable de la cookie de sesión.

<?php
 
echo "<h1>Ejemplo cookies</h1>";

if ( ! empty($_GET['borranombre'])) {
	setcookie('nombre','',time()-100);
	echo 'Cookie borrada<br>';
}

$nombre = '';
if ( empty($_COOKIE['nombre'])) {
	if ( empty($_GET['nombre'])) {
		echo '<form action="'.$_SERVER['PHP_SELF'].'" method="get">';
		echo 'Nombre: <input type="text" name="nombre" /><br>';
		echo '<input type="submit" value="enviar" /><br>';
		echo "</form>";
	} else {
		setcookie('nombre',$_GET['nombre'],time()+3600);
		$nombre = $_GET['nombre'];
		
	}
} else {
	$nombre = $_COOKIE['nombre'];
}
echo "Hola ".$nombre."<br>";
//var_dump( $_COOKIE );
echo "<br>";
echo '<a href="'.$_SERVER['PHP_SELF'].'?borranombre=1">Borrar cookie</a>';
<?php
session_start();
echo "<h1>Ejemplo sesión</h1>";

if ( ! empty($_GET['borranombre'])) {
	unset($_SESSION['nombre']);
	echo 'Cookie borrada<br>';
}

$nombre = '';
if ( empty($_SESSION['nombre'])) {
	if ( empty($_GET['nombre'])) {
		echo '<form action="'.$_SERVER['PHP_SELF'].'" method="get">';
		echo 'Nombre: <input type="text" name="nombre" /><br>';
		echo '<input type="submit" value="enviar" /><br>';
		echo "</form>";
	} else {
		$_SESSION['nombre'] = $_GET['nombre'];
		$nombre = $_GET['nombre'];
	}
} else {
	$nombre = $_SESSION['nombre'];
}
echo "Hola ".$nombre."<br>";
// if (isset($_SESSION) ) var_dump( $_SESSION );
echo "<br>";
echo '<a href="'.$_SERVER['PHP_SELF'].'?borranombre=1">Borrar sesión</a>';

Como nota adicional, como el valor de las cookies se envía en la cabecera de la conexión HTTP, cuando enviamos con setcookie() la caducidad para borrar la cookie, durante esa misma ejecución de la página todavía tenemos en memoria el valor. Será en la siguiente carga cuando dejemos de recibir el valor de esa cookie. Con unset() y $_SESSION sin embargo, lo que hacemos es borrar la variable del lado del servidor, por lo que el cambio tiene efecto inmediato.