User Tools

Site Tools


linux:php:php_full_compile_howto

[HOWTO] Build PHP (like a redhat)

Descripción de servicio

Php compilado de las fuentes oficiales

Requerimientos de ejemplo de cualquier cliente

bz2CalendarctypeCurlDate
domExifFilterftpEaccelertor 0.9.5.3
GdGettextgmpHashZlib
Iconvimagick (v2.2.1)ImapJsonZip
libxmlMbstringmcryptmemcachezend optimiser (v3.3.3)
MysqlMysqlixslXmlwriterxml
pdo / pdo_mysql / pdo_sqliteposixpspellReflection
sessionshmopSimplexmlsockets

Las extensiones:

Forman parte del “core” de php desde la 5.2.0

Dependencias habituales

Estas dependencias están tomadas para RedHat Enterprise Linux usando la rhn:

yum install ImageMagick ImageMagick-devel gd gd-devel 
            libxslt libxslt-devel libc-client-devel libpng-devel 
            mysql-devel mysql httpd-devel aspell aspell-devel

Hay varias dependencias que hay que bajarse de DAG

rpm -Uhv paquete_de_dag.rpm
yum install libmcrypt libmcrypt-devel libssh2 libssh2-devel 
rpm -e rpmforge-release
Asegurarse de eliminar el respositorio de dag (rpmforge)

Dependencias para Oracle (oci8)

Si vamos a instalar soporte oracle: Para el oracle client, ademas de los pasos anteriores, el installer necesita ciertas librerías que no es habitual tener de base en el sistema:

  • RHEL4
    xorg-x11-deprecated-libs
  • RHEL5
    yum install libXp libXtst

Paradogicamente usan las libs de 32bits aunque el installer sea el de 64bits ¿?

Codigo fuente

En mi caso este es el último código fuente disponible, siempre es conveniente usar la ultima revision de php (diferente a version, que ya no es tan conveniente, a no ser que la aplicación esté preparada):

cd /apps/software
wget "http://fr3.php.net/get/php-5.2.9.tar.bz2/from/fr.php.net/mirror"
tar xjfv php-5.2.9.tar.bz2

Extensiones

Las extensiones PECL se pueden añadir antes o después de compilar el PHP.

Extensiones habituales

Las extensiones:

Se tienen que descargar aparte:

wget http://pecl.php.net/get/ssh2-0.11.0.tgz
wget http://pecl.php.net/get/memcache-2.2.5.tgz
wget wget http://pecl.php.net/get/imagick-2.3.0b1.tgz
mv imagick-2.3.0b1.tgz php-imagick-2.3.0b1.tgz
mv ssh2-0.11.0.tgz php-ssh2-0.11.0.tgz
mv memcache-2.2.5.tgz php-memcache-2.2.5.tgz

Hay varias formas de compilarlas, las 2 recomendables son con “phpize” una vez que está compilado el php o insertandolas en el php antes de compilarlas.

He tenido que usar la version *BETA* (imagick-2.3.0b1) de la extensión por problemas de compilación que solo se resolvían con esta versión.

Compilación built-in

RECOMENDADA, Añadir las extensiones al codigo fuente:

cd /apps/software
for i in php-imagick-2.3.0b1.tgz php-memcache-2.2.5.tgz php-ssh2-0.11.0.tgz  ; do tar xzfv $i ; done
ll
mv imagick-2.3.0b1/ php-5.2.9/ext/imagick
mv memcache-2.2.5/ php-5.2.9/ext/memcache
mv ssh2-0.11.0/ php-5.2.9/ext/ssh2
cd php-5.2.9/
mv configure configure.old
./buildconf --force
./configure --help | egrep -i "imagick|memcache|ssh2"

Debería mostrar algo como esto:

[[root@eul2400246|php-5.2.9]]# ./configure --help | egrep -i "imagick|memcache|ssh2"
  --enable-memcache       Enable memcache support
  --disable-memcache-session       Disable memcache session handler support
 --with-imagick=DIR     Enables the imagick extension. DIR is the prefix to Imagemagick installation directory.
 --with-imagick-gm=DIR  GraphicsMagick backend. NO LONGER SUPPORTED!
  --with-ssh2=DIR       Include ssh2 support
  --with-zlib-dir=DIR   memcache: Set the path to ZLIB install prefix.

Compilación phpize

