Solucionar Warning: session_start() [function.session-start]: open(/tmp/sess_404b65f5a6f22fd57694ce1442af5769, O_RDWR) failed: Permission denied (13)


El error completo sera algo como:

PHP Warning: Unknown(): Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/tmp/) in Unknown on line 0
PHP Warning: Unknown(): open(/tmp/sess_404b65f5a6f22fd57694ce1442af5769, O_RDWR) failed: No such file or directory (2) in Unknown on line 0
PHP Warning: session_start() [<a href=’function.session-start’>function.session-start</a>]: open(/tmp/sess_404b65f5a6f22fd57694ce1442af5769, O_RDWR) failed: No such file or directory (2)

Las sesiones en php, son simplemente una cookie, pero que se almacena en servidor. Y una cookie es simplemente un fichero de texto con un hash y variables con datos.

Este error puede darse en el session_start() y puede darse que al no asignar un nombre especifico a la sesión, se use un genérico, que tiene la forma sess_(un hash) y se use un fichero de sesión aleatorio que haya dado colisión con otro que haya sido creado por otro usuario que lo este usando también sin establecer nombre.

¿y porque se da el error? Porque estas viendo una página “cacheada” en tu navegador y el servidor tiene asignada esa cookie-sesion a otro usuario, por eso de dice que no tienes permisos. La solución seria borrar la cache, pero aunque es un apaño, la culpa no la tiene el usuario, esta en el servidor por haber asignado esa cookie-session a otro usuario previamente no haber liberado la cookie-session.

Pero tampoco podemos echarle toda la culpa al servidor si nosotros lo programamos de tal modo.

En algún comentario en ingles podéis leer “in the belief that somehow the two people were getting the same ID and hence temp file”.

Yo tengo bastante experiencia en php y nunca se me había dado este error y ya de por sí me resultaba muy raro. Pero esto es un problema que esta generando PHP con phpsuexec.

Buscando en google, aparentemente no hay soluciones, pero si que había reportes de bug en el bugtracker de PHP:
http://bugs.php.net/bug.php?id=19022 (BUG PADRE)
Otros bugs relacionados:
http://bugs.php.net/bug.php?id=43990
http://bugs.php.net/bug.php?id=5370

Si observas las respuestas de google de otros hosting, dan como solución  “contrata a un mejor sysadmin”, “TU estas haciendo algo mal”, “comprueba tu configuración”, “Asked sys admin to fix it” , pero no dicen porque, ni como arreglarlo, ni dan soluciones, eso es para evitar decir que NO tienen solución,  en Quijost no engañamos a nuestros usuarios de tal modo y explicamos lo hechos de forma honesta.

Las únicas soluciones que se dan son:

1 – Reiniciar la máquina (MALA solución: tratándose de servidores en producción no se puede jugar con el uptime y más si se da espontánea y periódicamente)

2 – Eliminar todas las sesiones con: rm -rf /tmp/sess_* (MEDIA solución: no requiere reinicio, pero hace perder el logueo a todos los usuarios que estén en el servidor para arreglar al resto, aparte habría que ejecutarla cada vez que da este error que puede ser en cualquier momento y sin posibilidad de detectar cuando)

3 – Modificar el directorio donde se guardan las sesiones a uno del usuario para así que no den problemas de permisos:
ini_set('session.save_handler', 'files');
O bien un directorio del usuario (creando un directorio tmp en el directorio del usuario):
ini_set('session.save_path', '/home/usuario/tmp');

Documentacion:
session_save_path() www.php.net/session_save_path

Podría valer pero no es la mejor solución.

La solución más correcta y hasta que los señores de PHP se dignen a arreglar este BUG que posiblemente afecte a millones de sitios web de php sería la siguiente:

1 – Establecer la cookie-sesion en un directorio de tu propio usuario, es decir dentro de tu dominio, por ejemplo:

ini_set('session_save_path', '/home/tuusuario/tmp');

2 – Asignar un nombre a la sesión:

session_name('tuusuario');

3 – Poner este trozo de código para evitar que te de error en el session_start():

if(@session_start() == false){session_destroy();session_start();}

Lo que hacemos es borrar la sesión actual si da error y generar otra, sino da error simplemente la iniciamos (esta más cool utilizando un if ternario).

