JpGraph Error 25128 Error en la función imageantialias de la libreria PHP GD

Estaba probando la librería JpGraph en un flamante Ubuntu 11.04, pero el problema es que la versión de PHP es la más nueva 5.3.3 y muchas funciones ya fueron depreciadas o por el tipo de instalación no están disponibles, como es el caso de la función imageantialias y pues nos lanza el error 25128

Lo que se debe hacer de forma rápida sin andar compilando el PHP-GD desde las sources, es comentar la linea de gd_image.inc.php

JpGraphError::RaiseL(25128);//(‘The function imageantialias() is not available in your PHP installation. Use the GD version that comes with PHP and not the standalone version.’)

Y listo! ya funciona otra vez la librería, sin antialias claro, pero funciona 🙂

mcrypt: Error al cargar el modulo php_mcrypt en windows

Estoy utilizando Ushahidi en un servidor apache-php5 en windows, con AppServ, el problema esta que me dice que requiere la libreria php_mcrypt para funcionar, y pues entro a php.ini, busco la linea donde dice: extension=php_mcrypt.dll y descomento la linea, reinicio el servicio con apache_servicefix.bat dentro de la carpeta c:/AppServ/Apache2.2/ pero el problema sigue.

Revisando el log de apache veo el siguiente error:

PHP Warning: PHP Startup: Unable to load dynamic library ‘C:/AppServ\\php5\\ext\\php_mcrypt.dll’ – No se puede encontrar el m\xf3dulo especificado.\r\n in Unknown on line 0

La solución esta en copiar el archivo libmcrypt.dll que esta dentro de c:/appserv/php5/libmcrypt.dll a c:/AppServ/Apache2.2/bin/ reiniciar el servicio y listo!.., ya tenemos correctamente instalada la libreria MCrypt de PHP

Apache: 403 Forbidden con Codeigniter

Siguiendo con el error 403 Forbidden en Apache con Codeigniter pues busqué y busqué la solución, ya que la que habia investigado antes pues era temporal, y despues de navegar por X número de páginas zaaas, vuelve a salir el error 403.

La solución sigue estando en la configuración de Apache2.0 y el módulo rewrite, primero modificamos el archivo en /etc/apache2/sites-enabled/000-default (u otro parecido)

< Directory />
Options FollowSymLinks SymLinksIfOwnerMatch
AllowOverride FileInfo
< /Directory>

Y despues en el .htaccess, o lo pueden poner en el otro archivo la siguiente info:

< IfModule mod_mime.c>
AddType text/html;charset=UTF-8 .html
< /IfModule>

< IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

#Removes access to the system folder by users.
#Additionally this will allow you to create a System.php controller,
#previously this would not have been possible.
#’system’ can be replaced if you have renamed your system folder.
RewriteCond %{REQUEST_URI} ^system.*
RewriteRule ^(.*)$ /index.php?/$1 [L]

#When your application folder isn’t in the system folder
#This snippet prevents user access to the application folder
#Submitted by: Fabdrol
#Rename ‘application’ to your applications folder name.
RewriteCond %{REQUEST_URI} ^application.*
RewriteRule ^(.*)$ /index.php?/$1 [L]

#Checks to see if the user is attempting to access a valid file,
#such as an image or css document, if this isn’t true it sends the
#request to index.php

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteCond %{REQUEST_URI} !^(/index\.php|/img|/js|/css|/kml|/robots\.txt|/favicon\.ico)

RewriteRule ^(.*)$ /index.php/$1 [L]
< /IfModule>

< IfModule !mod_rewrite.c>
# If we don’t have mod_rewrite installed, all 404’s
# can be sent to index.php, and everything works as normal.
# Submitted by: ElliotHaughin

ErrorDocument 404 /index.php
< /IfModule>

Donde dice UTF8 es para que todas las páginas HTML las mande con ese encoding, y la parte que creo es importante es donde se filtra el js, css, pero bueno!, ya con eso funciona bien el codeigniter y sin errores 403 forbidden.

application/javascript (NS_ERROR_DOM_BAD_URI)

Si estas utilizando llamadas Ajax desde tu página web a dominios externos y te aparece el error NS_ERROR_DOM_BAD_URI en la extensión HttpFox de Firefox la solución es solicitar la página mediante JSON, si usas JQuery seria en teoría algo así:

$.getJSON(“http://dominioExterno.com/pagina”,function(result){

});

