Foros del Web » Programando para Internet » PHP »

Error al Cachear paginas:

Estas en el tema de Error al Cachear paginas: en el foro de PHP en Foros del Web. Hola, alguien podria decirme pq da este error en esta linea? Da el siguiente error: Warning: fopen(): open_basedir restriction in effect. File(/.html) is not within ...
  #1 (permalink)  
Antiguo 09/03/2005, 11:09
Avatar de tralara  
Fecha de Ingreso: diciembre-2003
Mensajes: 230
Antigüedad: 14 años
Puntos: 0
Error al Cachear paginas:

Hola, alguien podria decirme pq da este error en esta linea?

Da el siguiente error:
Warning: fopen(): open_basedir restriction in effect. File(/.html) is not within the allowed path(s): (/home/user/:/usr/lib/php:/usr/local/lib/php:/tmp) in /home/user/public_html/caching/caching.php on line 37

Warning: fopen(/.html): failed to open stream: Operation not permitted in /home/user/public_html/caching/caching.php on line 37

Error al intentar crear fichero.

Y en esa linea hay:
Código PHP:
 $file fopen($DIR.'/'.$HTTP_GET_VARS['articuloID'].'.html','w') or die("Error al intentar crear fichero."); 
El directorio tiene permisos de escritura! No se que puede pasar...

Gracias
  #2 (permalink)  
Antiguo 09/03/2005, 12:04
Avatar de The_omars  
Fecha de Ingreso: marzo-2004
Mensajes: 271
Antigüedad: 13 años, 9 meses
Puntos: 0
chek si realmente existe ese direcorio en esa ruta


/home/user/:/usr/lib/php:/usr/local/lib/php:/tmp
  #3 (permalink)  
Antiguo 09/03/2005, 12:15
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 6 meses
Puntos: 16
Hola,

Fijate el fichero que intenta abrir: fopen(/.html). Es decir, ni $DIR ni $HTTP_GET_VARS['articuloID'] tienen valor. Veridica que contengan valores correctos.

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #4 (permalink)  
Antiguo 09/03/2005, 12:32
Avatar de tralara  
Fecha de Ingreso: diciembre-2003
Mensajes: 230
Antigüedad: 14 años
Puntos: 0
Gracias a los dos, pero un momento:

$DIR = '/html';

y articuloID le llega por URL?articuloID=9

el directorio html existe y tiene permisos de escritura y sigue dando ese error. Mirar os pongo los dos archivos que uso a ver si veis el que!!

Código PHP:
<?php
  $tiempo 
86400;

  
// directorio donde guardar los ficheros HTML o cachés
  
$DIR '/html';  

  function 
cache_abrir() {
    global 
$tiempo,$DIR;

    if(
file_exists($DIR.'/'.$HTTP_GET_VARS['articuloID'].'.html') &&
       
time()-filemtime($DIR.'/'.$HTTP_GET_VARS['articuloID'].'.html')<$tiempo)    {

      include(
$DIR.'/'.$HTTP_GET_VARS['articuloID'].'.html');


      exit();
    }


ob_start();
  }
  
  function 
cache_guardar() {
global 
$html;

    
$html ob_get_contents();
    
    
ob_end_clean();

    
$file fopen($DIR.'/'.$HTTP_GET_VARS['articuloID'].'.html','w') or die("Error al intentar crear fichero.");

    @
fwrite($file,$html) or die ("Imposible escribir en el fichero");

    @
fclose($file);
  }

?>

Código PHP:
<?php require_once('/home/user/conexiones/conectaB.php'); ?>
<?php 
include('/home/user/public_html/caching/caching.php');?>
<?php
cache_abrir
();
ob_start();

$colname_Recordset1 "0";
if (isset(
$HTTP_GET_VARS['articuloID'])) {
  
$colname_Recordset1 = (get_magic_quotes_gpc()) ? $HTTP_GET_VARS['articuloID'] : addslashes($HTTP_GET_VARS['articuloID']);
}
mysql_select_db($database_libros$libros);
$query_Recordset1 sprintf("SELECT * FROM articulos WHERE articulos.articuloID = %s"$colname_Recordset1);
$Recordset1 mysql_query($query_Recordset1$libros) or die(mysql_error());
$row_Recordset1 mysql_fetch_assoc($Recordset1);
$totalRows_Recordset1 mysql_num_rows($Recordset1);
$html ob_get_contents();
ob_end_clean();
cache_guardar($html);
echo 
$html;
?>
Gracias
  #5 (permalink)  
