Buscar este blog

sábado, 8 de diciembre de 2012

Make PHP 5.3.6

Hola buenas, se que es de madrugada pero no queria compartir la experiencia que tengo ahorita en linux, al tratar de generar mi propio compilado de php 5.3.6, resulta que tenemos plesk panel instalado y corriendo php 5.2, el cual fue un downgrade que hizo un amigo mio para poder correr zend optimizer, el cual es requerido por unas sitios web que tenemos alojados alli; regresando al asunto, encontre un articulo donde podia montar varias versiones de php para un determinado cliente como es este caso donde me toca trabajar con moodle en un dominio, y sin embargo la version 2.3 de moodle requiere si o si php 5.3 por cuestiones importantes ya que esta version soporta llamada dinamica a funciones de clases estaticas, mientras que versiones anteriores no soportan esta caracteristicas, entonces ahora me encuentro compilando mi version de php 5.3 que voy a usar para este nuevo dominio con plesk panel. A continuacion escribire la liste de comandos que usé, mas algunas enlaces de referencias que me fueron de mucha ayuda para resolver este reto. Saludos. Seguire actualizando este post :)


Two PHP versions linux Plesk HOWTO

Few days ago i was exchanging emails with Parallels support. I was asking them to help me to setup two php versions on linux plesk server. After few emails they answeared me that it is not possible. It didn't help when i told them that i was using fastcgi on my own hosting server and that i was having 3 php versions configurable per customer. Nop... Their answear was 
Quote:
As of now there is no option available in the linux, where you can choose php as per the customers.
Hope you are clear now. If you have any further help, feel free to get back to us. We would be glad to assist you further.
And, there i was, left helpless, without possibility to finish migration from my old hosting server to our new and shiny Plesk. I needed newer php version because php provided by my linux distro is 5.1.
So, i logged in to Plesk server and spend around 20 minutes planning how to intercept Plesk calls. And it is done.
For this to work you have to have php running as fastcgi (it is most secure way, so i assume that everyone is running php as fastcgi)
Here it goes:

1. ssh to your plesk server, download php source, unpack it and configure it
Code:
ssh yourserver -l root cd /usr/local/src mkdir php540 cd php540 wget http://www.php.net/get/php-5.4.0.tar.gz/from/at2.php.net/mirror tar xzvf php-5.4.0.tar.gz cd php-5.4.0
NOTICE: you HAVE TO USE PREFIX switch in order to have your new php installed inside one directory, for example:

Code:
./configure '--with-libdir=lib64' '--cache-file=../config.cache' '--prefix=/usr/local/php536-cgi' '--with-config-file-path=/usr/local/php536-cgi/etc' '--disable-debug' '--with-pic' '--disable-rpath' '--with-bz2' '--with-curl' '--with-freetype-dir=/usr/local/php536-cgi' '--with-png-dir=/usr/local/php536-cgi' '--enable-gd-native-ttf' '--without-gdbm' '--with-gettext' '--with-gmp' '--with-iconv' '--with-jpeg-dir=/usr/local/php536-cgi' '--with-openssl' '--with-pspell' '--with-pcre-regex' '--with-zlib' '--enable-exif' '--enable-ftp' '--enable-sockets' '--enable-sysvsem' '--enable-sysvshm' '--enable-sysvmsg' '--enable-wddx' '--with-kerberos' '--with-unixODBC=/usr' '--enable-shmop' '--enable-calendar' '--without-sqlite3' '--with-libxml-dir=/usr/local/php536-cgi' '--enable-pcntl' '--with-imap' '--with-imap-ssl' '--enable-mbstring' '--enable-mbregex' '--with-gd' '--enable-bcmath' '--with-xmlrpc' '--with-ldap' '--with-ldap-sasl' '--with-mysql=/usr' '--with-mysqli' '--with-snmp' '--enable-soap' '--with-xsl' '--enable-xmlreader' '--enable-xmlwriter' '--enable-pdo' '--with-pdo-mysql' '--with-pdo-pgsql' '--with-pear=/usr/local/php536-cgi/pear' '--with-mcrypt' '--enable-intl' '--without-pdo-sqlite' '--with-config-file-scan-dir=/usr/local/php536-cgi/php.d' '--enable-zip'
As you can see, my prefix was /usr/local/php536-cgi/
Choosing a prefix is a MUST because that way your new php installation will not interfere with older php used by plesk.

