05 May 2010
by Antonio Cortésin Desarrollo Tags: PHP
Mediante esta clase abstracta de php podremos crear nuestras clases simplemente extendiendo esta clase
-
abstract class Singleton {
-
-
protected function __construct() {
-
}
-
final public static function getInstance( $calledClassName = null ) {
-
static $aoInstance = array();
-
if ( $calledClassName == null ) {
-
$calledClassName = get_called_class();
-
-
}
-
if (! isset ($aoInstance[$calledClassName])) {
-
$aoInstance[$calledClassName] = new $calledClassName();
-
}
-
-
return $aoInstance[$calledClassName];
-
}
-
final private function __clone() {
-
}
-
}
Ejemplo:
-
-
class DataBase extends Singleton {
-
[…]
-
}
-
-
$db = DataBase::getInstance();
El problema que nos encontraremos en PHP 5.2.x es que no existe la función get_called_class por lo que deberemos tener esa función.
-
if(!function_exists('get_called_class')) {
-
class class_tools {
-
static $i = 0;
-
static $fl = null;
-
static function get_called_class() {
-
$bt = debug_backtrace();
-
if(self::$fl == $bt[2]['file'].$bt[2]['line']) {
-
self::$i++;
-
} else {
-
self::$i = 0;
-
self::$fl = $bt[2]['file'].$bt[2]['line'];
-
}
-
-
$lines = file($bt[2]['file']);
-
-
preg_match_all('
-
/([a-zA-Z0-9\_]+)::'.$bt[2]['function'].'/',
-
$lines[$bt[2]['line']-1],
-
$matches
-
);
-
$returnValue = $matches[1][self::$i];
-
// comprobamos si lo llamamos desde un call_user_func y similar
-
if ( empty( $returnValue ) && isset( $bt[3]['function'] ) && in_array($bt[3]['function'],array('call_user_func', 'call_user_func_array'))) {
-
$returnValue = $bt[3]['args'][0][0];
-
-
}
-
return $returnValue ;
-
}
-
}
-
function get_called_class() {
-
return class_tools::get_called_class();
-
}
-
}
Como se puede ver utiliza la funcion debug_backtrace() para determinar a que clase estamos llamando. Con esta función ya no tendremos problemas a la hora de instanciar nuestros “Singleton” en php.
Ejemplos de uso que funcionan perfectamente en PHP 5.3, y ahora en PHP 5.2
-
$objeto = DataBase::getInstance() ;
-
[…]
-
$miClase = 'DataBase';
-
$objeto = call_user_func( array( $miClase, 'getInstance'));
05 May 2010
by Antonio Cortésin Sistemas Tags: nginx, PHP, php-fpm, ubuntu
Tomada la decisión de sólo desarrollar, en el caso de PHP, para la familia 5.3 o superior. En gran medidad por todas las mejoras y cambios que aporta. Para instalarlo y ser procesado desde un servidor web nginx, este debe ser compilado como FastCGI.
La elección de php-fpm frente a la usual de php5 como fastcgi y un wrapper, es simple: Además de eliminarl el wrapper, php-fpm nos aporta muchas ventajas
Partiendo de que para esta distribución, desde los páquetes, está con la familia 5.2, el pasar a la 5.3 significa que:
a) Debemos compilarla desde las fuentes
b) Debemos instalar un nuevo repositorio donde si exista la versión 5.3.x para ubuntu.
Existe un repositorio con esta familia de php, repositorio que deberemos añadir a nuestro archivo /etc/apt/sources.list
deb http://php53.dotdeb.org stable all
Una vez esto sólo deberemos actualizar y (si no teníamos instalado anteriormente ) el php5 instalar los nuevos paquetes
En nuestro caso instalaremos el php5-fqm: Un binario de php que se ejecuta como un servicio de FastCGI, facilmente configurable y con procesos separados (si así lo queremos) por usuario, grupo, …
-
sudo apt-get install php5-fqm
Problemas:
Si queremos compilar módulos de php con pecl, necesitaremos instalar el php5-dev. La instalación de este paquete nos dará error por el paquete libtool, por lo que tendremos que hacer una instalación “peculiar”
-
#instalamos el libtool
-
sudo apt-get install libtool
-
#descargamos el paquete de php5-dev
-
cd /tmp
-
wget http://php53.dotdeb.org/dists/stable/php5/binary-i386/php5-dev_5.3.2-0.dotdeb.2_i386.deb
-
sudo dpkg –install –ignore-depends=libtool php5-dev_5.3.2-0.dotdeb.2_i386.deb
Con esto tenemos el PHP5-Dev (de la 5.3.x). Al tratar de instalar cualquier módulo nos dará problemas del tipo:
-
root@miservidor:/tmp# pecl install mongo
-
downloading mongo-1.0.7.tgz …
-
Starting to download mongo-1.0.7.tgz (53,750 bytes)
-
………….done: 53,750 bytes
-
16 source files, building
-
running: phpize
-
Configuring for:
-
PHP Api Version: 20090626
-
Zend Module Api No: 20090626
-
Zend Extension Api No: 220090626
-
configure.in:150: warning: LTOPTIONS_VERSION is m4_require'd but not m4_defun'd
-
aclocal.m4:2943: LT_INIT is expanded from…
-
aclocal.m4:2978: AC_PROG_LIBTOOL is expanded from…
-
configure.in:150: the top level
-
configure.in:150: warning: LTSUGAR_VERSION is m4_require'd but not m4_defun'd
-
configure.in:150: warning: LTVERSION_VERSION is m4_require'd but not m4_defun'd
-
configure.in:150: warning: LTOBSOLETE_VERSION is m4_require'd but not m4_defun'd
-
configure:4584: error: possibly undefined macro: m4_ifval
-
If this token and others are legitimate, please use m4_pattern_allow.
-
See the Autoconf documentation.
-
configure:7363: error: possibly undefined macro: _LT_SET_OPTIONS
-
configure:7363: error: possibly undefined macro: LT_INIT
-
ERROR: `phpize' failed
-
Esto se debe a la conf del libtool instalado (rutas y contenido), por lo que deberemos corregirlo:
-
sudo ln -s /usr/share/libtool/config/ltmain.sh /usr/share/libtool/ltmain.sh
-
sudo ln -s /usr/share/aclocal/libtool.m4 /usr/share/libtool/libtool.m4
-
cd /usr/share/aclocal
-
cp libtool.m4 libtool.m4.original
-
cat > bsolete.m4 ltoptions.m4 ltsugar.m4 ltversion.m4 >> libtool.m4
A partir de este momento ya podemos instalar cualquier módulo con pecl:
-
pecl install mongo
-
downloading mongo-1.0.7.tgz …
-
Starting to download mongo-1.0.7.tgz (53,750 bytes)
-
………….done: 53,750 bytes
-
16 source files, building
-
running: phpize
-
Configuring for:
-
PHP Api Version: 20090626
-
Zend Module Api No: 20090626
-
Zend Extension Api No: 220090626
-
[…]
-
uild process completed successfully
-
Installing '/usr/lib/php5/20090626+lfs/mongo.so'
-
install ok: channel://pecl.php.net/mongo-1.0.7
-
configuration option "php_ini" is not set to php.ini location
-
You should add "extension=mongo.so" to php.ini
03 May 2010
by Antonio Cortésin Desarrollo Tags: PHP, templates, twig
Siempre he sido muy receloso a la hora de utilizar un sistema de plantillas para PHP, pero la llegada de Twig ha sido todo un acontecimiento.
Con un desarrollo límpio y optimizado Fabien Potencier, el creador de Symfony ha creado un sistema en el que las plantillas están 100% libres de código (PHP) y siguen la fabulosa sintaxis de las plantillas de Django. El resultado es un sistema potente y optimizado, ya que genera unas versiones en php de las plantillas con un código para quitarse el sombrero.
Aun estoy arañando la superficie de esta maravilla, pero con la creación de filtros, y añadiendo nuevas funcionalidades en breve tendremos una versión remozada (internamente) de SevillaPress.
03 Abr 2010
by Antonio Cortésin Personal Tags: diseño
Ya tocaba cambiar un poco mi web.
Poco a poco irá cogiendo forma, y en ella iré poniendo todos los proyectos en los que trabajo, mi portfolio, y mi colección de código que he ido creando o recopilando en los últimos años, que no son pocos.
03 Abr 2010
by Antonio Cortésin Portfolio
Web desarrollada sobre Wordpress.
Plantilla propia.
Url: http://www.pontecesures.net