Antiguo 09/03/2005, 13:34
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Pero .. ese "$DIR = '/html'; " .. ese directorio de nombre "html" .. desde donde "cuelga"? .. desde tu raiz del servidor? .. o desde el "raiz" de tu sitio

Usa:
$DIR = './html'; // con el punto .. para indicar "desde este directorio hacia abajo ..."

O bien usa $_SERVER['DOCUMENT_ROOT'] para obtener la ruta absoluta completa que se encuentra tu sitio en ese servidor.

Un saludo,
  #6 (permalink)  
Antiguo 09/03/2005, 14:21
Avatar de tralara  
Fecha de Ingreso: diciembre-2003
Mensajes: 230
Antigüedad: 14 años
Puntos: 0
bueno he hecho algunas modificaciones y ahora ya me escribe los html con el nombre del id que le llega por el url, pero no hay forma de que me lea la variable $DIR, he probado lo que dices Cluster y tampoco , entonces da el error inicial del post, solo funciona poniendo el directorio directamente en el fopen.

Ademas vereis que para que funcionara he tenido que meter la variable $id dentro de la funcion cache_guardar pq sino no llegaba la variable al fopen, eso debe ser desconocimiento mio pero estaria bien una aclaracion.

Y por ultimo la variable $html no la lee ni de coña, es la que deberia escribir en el fichero, ahora esta puesto manual para ver si escribia o no, pero iria en el fwrite.

Os pongo como esta ahora:

Archivo cacheador
Código PHP:
<?php

  $TIEMPO 
86400;

  
$dire "/html";  

  function 
cache_abrir() {
    global 
$TIEMPO,$dire;

    if(
file_exists($dire.'/'.$id.'.html') &&
       
time()-filemtime($dire.'/'.$id.'.html')<$TIEMPO)    {

      include(
$dire.'/'.$id.'.html');

      exit();
    }

ob_start();
  }
  
  function 
cache_guardar() {

global 
$html;

$id $_GET['articuloID'];

    
$html ob_get_contents();
    
    
ob_end_clean();

    
$file fopen("html/".$id.'.html','w') or die("Error al intentar crear fichero.");

    
fwrite($file,$id) or die ("Imposible escribir en el fichero");

    
fclose($file);
  }

?>
Archivo lanzador:
Código PHP:
<?php require_once('conexion'); ?>
<?php 
include('caching.php');?>
<?php
cache_abrir
();
ob_start();
$colname_Recordset1 "0";
if (isset(
$HTTP_GET_VARS['articuloID'])) {
$colname_Recordset1 = (get_magic_quotes_gpc()) ? $HTTP_GET_VARS['articuloID'] : addslashes($HTTP_GET_VARS['articuloID']);
}
mysql_select_db($database_libros$libros);
$query_Recordset1 sprintf("SELECT * FROM articulos WHERE articulos.articuloID = %s"$colname_Recordset1);
$Recordset1 mysql_query($query_Recordset1$libros) or die(mysql_error());
$row_Recordset1 mysql_fetch_assoc($Recordset1);
$totalRows_Recordset1 mysql_num_rows($Recordset1);
$html ob_get_contents();
ob_end_clean();
cache_guardar($html);
echo 
$html;
?>
Bueno saludos
  #7 (permalink)  
Antiguo 10/03/2005, 01:26
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 6 meses
Puntos: 16
Cita:
Y por ultimo la variable $html no la lee ni de coña, es la que deberia escribir en el fichero, ahora esta puesto manual para ver si escribia o no, pero iria en el fwrite.
¿En este fwrite?
Código PHP:
fwrite($file,$id) or die ("Imposible escribir en el fichero"); 
Quizas poniendo $html en lugar de $id si lo guarda. Y en este caso no seria necesario hacer el global, ya que le pasas la variable como parametro (que deberias poner en la declaracion de la funcion).
Cita:
bueno he hecho algunas modificaciones y ahora ya me escribe los html con el nombre del id que le llega por el url, pero no hay forma de que me lea la variable $DIR, he probado lo que dices Cluster y tampoco , entonces da el error inicial del post, solo funciona poniendo el directorio directamente en el fopen.
Quizas porque como $dire o $DIR estan definidos fuera de la funcion cache_guardar() y no le has puesto un global como en cache_abrir(), no puede ser accedida desde cache_guardar().

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #8 (permalink)  
Antiguo 10/03/2005, 05:49
Avatar de tralara  
Fecha de Ingreso: diciembre-2003
Mensajes: 230
Antigüedad: 14 años
Puntos: 0
Ok gracias josemi, ya lo tengo solucionado, el problema como comentabas era que no declaraba las variables globales dentro de las funciones.

Aunque tengo una duda, si esta tecnica se usa en principio para liberar al server de consultas repetidas a las bases de datos, procesos de scripts etc en paginas con trafico y asi guardar una version html de la pagina que se cargara mucho mas rapido sin tener que volver a hacer cada vez los mismos procesos, pero por otro lado eso es espacio de disco no? Y al final terminas teniendo una version entera en html de la web, lo cual va un poco en contrasentido con la idea de pagina dinamica, que precisamente gracias a la base de datos te permite tener una sola pagina donde se cargan todos los contenidos, no?

Mi base de datos ocupa unas 20Mb, "nada", pero si cada archivo html(cache) ocupa de media unas 100k y hay mas o menos 1000 paginas...

Imagino que ahora deberia montar un script que borrara aquellas caches "antiguas" de paginas menos frecuentadas pero y si todas las paginas son frecuentadas, entonces esos archivos html ocupan lo que ocupan y terminas teniendo tu pagina en vesion html!!

Por otro lado que pasa si en las paginas que cacheo estoy usando sesiones? entonces este sistema no funcionaria?

Sea como sea qui os dejo como queda:

cacheador.php
Código PHP:
<?php
$TIEMPO 
86400;
$dire "./html";
$id $_GET['articuloID'];
function 
cache_abrir() {
global 
$TIEMPO,$dire,$id;

if(
file_exists($dire.'/'.$id.'.html') &&
time()-filemtime($dire.'/'.$id.'.html')<$TIEMPO){
include(
$dire.'/'.$id.'.html');
exit();
}
ob_start();
}
function 
cache_guardar() {
global 
$html,$dire,$id;
ob_end_clean();
$file fopen($dire.'/'.$id.'.html','w') or die("Error al intentar crear fichero.");
fwrite($file,$html) or die ("Imposible escribir en el fichero");
fclose($file);
}
?>
pagina.php
Código PHP:
<?php require_once('conexion.php'); ?>
<?php
include('cacheador.php');
cache_abrir();
ob_start();
?>

/*Aqui meteis todo el contenido de la pagina que quereis cachear.php */

<?php
$html 
ob_get_contents();
ob_end_clean();
cache_guardar($html);
echo 
$html;
?>
Gracias y saludos

Última edición por tralara; 10/03/2005 a las 05:51
  #9 (permalink)  
Antiguo 10/03/2005, 07:38
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 6 meses
Puntos: 16
Este uso de caches es una solucion a unos problemas, pero no es la solucion definitiva a todos los problemas. Y luego hay que tener en cuenta que siempre hay que pagar, en este caso se paga en espacio de disco para ahorrar conexiones a la base de datos. Es cuestion de evaluar costes y beneficios.

Tampoco es necesario tener implementado este sistema para todas las paginas de tu site, es mas, para paginas que casi nunca se ven pero cambian con cierta frecuencia es casi perder recursos.

Tampoco es necesario cachear toda la pagina. Por ejemplo, puedes tener tu cabecera, pie, menu lateral en ficheros independientes, y luego usar el sistema de cache para el contenido central, y luego usar:
Código PHP:
<?php
include('cabecera.inc.php');
include(
'menu.inc.php');

// aqui va el contenido que quieres cachear
include('cacheador.php');
if (
false===($html=cache_abrir())) {
ob_start();
?>

/*Aqui meteis todo el contenido de la pagina que quereis cachear.php */

<?php
$html 
ob_get_contents();
ob_end_clean();
cache_guardar($html);
}
echo 
$html;

include(
'pie.inc.php');
?>
(por supuesto, cambiando tu cache_abrir() para que devuelva el contenido si existe la cache, o false si no existe)

Asi puedes reducir el tamaño de los ficheros de cache. Incluso si la cabecera, menu y pie son "dinamicos", los puedes cachear por separado.

Y por ultimo, si puedes propagar las sesiones, pero si quieres usar los datos de la sesion no puedes cachear esa pagina completa, solo la que no es afectada por la sesion. De igual forma que los scripts que tratan los datos enviados por formularios no pueden ser cacheados.

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:35.