2. compile your php
Code:
make
3. install your new php
Code:
make install
4. create php wrapper
for example, let's say that you have a customer blabla.com that uses some newer php functions that don't exist in php 5.1. Let's call that customer blabla.com. For him we will tell apache to use our new php (5.4.0)
Code:
cd /var/www/vhosts/blabla.com/cgi-bin mkdir .cgi_wrapper cd .cgi_wrapper
now we will create new file and name it .phpwrapper
Code:
vi .phpwrapper
file content:
Code:
#!/bin/sh export PHPRC=/var/www/vhosts/blabla.com/etc/ export PHP_FCGI_CHILDREN=4 export PHP_FCGI_MAX_REQUESTS=1000 exec /usr/local/php540-cgi/bin/php-cgi
let's strengthen our new files and dirs permissions and privileges:
Code:

cd /var/www/vhosts/blabla.com/cgi-bin chmod 101 .cgi_wrapper chmod 500 .cgi_wrapper/.phpwrapper chown blabla.com:psacln .cgi_wrapper -R chattr -R +i .cgi_wrapper

5. make apache aware of our wrapper
plesk offers a functionality of changing httpd setup per host. we will use that functionality to tell apache that for blabla.com it needs to use our new wrapper, instead of one provided by plesk:
Code:
cd /var/www/vhosts/blabla.com/conf
we will create file named vhost.conf
Code:
vi vhost.conf
file content:
Code:
RemoveHandler fcgid-script AddHandler fcgid-script .php SetHandler fcgid-script FCGIWrapper /var/www/vhosts/blabla.com/cgi-bin/.cgi_wrapper/.phpwrapper .php Options +ExecCGI allow from all
So, we have told apache not to use plesk php wrapper (RemoveHandler fcgid-script) and instead of that we have created a new handler for php files. When executing php files on blabla.com domain apache will call our wrapper and use new php that we installed

6. we need to reconfigure blabla.com domain
Code:
/usr/local/psa/admin/sbin/httpdmng --reconfigure-domain blabla.com
7. and restart apache
Code:
/etc/init.d/httpd restart
That's it. For every domain that needs some extra functions provided only in php versions newer than one provided with your plesk distro you can do steps 4,5,6 and 7 (replace blabla.com with your customer domain name) and that's all.

Adicional: A veces podemos necesitar instalar este paquete yum-install libtool-ltdl-devel

lunes, 16 de julio de 2012

Cloud Computing de Amazon

Buenos dias que tal espero que bien, escribo para comentarles mis primeras experiencias con cloud computing bueno mis primeras experiencias con el servicio que ofrece amazon porque cloud computing ya lo vengo viendo como hace un par de años. La impresion que tengo es relativamente buena. Estoy usando Cloudfront y S3, la verdad es que tenia curiosodad desde hace meses sobre como usar estos servicios y aca estoy ya realizando mis primeros test con php usando unas librerias de ejemplo que abstraen toda la configuracion y me hacen facil la implementacion, espero de aca a  unos dias poder entenderlo al 100% y liberar una propia version para usar en mi proyecto de aplicaciones sociales, lo cual de ahi parti para avriguar ya que intento alojar todas la imagenes en el servicio en la nube de amazon ademas de los archivos estaticos como css y js, bueno espero seguir investigando en este punto y compartir recursos para aquella personas que tambien esten usando los sevicios en la nube de amazon. Hasta el siguiente post!

martes, 12 de junio de 2012

unable to connect to tcp://gdata.youtube.com:80

