TITLE:		PHP4 hint
LFS VERSION:	2.4
AUTHOR:		J. Jones <jdj@darkside.dynup.net>

SYNOPSIS:
This hint should get apache and PHP up and running, with the majority of PHP's features enabled.  The methods used here seem (to me) to be the perfect balance between performance and efficient resource usage.  PHP will be compiled statically into apache, which gives the best performance, yet most of PHP's extras will be built as shared modules, keeping the httpd binary nice and small (read sexy).

HINT:
	Version:        1.0-test1

I have to assume alot of configuration options in this hint,
so if you do stray (mainly on the --prefix's), pay attention! :)

=====================================
Software used/mentioned/etc in this hint.

Apache
  http://httpd.apache.org/dist/

PHP
  http://php.net/downloads.php

MySQL
  Seemingly the most popular free SQL server
  http://www.mysql.com/downloads/

PostGreSQL
  Excellent free SQL server
  http://postgresql.readysetnet.com/sites.html

Berkeley DB3
  Screw SQL, use this!
  http://www.sleepycat.com/download.html

GD - 1.8.4 is the recommended version at this time.
  Image creation on the fly
  http://www.boutell.com/gd/

    zlib
      Compression library
      ftp://ftp.freesoftware.com/pub/infozip/zlib/

    libjpeg
      Jpeg library
      ftp://ftp.uu.net/graphics/jpeg/

    libpng
      PNG library
      ftp://ftp.libpng.org/pub/png/src/

    libungif
      Patent-free gif library
      ftp://prtr-13.ucsc.edu/pub/libungif/

    libttf/libfreetype
      True Type font library (YOU WANT THIS!)
      http://freetype.sourceforge.net/

OpenSSL
  Wonderful encryption library
  http://www.openssl.org/

mhash
  Provides access to several hashing algorithms
  http://mhash.sourceforge.net/dl

(lib)mcrypt
  Provides access to several encryption schemes
  http://mcrypt.hellug.gr/

readline
  GNU readline (It's what makes bash so cool)
  ftp://ftp.gnu.org/gnu/readline/

pspell
  The new API for aspell/ispell
  http://pspell.sourceforge.net/

Imap - 2000c please, not the latest beta they'd like you to have :)
  WU's imap library
  ftp://ftp.cac.washington.edu/imap/old/imap-2000c.tar.Z

Curl
  Client URL library
  http://curl.haxx.se/download.html

libxml
  XML DOM library, not to be confused with apache's expat,
  used by php's xml parser.
  http://www.xmlsoft.org/#Downloads

LDAP
  LDAP server and library
  http://www.openldap.org/software/download/

zziplib
  The zlib of zip files
  http://zziplib.sourceforge.net/

=====================================
Where to start...

----------------

APACHE

Extract the apache source.  Move this directory to 
/usr/local/apache (mv ./apache_1.3.17 /usr/local/apache).
Cd into /usr/local/apache.

Edit the config.layout file to suit your tastes.  After that, run

		./configure \
		--with-perl=/usr/bin/perl \
		--enable-module=all \
		--enable-shared=max \
		--disable-module=proxy \
		--disable-module=usertrack \
		--disable-module=auth_anon \
		--disable-module=auth_db \
		--disable-module=auth_dbm

This will cause apache to build all of its modules as DSO's (Dynamic Shared
Objects), thus reducing the size of the httpd binary.  This is how I do it,
feel free to stray as much as you wish.  It will not affect anything else.
Allowing some of those modules to compile statically would probably boost
performance, but that's another hint.  ;)  FEEL FREE TO IMPROVE UPON THIS!

We'll come back to apache later.

----------------

GD
	
The libraries this package depends on are all fairly easy to install.  I won't
get into them.  I assume a --prefix=/usr on the first three (jpeg, ungif, png)
and --prefix=/usr/X11R6 on the last two (ttf/freetype, t1).  Also, compile those 
libraries in the order they are listed, especially the last two.

Extract the gd-1.8.4 source.  Download the patch (it builds a .so for you :)
from ^^^^GD-URL^^^^.  Applying this patch should be as simple as:
	zcat gd-1.8.4-shared.patch.gz | patch -p0
Edit the Makefile as you see fit (installation prefixes, possible removal of
the freetype flags, which I don't recommend at all).  The Makefile will read
the $CFLAGS environment variable, so don't worry about those.

	make all install

----------------

Imap

The newest imap c-client libs are very beta.  I recommend sticking with the
latest stable release, 2000c.  My patch won't work on anything else without
some hacking, anyway. ;)

Extract the imap-2000c package, download the patch (which creates a .so for
you too :) from ^^^^IMAP-URL^^^^.  Apply it with:
	zcat imap-2000c-shared.patch.gz | patch -p0
Cd into the imap-2000c directory, and issue the following commands:
	chmod a+x Build-me
	./Build-me

That should be all there is to it.  This source tree is rather nasty in my
opinion, so if the build fails for you, yell at me.  Email me the WU-imap.sucks
file created by:
	make clean
	./Build-me >WU-imap.sucks 2>&1
and I'll see what I can do.

----------------

PHP

Basically what I do is strip the php interpreter down to the bare minimum,
compile it statically into apache, then build php's extras as shared objects
which can be loaded by scripts (or at startup in the php.ini).

PHP Static Apache module:
Extract the php source.  Enter the directory.  Issue the following, note that
you must change these paths toooooo:

	./configure \
	--prefix=/path/to/apache \
	--with-config-file-path=/path/to/apaches/conf/files \
	--with-apache=/path/to/apache \
	--disable-pear \
	--without-mysql \
	--disable-xml \
	--without-pcre-regex \
	--disable-posix \
	--with-openssl=/path/to/openssl \
	--enable-trans-sid
	make all install

Unfortunately the openssl stuff won't yet (or isn't able to) build as a shared
object, so if you want it, you have add it now.  I have yet successfully
hacked it up to build as a .so; if anyone has, let me know! :)  (Even the
current CVS versions won't).

Now, back to apache.  Issue the same exact configure command you did
previously to apache, adding the following line:

	--activate-module=src/modules/php4/libphp4.a

You can now make all install on apache.


PHP CGI interpreter:

This is completely optional, but nice to have, in my opinion.  This will
create a php binary interpreter, which you can use just like perl or sh.  Do
NOT use this for web pages.

In the php source directory, do the following:

	make distclean
	./configure \
	--prefix=/usr/local \
	--with-config-file-path=/usr/local/etc \
	--enable-force-cgi-redirect \
	--enable-discard-path \
	--disable-pear \
	--without-mysql \
	--disable-session \
	--without-pcre-regex \
	--disable-posix \
	--disable-xml \
	--with-openssl=/path/to/openssl
	make all install

You will now have a /usr/local/bin/php command line interpreter.


PHP's extras:

Now the fun part.  Do a make distclean on the php source tree.

NOTES:  PHP has a bundled mysql client library, so it doesn't require
	mysql to be installed to support it.  If you are using pspell, you need the
	patch from ^^^^PSPELL-PATCH^^^^ in order for php to compile successfully.
	This library was updated recently, and changed the api a bit.  That patch
	will fix php's pspell support.  DOM XML (libxml) requires BOTH libxml-1.* and
	libxml2-* to be installed.

./configure options  
	--with-apache=/usr/local/apache == Path to apache 
		source tree, build as apache module

Database stuff... 
	For MySQL support...
	--with-mysql=shared,/optional/path/to/mysql (see note above)
			 ==  Include the mysql client
	For PostGreSQL support...
	--with-pgsql=shared,/pgsql/install/prefix  ==  Include pg 
		client, prefix to postgres install
	For DB3 support (YOU HAVE TO TRY THIS! IT SMOKES THE *SQL's!)
	--enable-dba=shared  == enable the db abstraction layer
	--with-db3=/usr  == add db3 support to it!
 
For GD support...
	--with-gd=shared,/usr/X11R6  ==  Use gd, prefix to gd install
	--with-jpeg-dir=/usr   ==  jpeg libs are prefixed here
	--with-xpm-dir=/usr/X11R6   ==  xpm libs are prefixed here
	--with-ttf=/usr/X11R6   ==  use ttf, and it's prefixed
	    here
	--with-t1lib=/usr/X11R6  ==  use type 1 fonts,
	    and prefix is here
	--enable-gd-imgstrttf
	--enable-gd-native-ttf

Encryption and compression stuff...
	For mhash...
		--with-mhash=shared,/usr  ==  use mhash, prefixed here
	For mcrypt...
		--with-mcrypt=shared,/usr  ==  use mcrypt, prefixed here
	For zlib...
		--with-zlib=shared,/usr  ==  use zlib functions, and it's prefixed here
	For bzip2...
		--with-bz2=shared,/usr  == bzip2!
	For zziplib
		--with-zziplib=shared,/usr == zzip!

Imap support...
	--with-imap=shared,/prefix/to/imap/  == enable the imap functions
	--with-imap-ssl=/path/to/openssl  == add ssl support!

Miscellaneous...
	--with-pcre-regex=shared  == Perl Compatible Regular Expressions! (builtin)
	--with-pspell=shared,/path/to/pspell  == Pspell support
	--with-curl=shared,/path/to/curl  == use curl!
	--with-ldap=shared,/path/to/openldap  == enable ldap functions
	--with-gettext=shared,/usr == GNU gettext support!
	--with-readline=shared,/usr == GNU Readline support!
	--enable-bcmath=shared  == bcmath precision calculations (builtin)
	--with-gmp=shared		== GNU precision math lib (builtin)
	--enable-posix=shared  == posix functions (builtin)
	--enable-calendar=shared == calendar conversion (builtin)
	--enable-ctype=shared == character type functions (builtin)
	--enable-filepro=shared  == bundled filepro support (builtin)
	--enable-shmop=shared  == shmop support (builtin)
	--enable-sysvsem=shared  == SystemV semaphore functions (builtin)
	--enable-sysvshm=shared == SystemV shared memory functions (builtin)
	--with-xml=shared  == XML parsing support (builtin)
	--enable-wddx=shared  == XML wddx stuff (builtin)
	--with-domxml=shared,/path/to/libxml  == DOM XML stuff
	--enable-ftp=shared  ==  enable ftp functions (builtin)
	--enable-sockets=shared   ==  enable network socket functions 
	    (builtin)
	--enable-yp=shared  == yp support (builtin)
	--enable-dbase=shared  == old dbase read-only support (builtin)
	--enable-exif=shared  == exif support (builtin)

The =shared options creates a shared library which php 
will load, allowing you to update one or more modules/features,
without recompiling apache and php.

Here's the entire ./configure command, with every option shown above.  Be sure
to fix the paths.  ;)

	./configure \
	--with-apache=/usr/local/apache \
	--with-mysql=shared,/optional/path/to/mysql \
	--with-pgsql=shared,/pgsql/install/prefix \
	--enable-dba=shared \
	--with-db3=/usr \
	--with-gd=shared,/usr/X11R6 \
	--with-jpeg-dir=/usr \
	--with-xpm-dir=/usr/X11R6 \
	--with-ttf=/usr/X11R6 \
	--with-t1lib=/usr/X11R6 \
	--enable-gd-imgstrttf \
	--enable-gd-native-ttf \
	--with-mhash=shared,/usr \
	--with-mcrypt=shared,/usr \
	--with-zlib=shared,/usr \
	--with-bz2=shared,/usr \
	--with-zziplib=shared,/usr \
	--with-imap=shared,/prefix/to/imap/ \
	--with-imap-ssl=/path/to/openssl \
	--with-pcre-regex=shared \
	--with-pspell=shared,/path/to/pspell \
	--with-curl=shared,/path/to/curl \
	--with-ldap=shared,/path/to/openldap \
	--with-gettext=shared,/usr \
	--with-readline=shared,/usr \
	--enable-bcmath=shared \
	--with-gmp=shared \
	--enable-posix=shared \
	--enable-calendar=shared \
	--enable-ctype=shared \
	--enable-filepro=shared \
	--enable-shmop=shared \
	--enable-sysvsem=shared \
	--enable-sysvshm=shared \
	--with-xml=shared \
	--enable-wddx=shared \
	--with-domxml=shared,/path/to/libxml \
	--enable-ftp=shared \
	--enable-sockets=shared \
	--enable-yp=shared \
	--enable-dbase=shared \
	--enable-exif=shared \
	--disable-nls \
	| tee ~/php-config.log

This script tends to fly by fairly quick.. so check the ~/php-config.log for
the results.

PHP's configure script doesn't seem to carry it's -L's and -I's very well.  If
you get any fatal errors, check the config.log.  My workaround for this is
adding the following to the beginning of that ./configure line:

	CFLAGS=$CFLAGS\ -L/usr/local/lib\ -L/usr/X11R6/lib\ -I/usr/local/include\
-I/usr/X11R6/include <configure command above>

Hopefully this will be worked out in the future.

Once everything looks ok, issue a make.  Once completed, choose a location to
keep these .so's, like /usr/local/lib/php, cd into the modules directory, and
cp *.so /usr/local/lib/php/.  You may wish to strip -g those modules also.

Now, the key here is your php.ini.  Copy the php.ini-dist file from the php
source directory to
/config/file/path/you/chose/when/you/built/the/apache/module/php.ini.  In this
file, change the extension_dir to the /path/you/copied/the/*.so's.

If you wish for php to load any of these at startup, add extension=name.so to
the php.ini.  To load these at runtime, this seems the most effective way.

	Say I need the mysql support.  At the beginning of my script, I'd have this:
		if (!function_defined('mysql_query')) { dl('mysql.so'); }
	Please note the ! :)

You may wish to ldd all of these .so's.. they will kill the httpd children if
they are dl()'d and can't find a library they need (it's better than killing
apache altogether though, eh?).

Feel free to email me with any questions about this process or using these
shared objects.  I welcome any suggestions for improving upon this too.
----------------