Este modo lo que hace es compilar la librería como “dll” para cargarla mediante php.ini. Recomendado cuando se quiere añadir una nueva extensión sin recompilar el php, *hace falta tenerlo compilado previamente*.

Esta opción se tiene que usar para el eaccelerator, por eso la pongo como ejemplo:

cd /apps/software/
wget http://bart.eaccelerator.net/source/0.9.5.3/eaccelerator-0.9.5.3.tar.bz2
tar xjfv eaccelerator-0.9.5.3.tar.bz2
mv eaccelerator-0.9.5.3 php-5.2.9/ext/eaccelerator
cd php-5.2.9/ext/eaccelerator
/apps/php5/bin/phpize
./configure --enable-eaccelerator=shared --with-php-config=/apps/php5/bin/php-config
make
make install
mkdir /apps/php5/ext ; find /apps/php-5.2.9/lib/php/extensions -name eaccelerator.so -exec mv {} /apps/php5/ext/ ;

Post install:

mkdir /tmp/eaccelerator
chmod 0777 /tmp/eaccelerator
En este caso habrá que añadir al php.ini la opción típica:
 extension=eaccelerator.so

Oci8 (extension oracle)

Oracle client

Lo recomendable es usar el “client” (si, el tocho), php 5.0 NO se puede compilar con soporte oracle con el instant client, el 5.2 en teoría, sí, pero mejor evitar problemas…

  • client 11g i686
http://download.oracle.com/otn/linux/oracle11g/linux_11gR1_database_1013.zip
  • client 11g x86_64
links http://download.oracle.com/otn/linux/oracle11g/linux_x86_11gR1_client.zip
  • client 10g i686
links http://download.oracle.com/otn/linux/oracle10g/10201/10201_client_linux32.zip
  • client 10g x86_64
links http://download.oracle.com/otn/linux/oracle10g/10201/10201_client_linux_x86_64.cpio.gz
gunzip 10201_client_linux_x86_64.cpio.gz
cpio -idmv < 10201_client_linux_x86_64.cpio.gz

Uso links por que pide login en la OTN

Dar de alta el usuario de oracle:

groupadd  -g 10000 oinstall
groupadd  -g 10001 dba
adduser -u 10000 -g oinstall -G dba -d /oracle -s /bin/bash -c "Usuario software Oracle" -m oracle
mkdir /oracle/10.2.0
chown oracle:oinstall -R /oracle/10.2.0

Y añadir las variables de entorno de oracle en caso que sean necesarias:

su - oracle
vi ora10.env
ORACLE_BASE=/oracle
ORACLE_HOME=/oracle/10.2.0/client
ORACLE_SID=<CAMBIAR_EL_ORACLE_SID>
ORACLE_TERM=xterm
NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P15
PATH=$ORACLE_HOME/bin:$ORACLE_HOME/opmn/bin:$ORACLE_HOME/dcm/bin:$PATH
LD_LIBRARY_PATH=$ORACLE_HOME/lib
export ORACLE_BASE ORACLE_HOME ORACLE_SID ORACLE_TERM NLS_LANG PATH LD_LIBRARY_PATH

Editar el profile:

vi .bash_profile

Añadir:

. ~/ora10.env

Capturas de la instalación:

Seleccionar path (por defecto ok)
bastan las runtime
Ok por defecto
Next
Install
Wait
En la ventana adicional, next
Finish
Ejecutar como root los scripts:
/oracle/oraInventory/orainstRoot.sh
/oracle/10.2.0/client/root.sh
Finalizar instalación

Antes de comenzar con la compilación es necesario inicializar varias variables de oracle, basta con usar el _ora10.env_:

. /oracle/ora10.env

Imap

La extensión imap, es para mí la extensión más difícil de compilar. Por el simple motivo que primero hay que compilar el propio imap. Y es un software bastante críptico. Podéis ver las versiones disponibles aquí. En mi caso la única que he conseguido compilar (y que después funcione el PHP) es la imap-2007a1.tar.Z:

cd /apps/software
wget ftp://ftp.cac.washington.edu/imap/imap-2007a1.tar.Z
tar xzfv imap-2007a1.tar.Z
cd imap-2007a
make lrh

Como véis no tiene configure, la documentación es poco menos que imposible de digerir y para colmo en algunas ocasiones compila pero el php NO, en ese caso, se debería compilar en otra máquina.