Hola, en este nuevo post quisiera contarles el problema que tuve con la conexion a la api de google (youtube), tengo una plataforma que usa la api oficial de youtube proveida por Zend, bueno el caso es que en si no solo era el problema con la api de Youtube sino tambien con la api de facebook lo cual me parecio bastante sospechoso, es mas solo me habia dado cuenta de la lentitud con la que se hacian mis peticiones a la api de facebook, entonces decidi hacerle seguimiento. Parece que en facebook solo llegaba al timeout pero luego trataba una forma alternativa y lograba conectarse, supongo que seguro de los varios metodos que hay para comunicarse con un servidor remoto. Empeze primero haciendo file_get_contents para asegurarme de que podia solicitar informacion  ya sea por json o xml o alguna otra salida, y asi fue no tuve ningun problema, para mi ejemplo use file_ge_contents hacia un servidor que me daba la hora y todo fue bien, luego probe con fsockopen y entoncs probe con el siguiente dominio gdata.google.com y entonces me salio un timeout, proble lo mismo en otro servidor dedicado que administro y todo fue bien, luego probe con el ip ya que tambien es una opcion valida y que me recomendaron cuando investigue en la web, y estaban en lo cierto con el ip todo corrio sin ningun problema, entonces dije si esto esta pasando con gdata.youtube.com entonces puede ser lo mismo para facebook porque me preocupo bastante que una peticion sencilla a facebook api que normalmente toma 1/5 de segundo lo estaba haciendo en 4 o 5 segundos, entonces me decidi a probar cambiando los nombres de dominios por las ips, como bien saben en la api de facebook se manejan 5 o 6 dominios no recuerdo entoncs modifique mi archivo /etc/hosts y le indique mis dominio con sus respectivos ips, incluyendo los de gdata.youtube.com y facebook. Probe y todo regreso a la normalidad, cargue mis videos de youtube y recupere el tiempo de carga de 1/5 con la api de facebook, entonces la conclusion a la que llego es que algo esta fallando con la traduccion de los dominios de facebook y youtube, pero que extraño que solo sea para estos dominios ya que probe con otros y no tuve ningun problema, la otra opcion que tuve fue revisar el archivo /etc/resolv.conf para ver si algo habia cambiado pero estaba todo normal, la otra opcion pueden que haya pasado algo en el firewall del datacenter donde esta el servidor dedicado y hayan denegado la traduccion de los dominios de facebook o youtube, pero al fin seguire haciendole seguimiento a este problema ya que no es recomendable tener las ips estaticas en hosts, ah me olvidaba tambien revise mis interfaces de red que por cierto habian cambiado a mascara 255.255.255.255, pero las regrese a 255.255.255.0 sin embargo el problema persisitio, igual se tenia que corregir, la otra opcion puede ser porque a partir del 6 de junio se empezo a usar el nuevo estandar ipv6, aunque no creo que haya sido el motivo. Bueno seguire investigando y cualquier cosa actualizare este post, espero les haya sido util esta informacion. Hasta el siguiente post =]

jueves, 10 de mayo de 2012

Problemas Con Cookies en Diferentes Archivos PHP

Que tal ya llevaba tiempo si escribir una entrada, bueno esta vez tengo la oportunidad de publicar para resolver un problema que tuve hace un par de dias en una aplicacion web que llevo desarrollando.
El escenario era este tenia mi pagina php multidioma pero necesitaba guardar una cookie del idioma que escogiera de un popup y recargar la pagina entonces cuano yo hacia click en el idioma llamaba a una funcion javascript y esta a su vez enviaba por post a un archivo que me creaba una cookie con el iso del idioma, PERO cuando la llamaba de mi pagina php era como si nunca se hubiese creado la cookie, bueno les escrbo un poco de codigo para ser mas claro:
setcookie("language_pre",$_REQUEST["prefix"],time()+86400);
con el codigo de arriba seteaba mi cookie y ciando la llamaba desde mi otro archivo php era como si no la hubiese ajustado. El DETALLE era que al final de la funcion setcookie() tenia que especificar la ruta "/" asi a mi cookie la volvia accesible desde cualquier lado de mi servidor. O sea el codigo correcto era 

setcookie("language_pre",$_REQUEST["prefix"],time()+86400,"/");

Espero les haya servido, con esto logre convertir mi aplicacion multiidioma! Saludos.