Por lo tanto, resumiendo, en vez de poner sólo session_start(), para solucionar el bug, tendrías que poner lo siguiente (claro esta, poniendo tu usuario):
ini_set('session_save_path', '/home/tuusuario/tmp');
session_name('tuusuario');
if(@session_start() == false){session_destroy();session_start();}


26 comentarios en «Solucionar Warning: session_start() [function.session-start]: open(/tmp/sess_404b65f5a6f22fd57694ce1442af5769, O_RDWR) failed: Permission denied (13)»

  1. buenas….
    alguien me puede ayudar con estos errores por favor?

    Warning: session_start() [function.session-start]: open
    Warning: session_start() [function.session-start]: Cannot send session cookie – headers already sent by

    1. Ese error se debe a que estas mostrando algún contenido html antes de las funciones session_start(). No es lo que se expone en el artículo, pero espero que te ayude, simplemente elimina cualquier texto que imprimas por pantalla antes de session_start(), incluso líneas vacías.

  2. lo qe dices funciona pero no me funciona cuando pongo una restriccion hacia la pagina qe iria al ingresar usuario y clave, no reconce para nada el nivel qe pongo para qe ingresen solo ciertos usuarios a una pagina, sabes por que pasa eso??gracias de antemano 🙂

  3. gracias x respoderme…
    lo qe stoy aciendo es un login para el ingreso de usuario, que al ingresar me dirija hacia una pagina principal
    este el codigo del login:

    <?php
    // *** Validate request to login to this site.
    if (!isset($_SESSION)) {
    session_start();
    }
    $loginFormAction = $_SERVER['PHP_SELF'];
    if (isset($_GET['accesscheck'])) {
    $_SESSION['PrevUrl'] = $_GET['accesscheck'];
    }
    y mas codigo………..

    pero me salia el error de: Warning: session_start() [function.session-start]: open(\xampp\tmp\sess_en61p5dlb0sn9s5kr07aqri2c3, O_RDWR) failed: No such file or directory (2) in….

    pero esto lo arregle usando la solucion que proporcionaste y todo bien, pero cuando me voy a la pagina principal y le kiero poner la opcion de "restingir acceso a pagina" para que solo algunos usuarios ingresen, ya no me funciona el login, no me sale error pero no me permite el ingreso a ninguna pagina.
    este un poco del codigo para restingir que estoy usando

    <?php
    if (!isset($_SESSION)) {
    session_start();
    }
    $MM_authorizedUsers = "augg";
    $MM_donotCheckaccess = "false";

    // *** Restrict Access To Page: Grant or deny access to this page
    function isAuthorized($strUsers, $strGroups, $UserName, $UserGroup) {
    // For security, start by assuming the visitor is NOT authorized.
    $isValid = False;

    // When a visitor has logged into this site, the Session variable MM_Username set equal to their username.
    // Therefore, we know that a user is NOT logged in if that Session variable is blank.
    if (!empty($UserName)) {
    // Besides being logged in, you may restrict access to only certain users based on an ID established when they login.
    // Parse the strings into arrays.
    $arrUsers = Explode(",", $strUsers);
    $arrGroups = Explode(",", $strGroups);

    use tambien la solucion que diste pero en la pagina de restingir no funciona
    espero que este un poko mejor explicado a compacion de lo qe puse anteiormente 😛
    gracias de nuevo de antemano

  4. <?php
    include("cnn.php");
    $link=Conectarse();

    $hayPost = false;
    if(!empty($_POST["logar"]))
    {
    $hayPost = true;
    if(!empty($_POST["usuario"]) && !empty($_POST["pass"]))
    {
    include "practicaKomtes_funciones.php";
    $key = "lk53nk634s53g3";

    $usuario = EncriptarDato(SqlValido(utf8_encode($_POST['usuario'])), $key);
    $pass = EncriptarDato(SqlValido($_POST['pass']), $key);

    $sql = "SELECT * FROM acceso WHERE acc_nombre = '$usuario' AND acc_pass = '$pass' AND acc_eliminado = 0";
    $rs = mysql_query($sql,$link);
    if($rs_usuario = mysql_fetch_array($rs))
    {
    //session_save_path("C:\xampp\tmp");
    ini_set('session_save_path','C:\xampp\tmp');
    session_name('root');
    if(@session_start() == false){session_destroy();session_start();}

    $_SESSION['UsCd'] = $rs_usuario["acc_codigo"];
    $_SESSION['Priv'] = $rs_usuario["acc_privilegios"];
    $_SESSION['Secc'] = $rs_usuario["acc_secciones"];

    header("Location: practicaKomtes_apertura.php");
    //include "practicaKomtes_apertura.php" ;
    }
    else
    {
    echo "alert(‘El usuario o la contraseña no son validos. 1’)”;
    }
    }
    else
    {
    echo “alert(‘El usuario o la contraseña no son validos. 2’)”;
    }
    }
    ?>

  5. hola no se si me pueden ayudar me sale el error :

    arning: Cannot modify header information – headers already sent by (output started at C:\xampp\htdocs\ProyeLogan\cnn.php:24) in C:\xampp\htdocs\ProyeLogan\practicaKomtes_login.php on line 30

    este es el codigo:

    <?php
    include("cnn.php");
    $link=Conectarse();

    $hayPost = false;
    if(!empty($_POST["logar"]))
    {
    $hayPost = true;
    if(!empty($_POST["usuario"]) && !empty($_POST["pass"]))
    {
    include "practicaKomtes_funciones.php";
    $key = "lk53nk634s53g3";

    $usuario = EncriptarDato(SqlValido(utf8_encode($_POST['usuario'])), $key);
    $pass = EncriptarDato(SqlValido($_POST['pass']), $key);

    $sql = "SELECT * FROM acceso WHERE acc_nombre = '$usuario' AND acc_pass = '$pass' AND acc_eliminado = 0";
    $rs = mysql_query($sql,$link);
    if($rs_usuario = mysql_fetch_array($rs))
    {
    //session_save_path("C:\xampp\tmp");
    ini_set('session_save_path','C:\xampp\tmp');
    session_name('root');
    if(@session_start() == false){session_destroy();session_start();}

    $_SESSION['UsCd'] = $rs_usuario["acc_codigo"];
    $_SESSION['Priv'] = $rs_usuario["acc_privilegios"];
    $_SESSION['Secc'] = $rs_usuario["acc_secciones"];

    header("Location: practicaKomtes_apertura.php");
    //include "practicaKomtes_apertura.php" ;
    }
    else
    {
    echo "alert(‘El usuario o la contraseña no son validos. 1’)”;
    }
    }
    else
    {
    echo “alert(‘El usuario o la contraseña no son validos. 2’)”;
    }
    }
    ?>
    espero su ayuda.

    atte: LOGAN

  6. Hola, me aparecio el mismo error, pero no entiendo porque….

    Tengo un servicio de hosting contratado deonde alojo varios sitios web.

    Hice una copia de un sitio ( dominio 1 ) para desarrollar otro sitio ( dominio 2 ) basado en el primero.

    La primer linea del archivo index.php es precisamente

    Pareciera que por ser el mismo codigo ( Copy – Paste ) , este dando el error de sesion duplicada, sin embargo son nombres de dominio diferentes.

    La explicacion del articulo esta excelente, pero mi dua es porque se genera el error en este caso, es decir no parece ser una casualidad que el servidor asigne los mismos datos de sesion para cada dominio.

    Saludos !!!!

  7. no entiendo muy bien lo de este error aun soy novata pero la verdad me urge solucinar esto como lo tendria que solucionar si no es mucha la molestia
    Warning: session_start() [function.session-start]: Cannot send session cookie – headers already sent by (output started at C:\AppServ\www\miempresasadecv\encabezado.php:1) in C:\AppServ\www\miempresasadecv\encabezado.php on line 37

    y necesito poner un datos pero tengo mas usuarios porfis apenas estoy empezando y necesito resolver este punto para mañana estoy leyendo pero no logro comprender bien

  8. pues en mi caso me dio el mismo error en un servicio de hosting que tiene la empresa, y se soluciono al darle permisos de escritura y lectura a la carpeta administrator ¿no se si funcione para todos pero a mi si me funciono?

  9. la solución que esta al principio de estos post es la que necesitas, mira es muy sencillo lo unico si quieres q no te genere el error solo es necesario colocar ini_set(‘session_save_path’, ‘/home/tuusuario/tmp’); y después de esta if(@session_start() == false){session_destroy();session_start();} el session_name es util pero si tu no necesitas dejar registro del usuario que ingreso, te debe quedar de la sig manera:

    ini_set(‘session_save_path’, ‘/home/tuusuario/tmp’);
    if(@session_start() == false){session_destroy();session_start();}

    –> para la dirección Home que aparece debes colocar una existente en tu servidor que se almacene preferiblemente en carpeta de temporales

  10. ini_set(‘session_save_path’, ‘/home/tuusuario/tmp’);

    pero cual es tuusuario y lo de home tengo que crearlo?

  11. El error mencionado es pk la carpeta en cuestión ( /tmp/ ) no tiene permisos de escritura, por ende, no puede crear variables de session.
    Bastaría con indicarle una ruta donde si tiene permisos de escritura para que desde esa ruta cree las variables de session que sean necesarias.

    P. ej.:

    /* puedes poner: echo session_save_path (); para saber la ruta actual por defecto*/

    SKATEESVIDA
    VIDAESAMOR
    AMORESSKATE

  12. <?php
    session_save_path( "/home/public_html/mi_proyecto/controller/" ); //determina una ruta para las session (se le ingresa por parametro)
    session_start(); //error session permission denied (13) // el directorio "controller/mapa/ no tiene permisos para escribir, en consecuencia no puede crear variables de session.

  13. Muchas gracias por la información, se me presentó este problema y fue ambiguo el error que salió… el problema fue culpa completamente mía, pues creé las variables de sesión y las ligué pero nunca las cerré, pues tenía entendido que eran volátiles… puse mi web en pruebas de stress y pues llenaron la quota que tenía en la carpeta temp… después de casi un día de foros encontré esta solución.

    Saludos desde Colombia

  14. Google Chrome 29.0.1547.76 Windows 7

    Alguien me puede ayudar con este error por favor, aparece cuanado intento loguear a un usuario:

    Notice: Undefined index: permisos en C: \ wamp \ www \ Proyecto \ loginsecre.php on line 39

    Esto aparece al incluir la primeria linea del codigo que a continuacion se muestra:
    if($_SESSION[‘permisos’]==2)
    {
    echo ‘Bienvenido ‘ . $_SESSION[‘nom’] . ‘‘;
    echo ‘ ‘; //direccionamos al menu
    exit (”);
    }

  15. Hola llevo leyendo bastante sobre este error pero no consigo saber donde debo de poner el script que indicais, en que archivo se debe poner el php.
    mi error es;
    Warning: Unknown: open(/tmp/sess_955a2a0154d61c3cd188bcdc8c4ad3a4, O_RDWR) failed: No space left on device (28) in Unknown on line 0

    Warning: Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/tmp) in Unknown on line 0 – See more at: http://www.mianalisis.es/wp-admin/edit.php#sthash.juoJdBjq.dpuf

    Gracias y un saludo

  16. Hola,

    He leído el post porque tenía un problema similar. Yo soy administrador y no programador.
    Entiendo que el ‘tip’ es de programación. El ‘tip’ de sistema ¿no sería asignar permisos para el usuario a dicho directorio en cuestión?… con el ‘sticky_bit’, es decir:

    # chmod 1777 /ruta/sin/permisos/

    A mi me ha funcionado (sin tocar nada en el código PHP) aunque estoy haciendo pruebas.

    Para que quede claro, estoy haciendo una preguna, no afirmando nada 🙂

  17. muy buena información!

    yo uso wordpress asi que modifique el index.php de wordpress y le puse este codigo (obvio con su usuario)

    ini_set(‘session_save_path’, ‘../tmp’);
    session_name(‘tuusuario’);
    if(@session_start() == false){session_destroy();session_start();}

  18. Solusion

    Hola, desde Nicaragua. Estoy configurando un servidor Suse Tumbleweed con php7 para la instalacion de WordPress pero
    me encontré con el mismo error. Al igual que dani solo bastó con conceder permisos de escritura a la carpeta /var/lib/php7

    chmod 1777 /var/lib/php7

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.