Las Opciones a añadir en el configure son:

        --with-imap=/apps/software/imap-2007a 
        --with-imap-ssl

Compilación

Configure

./configure --enable-memcache 
		--with-imagick 
		--with-ssh2 
		--with-bz2 
		--with-curl 
		--enable-calendar 
		--enable-exif 
		--enable-ftp 
		--with-gd 
		--with-gettext 
		--with-gmp 
		--with-imap 
		--enable-mbstring 
		--with-mcrypt 
		--with-mysql 
		--with-mysqli 
		--with-openssl 
		--with-pdo-mysql 
		--with-pspell 
		--enable-shmop 
		--enable-sockets 
		--enable-sysvmsg 
		--enable-wddx 
		--with-xsl 
		--enable-zip 
		--with-zlib 
		--with-kerberos 
		--with-imap-ssl 
		--with-apxs2 
		--with-libdir=lib64 
		--with-oci8=shared 
		--prefix=/apps/php5

Compilación

make
make install
cd /apps
ln -s /etc/php.ini /apps/php5/lib/php.ini

Comprobar correcto funcionamiento

/apps/php5/bin/php -i

Opciones adicionales

Zend Optimizer

En caso de que sea necesario el Optimizador de Zend3, por que el cliente tenga los php's compilados, es necesario descargar e instalar. Normalmente el cliente debería proveer del paquete ya que hay que registrarse en la página para obtenerlo, pero sino es un momento.

Instalación de Zend

Descargarlo y moverlo a la hubicación habitual

mv ZendOptimizer-3.3.3-linux-glibc23* /apps/software
cd /apps/software
tar xzfv ZendOptimizer-3.3.3-linux-glibc23*targz
cd ZendOptimizer-3.3.3-linux-glibc23*
./install

Seguir las instrucciones y añadir como path de instalación:

/apps/ZendOptimizer-3.3.3

Y como path para php.ini:

/etc

O dondde esté el php.ini usado por la máquina. El propio installer hace una copia del mismo.

Una vez que esté instalado, lo adecuamos a nuestras instalaciones:

ln -s /apps/ZendOptimizer-3.3.3 /apps/zend3

Borramos el enlace simbólico que crea el propio instalador y restauramos el que teníamos previamente:

rm -fv /etc/php.ini
mv /etc/php.ini-zend_optimizer.bak /etc/php.ini

Y añadimos las siguientes lineas al php.ini:

[[Zend]]
zend_extension_manager.optimizer=/apps/zend3/lib/Optimizer-3.3.3
zend_extension_manager.optimizer_ts=/apps/zend3/lib/Optimizer_TS-3.3.3
zend_optimizer.version=3.3.3
zend_extension=/apps/zend3/lib/ZendExtensionManager.so
zend_extension_ts=/apps/zend3/lib/ZendExtensionManager_TS.so

Comprobamos que el cli de php ha cojido el cambio:

php -i | grep -i optimizer

Que debería dar como resultado algo como:

[[root@htsphp1|buscador_domus]]# php -i | grep -i optimizer
with Zend Optimizer v3.3.3, Copyright (c) 1998-2007, by Zend Technologies

Eaccelerator

Si queréis el panel de control de eaccelerator, hay que copiar el fichero “control.php” del código del eaccelerator a algún sitio donde apache pueda ejecutarlo y añadir la siguiente linea al php.ini:

eaccelerator.allowed_admin_path = "/var/www/html"

Ficheros auxiliares para las comprobaciones

Se puede colocar en el directorio del *default* virtualhost.

php

vi my_info.php
<? phpinfo(); ?>

php+mysql

vi my_test.php
<?php
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = 'password';

$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die('Error connecting to mysql');

$dbname = 'test';
mysql_select_db($dbname);

$result = mysql_query("SELECT 1 + 1 ;") or die(mysql_error());
$row = mysql_fetch_array( $result );

echo "<pre>";
print_r($row);
echo "</pre>";
?>

php+oracle

Logicamente hay que cambiar las opciones del oci_connect

vi my_test.php
<?php
 if ($c = oci_connect("user", "pass", "ORACLE_SID")) {
   echo "Successfully connected to Oracle.n";
   oci_close($c);
 } else {
   $err = oci_error();
   echo "Oracle Connect Error " . $err[['text']];
 }
 ?>
linux/php/php_full_compile_howto.txt · Last modified: 2022/02/11 11:36 by 127.0.0.1