entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Fatal error: Allowed memory size of 134217728 bytes exhausted

despues de pasar todo una temporada debugeando mi codigo me encuentro con el siguiente error Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 1792 bytes) in F:\xamp\htdocs\local\demo\avanzado\sistema\model\verificador.php on line 15

en mi pregunta anterior tuve algunos problemas con mi servidor y con las rutas que pude corregir pero ahora surgio un nuevo problema, despues de pasar los datos para logear este debe ser procesado por un verificador que devolveria un mensaje de respuesta.

a continuacion dejo el codigo fuente de cada archivo involucrado

<?php
**index.php ubicado en esta ruta -> local/demo/avanzado/sistema/controller**
$ruta_conexion = "http://localhost/modulos/conexion.php"; 

$ruta_formulario  ="http://localhost/demo/avanzado/sistema/model/inicio.php";

include($ruta_conexion);

include($ruta_formulario);

?>
<?php

**este archivo esta en esta ruta -> http://localhost/modulos/conexion.php**
$server = "localhost";
$username = "root";
$db ="test";
$conex = mysql_connect($server, $username, "");

mysql_select_db($db, $conex) or die ("Error: No se puede usar la base de datos. ".mysql_error());
echo "<h2>conexion exitosa</h2>";

?>

**esto esta en ->  http://localhost/demo/avanzado/sistema/model/inicio.php **

<body style="background-color: darkblue; color:skyblue; font-weight: bold;">
  <form name="login" method="post" action="../model/verificador.php" enctype="multipart/form-data">

    <input type="text" name="uname" placeholder="email">
    <input type="password" name="password" placeholder="password">
    <input type="submit" name="login" value="accedi"><br>
<hr>
    <input name="uname" type="text" placeholder="nome">
     <input name="email" type="email" placeholder="email">
    <input name="pass" type="password" placeholder="password">
 <input type="submit" name="register" formaction="../model/register.php" value="invia">
<hr>
  </form>
</body>

luego tenemos a los archivos de procesamiento el registrador y el verificador


**esto esta en la misma carpeta del archivo inicio osea en la carpeta model**

<body style="background-color: darkblue; color:skyblue; font-weight: bold;">

<?php

$uname    =    $_POST['uname'];
$pw       =    $_POST['pass'];
$email    =    $_POST['email'];

$table = "users";

require("../model/conexion.php");

/* los siguientes lineas impide repetir registrar al mismo usuario */

$comando   = "SELECT * FROM $table WHERE email ='$email' AND name ='$uname' ";

$consulta = mysql_query($comando) or die ("Error en la query: ".mysql_error());

$verificador = mysql_num_rows($consulta) ;

echo $verificador;
if ($verificador > 1)
    { 
      echo "<h1>esta email no puede ser reutilizada</h1>";
    }

/* la siguente condicion registra un nuevo usuario */
else
  {
   $sql = "INSERT INTO $table (id, name, email, password) VALUES (id, '$uname', '$email', '$pw')";

  $insertar = mysql_query($sql) or die ("Error en la query: ".mysql_error());
    echo "register succesfily!";

  }

mysql_close($conex);
?>

por ultimo esta el archivo que causa problemas

<body style="background-color: darkblue; color:skyblue; font-weight: bold;">

<?php

$uname = $_POST['uname'];
$pw = $_POST['password'];
$email = $_POST['email'];

require("../model/verificador.php"); //linea 15

$comando = "SELECT * FROM users WHERE email ='$email' AND password ='$pw' ";

$consulta = mysql_query($comando) or die ("Error en la query: ".mysql_error());
echo "verifica realizada";

mysql_close($conex);

?>

1 Respuesta

2votos

Leonardo-Tadei Puntos227320

Hola @steven,

el archivo /model/verificador.php se está incluyendo a sí mismo en la línea 15 con el require("../model/verificador.php");

Eso es un bucle infinito, y por eso PHP aborta la ejecución cuando no le alcanza la memoria asignada. Ampliar la memoria no resuelve el problema, porque un bucle infinito necesitará infinita memoria e infinito tiempo para ejecutarse.

Saludos cordiales

0voto

steven comentado

muchas gracias @Leonardo-Tadei no se porque razon despues de ver mi codigo un millon de veces no me percate de ese error.

creo que la comunidad de php deberian empeñarse un poco mas en crear mensajes mas directos porque a simple vista no se diria que fuese un error infinito aunque pueda ser logico plantearselo.

0voto

magarzon comentado

Tienes el método require_once, que te impide incluir un fichero más de una vez

0voto

Leonardo-Tadei comentado

Hola @steven,

la comunidad PHP no mejora los mensajes de error de este tipo, como tampoco lo hace la comunidad o empresa que desarrolle cualquier otro lenguaje de programación, justamente porque la Teoría de Computación dice que es imposible determinar a priori si un programa va a entrar en un bucle infinito o no.

Los programadores nos damos cuenta que los programas entran en bucles infinitos porque la PC se cuelga o porque, en entornos más robustos, el programa de aborta por falta de RAM o por exceso de CPU.