Pero nooooo! el error sigue apareciendo, entonces la solución correcta sería agregar un parametro X con valor = ?., en este caso le llamamos jsoncallback=? en español quedaría algo así:

$.getJSON(“http://dominioExterno.com/pagina?jsoncallback=?”,function(result){

});

Ahora ocupas moverle al servidor algunos parametrillos para que te regrese correctamente el JSON, si usas PHP puedes poner este código:

function generate_jsonp($data) {
if (preg_match(‘/\W/’, $_GET[‘jsoncallback’])) {
// if $_GET[‘jsoncallback’] contains a non-word character,
// this could be an XSS attack.
header(‘HTTP/1.1 400 Bad Request’);
exit();
}
header(‘Content-type: application/json; charset=utf-8’);
print sprintf(‘%s(%s);’, $_GET[‘jsoncallback’], json_encode($data));
}

Con esto evitas ataques XSS y te regresa tu JSON en una función tal y como te la mande getJSON, solo es cosa de enviar un arreglo a la función generate_jsonp

Y listo!.., ya debe de jalar la solicitud externa.

Aca algo de documentación para usar JSONP de forma segura: http://www.metaltoad.com/blog/using-jsonp-safely

PHP: la función imagefilter no es reconocida en PHP5

Estaba probando la creación de mapas de calor (heat map) con PHP y en mi maquina local todo funciona correcto para al pasarla al servidor saaz, error de PHP.

Fatal error: Call to undefined function imagefilter()

revisando la documentación de la función imagefilter dice que viene en la librería GD y PHP5, los 2 programas ya los tenia instalados, pero aún así no reconocía la función, e investigando dice que se ocupa instalar la libreria PHP5-GD Bundled (embedida o empaquetada), ya que la versión original fue desarrollada por Boutell.

Ahora al grano! a instalar la nueva librería, para eso la vamos a compilar todo a mano, jejeje:

apt-get update
apt-get install build-essential debhelper fakeroot
cd /usr/src
apt-get source php5
apt-get build-dep php5
cd php5-5.2.4

Recuerden cambiar la versión del PHP descargada, despues a modificar el archivo debian/rules

nano ./debian/rules

Buscamos la línea que diga:

–with-gd=shared,/usr –enable-gd-native-ttf \

Y la cambiamos por esta:

–with-gd=shared –enable-gd-native-ttf \

Ahora viene la parte tardadaaaaaa!!! a compilar todo,

dpkg-buildpackage -rfakeroot
cd ..
apt-get remove php5-gd
dpkg -i php5-gd_5.2.4-2ubuntu5.14_i386.deb

Reiniciamos apache y listo! la librería php5-gd debe de quedar OK!..

/etc/init.d/apache2 restart

Aca una imagen de como quedo el mapa de calor:

Codeigniter: Modificar LIMIT para el driver MSSQL

Después de encontrar la solución para que funcione el LIMIT de MySQL en Microsoft SQL Server ahora sigue el turno de modificar el código de Codeigniter para así tener algo transparente para nuestras consultas SQL.

Lo primero que se debe de hacer es modificar la librería de carga del Codeigniter, ( $this->load-> )
Vamos a trabajar en la carpeta: /system/application/libraries/ y creamos un archivo llamado: MY_Loader.php con el siguiente código:

< ?php class MY_Loader extends CI_Loader{ / * Constructor, calls parent constructor. */ function MY_Loader() { parent::CI_Loader(); } / * Database Loader * * @access public * @param string the DB credentials * @param bool whether to return the DB object * @param bool whether to enable active record (this allows us to override the config setting) * @return object */ function database($params = '', $return = FALSE, $active_record = FALSE) { // Do we even need to load the database class? if (class_exists('CI_DB') AND $return == FALSE AND $active_record == FALSE) { return FALSE; } require_once(BASEPATH.'database/DB'.EXT); // Load the DB class $db =& DB($params, $active_record); $my_driver = config_item('subclass_prefix').'DB_'.$db->dbdriver.’_driver’;
$my_driver_file = APPPATH.’libraries/’.$my_driver.EXT;

if (file_exists($my_driver_file))
{
require_once($my_driver_file);
$db =& new $my_driver(get_object_vars($db));
}

if ($return === TRUE)
{
return $db;
}
// Grab the super object
$CI =& get_instance();

// Initialize the db variable. Needed to prevent
// reference errors with some configurations
$CI->db = ”;
$CI->db = $db;
// Assign the DB object to any existing models
$this->_ci_assign_to_models();
}

}

La idea de este archivo es extender la funcionalidad de carga de los drivers para la base de datos, despues en la misma carpeta de libraries creamos un archivo llamado: MY_DB_mssql_driver.php ya que estamos usando el driver mssql para nuestra conexión SQL Server

< ?php class MY_DB_mssql_driver extends CI_DB_mssql_driver { function __construct($params){ parent::__construct($params); log_message('debug', 'Extended DB driver class instantiated!'); } function _limit($sql, $limit, $offset){ if($offset == 0){ return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$limit.' ', $sql); }else{ $OrderBy = "ORDER BY "; if (count($this->ar_orderby) > 0){
$OrderBy .= implode(‘, ‘, $this->ar_orderby);

if ($this->ar_order !== FALSE)
{
$OrderBy .= ($this->ar_order == ‘desc’) ? ‘ DESC’ : ‘ ASC’;
}
}else{
$OrderBy .= “(SELECT 1)”;
}

$sql = preg_replace(‘/(\\’. $OrderBy .’\n?)/i’,”, $sql);
$sql = preg_replace(‘/(^\SELECT (DISTINCT)?)/i’,’\\1 ROW_NUMBER() OVER (‘.$OrderBy.’) AS rownum, ‘, $sql);
return “SELECT * \nFROM (\n” . $sql . “) AS A \nWHERE A.rownum BETWEEN (” .($offset + 1) . “) AND (“.($offset + $limit).”)”;
}
}

Y listo! con esto nuestra consulta LIMIT será transparente y se usará como siempre: $this->db->limit(2,10);

Aca les dejo las fuentes de esta información:

Solución: Error 504 Gateway Timeout – Cherokee PHP

Después de varios problemas con el mentado error 504 Gateway Timeout y algunas soluciones temporales como matar procesos de PHP CGI por fin he dado con la solución (por lo menos lleva semanas sin fallar).

Efectivamente el error es provocado por el interprete de PHP-CGI ya que tenia poco tiempo para procesar la solicitud y pues a veces se quedaba colgado el proceso.

Antes que nada tenemos que verificar que este correctamente configurado el interprete de PHP para FastCGI (PHP_FCGI), entramos al panel de control con el comando cherokee-admin y despues nos dirigimos a Origenes > PHP

Y verificamos que este en conexión: 127.0.0.1:47990 (el puerto pueden ponerle cualquiera que este libre)
Y también en interprete: /usr/bin/php-cgi -b 127.0.0.1:47990

Despues nos vamos a donde se especifica el tiempo máximo para cada respuesta del PHP FCGI, para eso nos pasamos a la consola y como root nos metemos al archivo /etc/cherokee/cherokee.conf

Y agregamos/modificamos el siguiente parámetro: PHP_FCGI_MAX_REQUESTS = 300

source!1!env!PHP_FCGI_CHILDREN = 5
source!1!env!PHP_FCGI_MAX_REQUESTS = 300
source!1!env_inherited = 1
source!1!host = 127.0.0.1:47990
source!1!interpreter = /usr/bin/php-cgi -b 127.0.0.1:47990
source!1!nick = PHP Interpreter
source!1!type = interpreter

Recordemos que si tenemos varios interpretes puede cambiar el parámetro después de source! por algún otro número.

Y listo! reiniciamos cherokee y en teoría no debería de fallar.

Cherokee-PHP: Error 504 Gateway Timeout

Por alguna extraña razón en el servidor web Cherokee, de repente sin motivo aparente empezaron a aparecer errores 504 Gateway Timeout en todas las páginas terminadas con extensión .PHP, las .HTML si se ven correctamente, entonces el error debe de estar en la configuración o proceso de PHP5.

Antes de mover la configuración (porque todo funcionaba bien antes), decidi matar los procesos de PHP,

con el ps -ax revise que existieron procesos de PHP:

2658 ? S 0:07 /usr/bin/php-cgi -b 127.0.0.1:47990
6592 ? Ss 0:06 /usr/sbin/sshd
11296 ? S 0:01 /usr/bin/php-cgi -b 127.0.0.1:47990
14097 ? S 0:17 /usr/bin/php-cgi -b 127.0.0.1:47990

Y bueno, a proceder con la eliminación de los mismos, pero para no irme de proceso en proceso pues elimino todos los que tengan la palabra php y despues reinicio cherokee webserver.

pkill -9 php
/etc/init.d/cherokee restart

Y voalaaa!, ahora ya funcionan bien las páginas!…, solo falta ver, el porque de esta falla para que no vuelva a suceder.

