Escrito el 30/January/2008 por juan_belon
A veces deberemos hacer más consultas que procesamiento y otras veces es al revés, por eso debemos conocer los mecanismos equivalentes como instrucciones tanto para PHP como para mySQL o cualquier otro motor de base de datos.
Ejemplo, si necesitamos construir una tabla, un listado que extraemos de una serie de tuplas de una consulta de la base de datos ,pero sólo queremos mostrar del campo título ,digamos unos 20 ó 30 caracteres, en lugar de seleccionar todas las tuplas que podrían ser miles, y tienen cada una 250…y después recortar la cadena con substr() de PHP, lo que hacemos es seleccionar sólo esos 20 ó 30 caracteres desde la base de datos con una instrucción mejorada de mySQL: "SELECT SUBSTRING(campo, 1,20) as campo from tabla" o bien SELECT SUBSTRING(campo, 1,30) o cualquier otra subcadena, recortando el texto en el motor de base de datos lo hace más eficiente y carga menos el buffer. Observar que se empieza con 1 y no con 0 (por si os da quebraderos de cabeza…)
Saludos de un programador PHP.
(keep up the good code!!=)
Escrito el 25/January/2008 por juan_belon
PHP ofrece una extensión para usar el sistema de memoria de System V de S.O. tipo Unix, GNU/Linux, Solaris, etc a través de llamadas al sistema ,estamos hablando de semáforos.
La memoria compartida es memoria virtual compartida por procesos separados. Ayuda a solventar problemas de comunicación entre procesos ejecutándose en la misma máquina. Un método obvio debería ser escribir información en un fichero, pero el acceso a un medio permanente es relativamente lento. La memoria compartida permite la creación de memoria de sistema que pueda ser accedida por múltiples procesos, lo que es mucho más rápido. Como el uso exclusivo de la memoria es esencial, se debe usar un orden de bloqueo. Esto se suele hacer con semáforos. Si se usan las funciones de memoria compartida primero tenemos que asegurarnos de que se incluye el soporte de semáforos de System V.
Una discusión completa del uso de las funciones de memoria compartida se encuentra en http://www.whatis.com
La función integer_shm_attach(integer key, integer size, integer permissions) fue añadida por Christian Cartus. (thank you)
Un ejemplo:
<?php
/**
* Este ejemplo usa un semáforo para usar la
* memoria compartida para comunicarse
* entre múltiples procesos.
* Para liberar la memoria creada se debe
* de usar shm_remove
*/
//definir las llaves enteras de los semáforos
define(‘SEM_GRANADA_PHP',1970);
// la memoria compartida (MC):
define(‘MC_GRANADA_PHP',1970);
//llave para la variable:
define(‘MC_MENSAJE',1970);
//Obtener o crear el semáforo
$sem = sem_get(SEM_GRANADA_PHP,1);
//sólo se puede obtener una vez:
if (sem_acquire($sem))
{
//asociar a la memoria:
$mem = shm_attach(MC_GRANADA_PHP,1024);
//Hacemos que entre en un KiloByte.
//Obtenemos el mensaje:
if ($anterior_mensaje = shm_get_var($mem, MC_MENSAJE)){
echo "Valor anterior: $anterior_mensaje <br>\n";
}
//crear nuevo mensaje:
$nuevo_mensaje = getmypid()." aqui a las ".microtime();
//poner el nuevo valor:
shm_put_var($mem, MC_MENSAJE, $nuevo_valor);
//desasociar de la memoria compartida:
shm_detach($mem);
//liberar el semáforo:
sem_release($sem);
}
else {
echo "No se pudo obtener el semáforo!";
}
?>
shm_remove:
<?php
//Con las mismas constantes
//obtenemos el semáforo:
$sem = sem_get(SEM_GRANADA_PHP, 1);
if (sem_acquire($sem)){
//añadir a la memoria compartida
$mem = shm_attach($mem, MC_MENSAJE);
//quitar la memoria compartida:
shm_remove($mem);
//borrar el semáforo:
sem_release($sem);
} else {
echo "No se pudo obtener el semáforo!";
}
?>
Escrito el 09/January/2008 por juan_belon
La versión más resumida que he podido crear de la función:
<?php
/**
* Calcula la diferencia entre dos fechas y devuelve el número de dias resultante:
* Pasar las fechas como cadenas en el formato: date('d/m/Y')
*
* @param str $fecha_ini
* @param str $fecha_fin
* @return str
*/
function zen_comparaFechas ($fecha_ini, $fecha_fin){
//Inicialización
$matriz_f_ini = explode ("/", $fecha_ini);
$matriz_f_fin = explode ("/", $fecha_fin);
//Cálculo
return gregoriantojd($matriz_f_fin[1], $matriz_f_fin[0], $matriz_f_fin[2]) - gregoriantojd($matriz_f_ini[1], $matriz_f_ini[0], $matriz_f_ini[2]);
}
?>