La solución que te propone @magarzon de formar a que el archivo se incluya solo una vez evitará esta situación, pero yo creo que esa línea sobra: qué sentido tiene que el archivo verificador.php se incluya a sí mismo?

Saludos cordiales.

0voto

magarzon comentado

No sí, claro que la línea sobra, pero si se acostumbra a usar los métodos _once, evitará este tipo de problemas, porque la siguiente vez será una referencia circular y no lo podrá ver de forma tan sencilla, si ni ha visto esta

0voto

Leonardo-Tadei comentado

Lo que pasa es que las llamadas _once son costosas, porque el intérprete va armando una tabla de llamadas y la compara cada vez que se va a hacer una inclusión... son una de las mayores causas de la baja performance de las aplicaciones PHP.

Son muy útiles para ciertos casos, pero no es la idea usarlas solo para no mejorar las habilidades como programador... pero tampoco son la muerte de nadie en una sitio usado por 5 personas en el mundo... en fin.

1voto

magarzon comentado

Bueno, en realidad no son tan costosas, sobre todo si solo vas a usar dos o tres, de hecho yo he visto benchmarks que en ciertas situaciones dan mejor performance que los require/include normales, y también hay maneras de mejorar esa performance, por ejemplo usando opcode caches como APC (y es posible que el opcache de PHP7 también mejore esto)

De todas formas, en proyectos "profesionales" lo que se usa son autoloaders (pero mejor no liemos a nuestro amigo @steven con esto)

0voto

steven comentado

chicos debo admitir que seguir el hilo de la discusion es un poquito dificil de entender creo que yo no me haria tantos problemas en usar un comando u otro si el fin es el mismo despues de todo creo que no es tan problematico consumir un poco mas de memoria sabiendo que hoy en dia los servidores son mas potentes.

sabes que con tantos comandos que hay para php es dificil estudiarlos todos y aplicarlos a casos especificos sin embargo mientras programaba me encontre con algunas sentencias que me parecian utiles por ejemplo si tengo todos los archvos que quiero incluir en una carpeta no tengo que hacer varios include para cada archivo por lo que lo ideal sera incluir directo la carpeta para esto he visto que existe un comando el include_path , lo he probado pero no me funciona pero a mi se me ha ocurrido hacerlo de otra manera con un ciclo while, todavia no lo he probado pero es esto lo que deberia de hacer
1.definimos la ruta que contiene los archivos a incluir
2.construimos un ciclo que itere sobre los include de esta forma
include("$ruta/while")
no se si vendria mejor con un for o while

0voto

steven comentado

estimado @Leonardo-Tadei y @magarzon todavia tengo un problema con las rutas absolutas no se porque razon no funcionan

**

conexion exitosa(este mensaje es devuelto por la conexion
el archivo esta ubicado en F:\xamp\htdocs\local\modulos\conexion.php
)

el error es el siguiente

Warning: mysql_query(): Access denied for user ''@'localhost' (using password: NO) in F:\xamp\htdocs\local\demo\avanzado\sistema\model\verificador.php on line 24

Warning: mysql_query(): A link to the server could not be established in F:\xamp\htdocs\local\demo\avanzado\sistema\model\verificador.php on line 24
Error en la query: Access denied for user ''@'localhost' (using password: NO)**

este es el codigo modificado de mi script verificador

<body style="background-color: darkblue; color:skyblue; font-weight: bold;">

<?php

$uname = $_POST['uname'];
$pw = $_POST['password'];
$email = $_POST['email'];

$ruta_conexion = "http://localhost/modulos/conexion.php"; 
require($ruta_conexion);

// require("../model/conexion.php"); // esto si funciona

$comando = "SELECT * FROM users WHERE email ='$email' AND password ='$pw' ";

$consulta = mysql_query($comando) or die ("Error en la query: ".mysql_error()); // esta es la linea que genera el error
echo "verifica realizada";

mysql_close($conex);

?>

tampoco funciona el otro script para la registracion
tengo el mismo error en la linea 20

<body style="background-color: darkblue; color:skyblue; font-weight: bold;">

<?php

$uname    =    $_POST['uname'];
$pw       =    $_POST['pass'];
$email    =    $_POST['email'];
// $telefono =    $_POST['telefono'];
$ruta_conexion = "http://localhost/modulos/conexion.php"; 

$table = "users";

require("$ruta_conexion");

/* los siguientes lineas impide repetir registrar al mismo usuario */

$comando   = "SELECT * FROM $table WHERE email ='$email' AND name ='$uname' ";

$consulta = mysql_query($comando) or die ("Error en la query: ".mysql_error()); // linea 20

$verificador = mysql_num_rows($consulta) ;

// echo $verificador;
if ($verificador > 1)
    { 
      echo "<h1>esta email no puede ser reutilizada</h1>";
    }

/* la siguente condicion registra un nuevo usuario */
else
  {
   $sql = "INSERT INTO $table (id, name, email, password) VALUES (id, '$uname', '$email', '$pw')";

  $insertar = mysql_query($sql) or die ("Error en la query: ".mysql_error());
    echo "register succesfily!";

  }

mysql_close($conex);
?>

1voto

Leonardo-Tadei comentado

Esto es otro tema.
Abrí otra pregunta por favor.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta