# rm-rf.es

Información sobre PHP desde línea de comandos

A través de la línea de comandos podemos averiguar información relativa a PHP muy interesante, como por ejemplo:

Versión de PHP instalada:

$ php -v

PHP 5.X.X (cli) (built: Jun 18 2009 18:16:19)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2009 Zend Technologies
    with Zend Extension Manager vX.X.X, Copyright (c) 2003-2007, by Zend Technologies
    with Zend Optimizer vX.X.X, Copyright (c) 1998-2007, by Zend Technologies

Módulos de PHP instalados/compilados:

$ php -m
[PHP Modules]
bcmath
calendar
ctype
curl
date
dom
filter
ftp
gd
...
...
...
[Zend Modules]
Zend Extension Manager
Zend Optimizer

Información general PHP:

La salida de este comando es la misma que <? phpinfo() ?> en un script php.

$ php -i
phpinfo()
PHP Version => 5.X.X

System => Linux  #1 SMP Thu May 7 10:39:21 EDT 2009 iX86
Build Date => Jun 18 2009 18:14:47
Configure Command =>  './configure'  '--disable-pdo' '--enable-bcmath' '--enable-calendar' '--enable-ftp' '--enable-gd-native-ttf' '--enable-libxml' '--enable-magic-quotes' '--enable
-mbstring' '--enable-sockets' '--enable-zip' '--prefix=/usr/local' '--with-apxs2=/usr/local/apache/bin/apxs' '--with-curl=/opt/curlssl/' '--with-freetype-dir=/usr' '--with-gd' '--wit
Server API => Command Line Interface
Virtual Directory Support => disabled
....
....
....
This program makes use of the Zend Scripting Language Engine:
Zend Engine vX.X.X, Copyright (c) 1998-2009 Zend Technologies
    with Zend Extension Manager v1.2.2, Copyright (c) 2003-2007, by Zend Technologies
    with Zend Optimizer vX.X.X, Copyright (c) 1998-2007, by Zend Technologies
....
....
....

Mostrar ficheros de configuración cargados y sus rutas:

$ php --ini

Configuration File (php.ini) Path: /xxx/xxx/xx
Loaded Configuration File:         /xxx/xxx/xxx/php.ini
Scan for additional .ini files in: (none)
Additional .ini files parsed:      (none)

Mostrar configuración de un módulo/extensión instalado:

La sintaxis es php –ri módulo

$ php --ri openssl
openssl

OpenSSL support => enabled
OpenSSL Version => OpenSSL X.X.Xe-fips-xxx 01 Jul 2008

Mostrar información de un módulo/extensión instalado:

La sintaxis es php –re módulo