PHP: Problemas con la libreria CURL en Mac OSX

He estado implemtando algunas funciones con curl desde PHP, pero misteriosamente dejo de funcionar la libreria CURL y PHP me lanzaba el siguiente error:

PHP Fatal error: Call to undefined function curl_init()

Entonces lo más seguro es que la libreria curl no este instalada, pero revisando el phpinfo(); si aparece la referencia para cargar curl.so

Additional .ini files parsed /opt/local/var/db/php5/calendar.ini, /opt/local/var/db/php5/curl.ini, /opt/local/var/db/php5/ftp.ini, /opt/local/var/db/php5/gd.ini, /opt/local/var/db/php5/http.ini, /opt/local/var/db/php5/iconv.ini, /opt/local/var/db/php5/imap.ini, /opt/local/var/db/php5/mbstring.ini, /opt/local/var/db/php5/mcrypt.ini, /opt/local/var/db/php5/memcache.ini, /opt/local/var/db/php5/mssql.ini, /opt/local/var/db/php5/mysql.ini, /opt/local/var/db/php5/openssl.ini, /opt/local/var/db/php5/pcntl.ini, /opt/local/var/db/php5/soap.ini, /opt/local/var/db/php5/sockets.ini, /opt/local/var/db/php5/xdebug.ini, /opt/local/var/db/php5/xsl.ini, /opt/local/var/db/php5/zip.ini

Pero más abajo donde esta la información de los modulos pues nada de nada!, entonces opte por reinstalar la libreria.

Primero actualizo el repositorio del port (aca una guía para instalar port en tu Mac)

sudo port selfupdate

Y despues ya la instalación de la liberia php5-curl

sudo port install php5-curl

Reinicio el apache:

sh /opt/local/etc/LaunchDaemons/org.macports.apache2/apache2.wrapper restart

Y nada de nada!, el mismo error, entonces pues a ver los logs de apache para ver que esta sucediendo con el mentado modulo!.. ,y oooh sorpresa, error de dependencias, entonces a buscarlas., y resulta que tengo una versión más nueva de la que me esta solicitando PHP.

Aca el log de apache2: cat /opt/local/apache2/logs/error_log

Warning: PHP Startup: Unable to load dynamic library ‘/opt/local/lib/php/extensions/no-debug-non-zts-20090626/curl.so’ – dlopen(/opt/local/lib/php/extensions/no-debug-non-zts-20090626/curl.so, 9): Library not loaded: /opt/local/lib/libssl.0.9.8.dylib
Referenced from: /opt/local/lib/php/extensions/no-debug-non-zts-20090626/curl.so
Reason: image not found in Unknown on line 0

Warning: PHP Startup: Unable to load dynamic library ‘/opt/local/lib/php/extensions/no-debug-non-zts-20090626/curl.so’ – dlopen(/opt/local/lib/php/extensions/no-debug-non-zts-20090626/curl.so, 9): Library not loaded: /opt/local/lib/libcrypto.0.9.8.dylib
Referenced from: /opt/local/lib/php/extensions/no-debug-non-zts-20090626/curl.so
Reason: image not found in Unknown on line 0

De hecho varias liberias (http.so, ftp.so, openssl.so, imap.so) que necesitan libssl marcaban el mismo error y pues a crear los enlaces simbolicos.

cd /opt/local/lib/
ln -s libssl.dylib libssl.0.9.8.dylib
ln -s libcrypto.dylib libcrypto.0.9.8.dylib

Reiniciamos Apache y listo!!.., todo arreglado!. =)

SQLServer y PHP: Error con Heterogeneous queries require the ANSI_NULLS and ANSI_WARNINGS

Al conectarme a una vista de MS SQLServer desde PHP, me aparecio el siguiente error en el log del codeigniter:

message: Heterogeneous queries require the ANSI_NULLS and ANSI_WARNINGS options to be set for the connection. This ensures consistent query semantics. Enable these options and then reissue your query. (severity 16)

Y pues la consulta SQL no se ejecuta., la solución es ejecutar antes las siguientes consultas SQL:

SET ANSI_WARNINGS ON
SET ANSI_NULLS ON

Y despues ya ejecutar su consulta normal, digamos que en codeigniter tendriamos algo asi:

$this->db->query('SET ANSI_WARNINGS ON');
$this->db->query('SET ANSI_NULLS ON');

Y listo! asunto arreglado 🙂

Aca una explicación en ingles desde la página de Microsoft