$ php --re openssl
Extension [
 extension #35 openssl version  ] {

  - Constants [36] {
    Constant [ string OPENSSL_VERSION_TEXT ] { OpenSSL X.X.Xe-fips-xxx 01 Jul 2008 }
    Constant [ integer OPENSSL_VERSION_NUMBER ] { 9469999 }
    Constant [ integer X509_PURPOSE_SSL_CLIENT ] { 1 }
    Constant [ integer X509_PURPOSE_SSL_SERVER ] { 2 }
    Constant [ integer X509_PURPOSE_NS_SSL_SERVER ] { 3 }
    Constant [ integer X509_PURPOSE_SMIME_SIGN ] { 4 }
    Constant [ integer X509_PURPOSE_SMIME_ENCRYPT ] { 5 }
    Constant [ integer X509_PURPOSE_CRL_SIGN ] { 6 }
    Constant [ integer X509_PURPOSE_ANY ] { 7 }
    Constant [ integer OPENSSL_ALGO_SHA1 ] { 1 }
    Constant [ integer OPENSSL_ALGO_MD5 ] { 2 }
    Constant [ integer OPENSSL_ALGO_MD4 ] { 3 }
    Constant [ integer OPENSSL_ALGO_MD2 ] { 4 }
    Constant [ integer OPENSSL_ALGO_DSS1 ] { 5 }
...
...
...

Respecto a estos dos últimos puntos, también podemos buscar información acerca de una clase (php –rf clase) y de una función (php –rc función).

Cómo instalar ionCube Loader en Windows

Con la instalación de IonCube loader tendremos la posibilidad de visualizar páginas php con contenido codificado con ionCube. La instalación es sumamente sencilla en Windows (en este caso 2003 Server con php 5.2.X):

En primera instancia descargamos la extensión/módulo desde el sitio web de ioncube:

http://www.ioncube.com/loaders.php

Posteriormente, procedemos a descomprimir el fichero, dentro del cual encontraremos las versiones de los módulos para cada versión de PHP y dos scripts php para testear que la instalación se ha realizado correctamente:

ioncube_loader_win_4.1.dll
ioncube_loader_win_4.2.dll
ioncube_loader_win_4.3.dll
ioncube_loader_win_4.4.dll
ioncube_loader_win_5.0.dll
ioncube_loader_win_5.1.dll
ioncube_loader_win_5.2.dll
ioncube-loader-helper.php
ioncube-encoded-file.php

Bien, llegados a este punto debemos copiar el módulo correspondiente a nuestra versión de php en la carpeta donde guardemos todos los módulos de php, normalmente “ext” dentro de la carpeta PHP.

Posteriormente, llamamos al módulo desde el fichero de configuración php.ini añadiendo la siguiente línea, que hace referencia al módulo comentado antes:

zend_extension_ts = "c:\carpeta_php\ext\ioncube_loader_win_5.2.dll"

Guardamos y testeamos con un navegador si la instalación se ha realizado correctamente, ejecutando el script ioncube-encoded-file.php, tendrá que mostrar lo siguiente:

This file has been successfully decoded. ionCube Loaders are correctly installed.

PHP: Deshabilitar funciones peligrosas

A estas altura todos conocemos la potencia y versatilidad del lenguaje PHP. Existen no obstante ciertas funciones que utilizadas de forma incorrecta, o con fines maliciosos (exploits, crackeos, etc) comprometan seriamente la seguridad del servidor que está ejecutando el php. Estamos hablando de bugs en una versión de php instalada, bugs en la programación, mala securización de un servidor y muchos más puntos a tener en cuenta y que pueden provocar graves problemas de seguridad en una máquina.

Un buen punto sobre el que comenzar a securizar php, es deshabilitar ciertas funciones potencialmente peligrosas, y que si nuestra programación no utiliza, es 100% recomendable desactivar completamente. Para desactivar funciones, debemos listarla en el fichero de configuración de php (php.ini), utilizando la directiva “disable_functions“. El fichero php.ini normalmente se encuentra en /etc/php.ini, no obstante podéis buscarlo con el comando:

whereis php

Un ejemplo sobre el que podemos comenzar de funciones a deshabilitar es el siguiente:

disable_functions ="system,passthru,escapeshellarg,escapeshellcmd,proc_close,proc_open,ini_alter,popen,show_source,pcntl_exec"

En php.net podéis observar las tareas que desempeña cada una y revisar la viabilidad de su desactivación. En otros sitios web van más allá, y amplian mucho más la lista de funciones a desactivar:

disable_functions ="apache_child_terminate, apache_setenv, define_syslog_variables, escapeshellarg, escapeshellcmd, eval, exec, fp, fput, ftp_connect, ftp_exec, ftp_get, ftp_login, ftp_nb_fput, ftp_put, ftp_raw, ftp_rawlist, highlight_file, ini_alter, ini_get_all, ini_restore, inject_code, mysql_pconnect, openlog, passthru, php_uname, phpAds_remoteInfo, phpAds_XmlRpc, phpAds_xmlrpcDecode, phpAds_xmlrpcEncode, popen, posix_getpwuid, posix_kill, posix_mkfifo, posix_setpgid, posix_setsid, posix_setuid, posix_setuid, posix_uname, proc_close, proc_get_status, proc_nice, proc_open, proc_terminate, shell_exec, syslog, system, xmlrpc_entity_decode"

Aquí ya entran las necesidades de cada uno y la adaptación al entorno de trabajo. Os recomiendo investigar las funciones. Securizar este punto os puede librar de muchos disgustos.

PHP: deshabilitar session ID en URL

Si queremos que las URL’s de nuestros sitios PHP no muestren los ID de sesiones:

http://ejemplo.com/?PHPSESSID=4kgj577sgabvnmhjgkdiuy1956if6ska

Puede deshabilitarse a través del fichero .htaccess (servidores apache + cgi como DSO) o en un fichero php.ini personalizado (servidores apache + cgi ó apache + SUPHP), en los dos casos modificando el parámetro session.trans_id.

En .htaccess:

php_flag session.use_trans_sid off

En php.ini:

session.use_trans_sid = off

Kayako: ERROR: Your PHP is not compiled with IMAP Support.

¿El error es bastante claro no? No obstante, puede llegar a ser difícil darse cuenta de que este es el fallo. Este error salta al ajecutar el parser que se configura en kayako a través de un cron para que “parsee” todas las cuentas de correo asociadas a los tickets y así ponga cada email en su departamento. Yendo al grano, si al ejecutar el cron sitio.com/cron/index.php?_t=parser por ejemplo de este modo:

GET "http://mikayako.com/cron/index.php?_t=parser" > /var/log/log_cron_kayako.txt

Nos encontramos con que devuelve el siguiente error:

ERROR: Your PHP is not compiled with IMAP Support.

Asegurate de compilar php habilitando soporte imap con la flag –with-imap o si lo has instalado por paquetería (yum, apt) simplemente instala el módulo:

yum install php-imap

Reinicia apache y ejecuta de nuevo el cron, ya deberían procesarse correctamente todas las colas de correo de apache. Recuerda ampliar el max execution time de PHP si usas muchos departamentos, volumen de correos, etc.

Si este cron no funciona, nos damos cuenta porque los correos llegan correctamente al MTA (PostFix, Exim, qMail) pero ahí termina todo, no pasan a la interfaz web de Kayako.

Wordpress 2.7 Fatal error: Allowed memory size of xxx bytes exhausted (tried to allocate xxx bytes) in class-snoopy.php

En uno de mis blogs he notado este error a la hora de publicar o borrar noticias, ha sido justo al actualizar a la versión 2.7 de Wordpress. Existen varias formas de solucionarlo:

Fatal error: Allowed memory size of xxx bytes exhausted (tried to allocate xxx bytes) in class-snoopy.php on line 894

  1. Aumentar el límite de memoria que un script PHP puede utilizar en el php.ini del servidor:
  2. memory_limit = 16M ; Maximum amount of memory a script may consume (16MB)
  3. Si utilizas el plugin Google XML Sitemaps, revisa la solución al problema publicada por el propio autor.
  4. Modificar el script php class-snoopy.php, en el que puedes aumentar el límite de memoria, añade la siguiente línea de código sobre la línea 894 ($_data = fread($fp, $this->maxlength);) y aumenta el valor de memoria a 32 Mb por ejemplo:
  5. ini_set('memory_limit','32M'); // Añade esta línea
    $_data = fread($fp, $this->maxlength);

PHP 5.2.8

Ha salido a la luz una nueva versión de php, la PHP 5.2.8, esta versión soluciona un bug encontrado en la reciente versión también publicada 5.2.7 relacionada con el funcionamiento de magic_quotes, bug de seguridad que abría un agujero de seguridad al tener activo “magic_quotes_gpc

Se recomienda actualizar a dicha versión, y si tienes la versión 5.2.7 y no deseas actualizar aplica el siguiente “parche” a tu php.ini para arreglar el problema de magic_quotes:

“filter.default_flags=0″

Más información en php.net

Centos 4.6: Actualizar php4 a php5 con yum

Los repositorios por defecto de la distribución CentOS no permiten actualizar a php 5 ya que para dicha versión lo máximo (creo recordar) que es php 4.3, lo mismo sucede con, por ejemplo, las versiones de MySQL.

Existe una solución alternativa a tener que instalar los paquetes vía rpm o compilando manualmente y es utilizando temporalmente un repositorio extra que sí disponga de estas actualizaciones. Digo temporalmente porque quizás no nos interese utilizar esos repositorios para todos los paquetes instalados en el sistema (fallos de dependencias, no querer actualizar en updates generales, etc), para ello podemos utilizarlos únicamente para los paquetes que deseamos instalar con el parámetro  “–enablerepo=repositorio“.

Volviendo al tema de php5, si quisieramos actualizarlo podríamos hacerlo del siguiente modo:

yum --enablerepo=centosplus search php*

Esto buscaría los paquetes de php disponibles en todos los repositorios incluido centosplus, que es el repositorio que permite estas actualizaciones. Si vemos correcto los paquetes a actualizar, lo hacemos:

yum --enablerepo=centosplus install php*

Como siempre, atentos a las dependencias que se instalan/actualizan y confirmad que no generen fallos con lo que tengáis instalado actualmente.

En resumen, recordad que podéis utilizar en un momento determinado cualquier respositorio con el parámetro “–enablerepo=repositorio” y que CentOSplus contiene muchísimos y útiles paquetes para actualizar en centOS 4.6 sin tener que pasar a CentOS 5