A long time ago I had to solve the problem of running PHP4 and PHP5 on the same machine.
After a bit of searching I came across a posting in the german PHP-Mailing-List at http://www.phpbar.de where Norbert Pfeiffer described a possible way.
I choose to adapt my apachectl-file so that not one single instance of the apache-webserver was started but 2 instances. One of which listened on port 80, the other one on port 81.
This of course requires a unique httpd.conf for each of the instances.
So here is my version of an apachectl-file.
#!/bin/sh
#
# Copyright 1999-2004 The Apache Software Foundation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
# Apache control script designed to allow an easy command line interface
# to controlling Apache. Written by Marc Slemko, 1997/08/23
#
# The exit codes returned are:
# 0 - operation completed successfully
# 1 -
# 2 - usage error
# 3 - httpd could not be started
# 4 - httpd could not be stopped
# 5 - httpd could not be started during a restart
# 6 - httpd could not be restarted during a restart
# 7 - httpd could not be restarted during a graceful restart
# 8 - configuration syntax error
#
# When multiple arguments are given, only the error from the _last_
# one is reported. Run "apachectl help" for usage info
#
#
# |||||||||||||||||||| START CONFIGURATION SECTION ||||||||||||||||||||
# -------------------- --------------------
#
# the path to your PID file
PIDFILE=/var/run/httpd.pid
PIDFILE2=/var/run/httpd2.pid
PIDFILE3=/var/run/httpd3.pid
#
# the path to your httpd binary, including options if necessary
HTTPD="/usr/sbin/httpd -f /etc/httpd/httpd.80.conf"
HTTPD2="/usr/sbin/httpd -f /etc/httpd/httpd.81.conf"
HTTPD3="/usr/sbin/httpd -f /etc/httpd/httpd.8888.conf"
#.
# a command that outputs a formatted text version of the HTML at the
# url given on the command line. Designed for lynx, however other
# programs may work.
LYNXBIN="curl"
LYNX="$LYNXBIN -dump"
#
# the URL to your server's mod_status status page. If you do not
# have one, then status and fullstatus will not work.
STATUSURL="http://localhost/server-status"
#
# -------------------- --------------------
# |||||||||||||||||||| END CONFIGURATION SECTION ||||||||||||||||||||
ERROR=0
ARGV="$@"
if [ "x$ARGV" = "x" ] ; then
ARGS="help"
fi
for ARG in $@ $ARGS
do
# check for pidfile
if [ -f $PIDFILE ] ; then
PID=`cat $PIDFILE`
if [ "x$PID" != "x" ] && kill -0 $PID 2>/dev/null ; then
STATUS="httpd (pid $PID) running"
RUNNING=1
else
STATUS="httpd (pid $PID?) not running"
RUNNING=0
fi
else
STATUS="httpd (no pid file) not running"
RUNNING=0
fi
#
# Check for second apache
if [ -f $PIDFILE2 ] ; then
PID2=`cat $PIDFILE2`
if [ "x$PID2" != "x" ] && kill -0 $PID2 2>/dev/null ; then
STATUS="httpd (pid $PID2) running"
RUNNING2=1
else
STATUS="httpd (pid $PID2?) not running"
RUNNING2=0
fi
else
STATUS="httpd (no pid file) not running"
RUNNING2=0
fi
#
# Check for third apache
if [ -f $PIDFILE3 ]; then
PID3=`cat $PIDFILE3`
if [ "x$PID3" != "x" ] && kill -0 $PID3 2>/dev/null ; then
STATUS="httpd (pid $PID3) running"
RUNNING3=1
else
STATUS="httpd (pid $PID3?) not running"
RUNNING3=0
fi
else
STATUS="httpd (no pid file) not running"
RUNNING3=0
fi
case $ARG in
start)
if [ $RUNNING -eq 1 ]; then
echo "$0 $ARG: httpd (pid $PID) already running"
continue
fi
if $HTTPD ; then
echo "$0 $ARG: httpd started"
else
echo "$0 $ARG: httpd could not be started"
ERROR=3
fi
if [ $RUNNING2 -eq 1 ]; then
echo "$0 $ARG: httpd (pid $PID2) already running"
continue
fi
if $HTTPD2 ; then
echo "$0 $ARG: httpd2 started"
else
echo "$0 $ARG: httpd2 could not be started"
ERROR2=3
fi
if [ $RUNNING3 -eq 1 ]; then
echo "$0 $ARG: httpd (pid $PID3) already running"
continue
fi
if $HTTPD3 ; then
echo "$0 $ARG: httpd3 started"
else
echo "$0 $ARG: httpd3 could not be started"
ERROR3=3
fi
;;
stop)
if [ $RUNNING -eq 0 ]; then
echo "$0 $ARG: $STATUS"
continue
fi
if kill $PID ; then
echo "$0 $ARG: httpd stopped"
else
echo "$0 $ARG: httpd could not be stopped"
ERROR=4
fi
if [ $RUNNING2 -eq 0 ]; then
echo "$0 $ARG: $STATUS"
continue
fi
if kill $PID2 ; then
echo "$0 $ARG: httpd2 stopped"
else
echo "$0 $ARG: httpd2 could not be stopped"
ERROR2=4
fi
if [ $RUNNING3 -eq 0 ]; then
echo "$0 $ARG: $STATUS"
continue
fi
if kill $PID3; then
echo "$0 $ARG: httpd3 stopped"
else
echo "$0 $ARG: httpd3 could not be stopped"
ERROR3=4
fi
;;
restart)
if [ $RUNNING -eq 0 ]; then
echo "$0 $ARG: httpd not running, trying to start"
if $HTTPD ; then
echo "$0 $ARG: httpd started"
else
echo "$0 $ARG: httpd could not be started"
ERROR=5
fi
else
if $HTTPD -t >/dev/null 2>&1; then
if kill -HUP $PID ; then
echo "$0 $ARG: httpd restarted"
else
echo "$0 $ARG: httpd could not be restarted"
ERROR=6
fi
else
echo "$0 $ARG: configuration broken, ignoring restart"
echo "$0 $ARG: (run 'apachectl configtest' for details)"
ERROR=6
fi
fi
if [ $RUNNING2 -eq 0 ]; then
echo "$0 $ARG: httpd2 not running, trying to start"
if $HTTPD2 ; then
echo "$0 $ARG: httpd2 started"
else
echo "$0 $ARG: httpd2 could not be started"
ERROR=5
fi
else
if $HTTPD2 -t >/dev/null 2>&1; then
if kill -HUP $PID2 ; then
echo "$0 $ARG: httpd2 restarted"
else
echo "$0 $ARG: httpd2 could not be restarted"
ERROR2=6
fi
else
echo "$0 $ARG: configuration broken, ignoring restart"
echo "$0 $ARG: (run 'apachectl configtest' for details)"
ERROR2=6
fi
fi
if [ $RUNNING3 -eq 0 ]; then
echo "$0 $ARG: httpd3 not running, trying to start"
if $HTTPD3 ; then
echo "$0 $ARG: httpd3 started"
else
echo "$0 $ARG: httpd3 could not be started"
ERROR3=5
fi
else
if $HTTPD3 -t >/dev/null 2>&1; then
if kill -HUP $PID3 ; then
echo "$0 $ARG: httpd3 restarted"
else
echo "$0 $ARG: httpd3 could not be restarted"
ERROR3=6
fi
else
echo "$0 $ARG: configuration broken, ignoring restart"
echo "$0 $ARG: (run 'apachectl configtest' for details)"
ERROR3=6
fi
fi
;;
graceful)
if [ $RUNNING -eq 0 ]; then
echo "$0 $ARG: httpd not running, trying to start"
if $HTTPD ; then
echo "$0 $ARG: httpd started"
else
echo "$0 $ARG: httpd could not be started"
ERROR=5
fi
else
if $HTTPD -t >/dev/null 2>&1; then
if kill -USR1 $PID ; then
echo "$0 $ARG: httpd gracefully restarted"
else
echo "$0 $ARG: httpd could not be restarted"
ERROR=7
fi
else
echo "$0 $ARG: configuration broken, ignoring restart"
echo "$0 $ARG: (run 'apachectl configtest' for details)"
ERROR=7
fi
fi
if [ $RUNNING2 -eq 0 ]; then
echo "$0 $ARG: httpd2 not running, trying to start"
if $HTTPD2 ; then
echo "$0 $ARG: httpd2 started"
else
echo "$0 $ARG: httpd2 could not be started"
ERROR2=5
fi
else
if $HTTPD2 -t >/dev/null 2>&1; then
if kill -USR1 $PID2 ; then
echo "$0 $ARG: httpd2 gracefully restarted"
else
echo "$0 $ARG: httpd2 could not be restarted"
ERROR2=7
fi
else
echo "$0 $ARG: configuration broken, ignoring restart"
echo "$0 $ARG: (run 'apachectl configtest' for details)"
ERROR2=7
fi
fi
if [ $RUNNING3 -eq 0 ]; then
echo "$0 $ARG: httpd3 not running, trying to start"
if $HTTPD3 ; then
echo "$0 $ARG: httpd3 started"
else
echo "$0 $ARG: httpd3 could not be started"
ERROR3=5
fi
else
if $HTTPD3 -t >/dev/null 2>&1; then
if kill -USR1 $PID3 ; then
echo "$0 $ARG: httpd3 gracefully restarted"
else
echo "$0 $ARG: httpd3 could not be restarted"
ERROR3=7
fi
else
echo "$0 $ARG: configuration broken, ignoring restart"
echo "$0 $ARG: (run 'apachectl configtest' for details)"
ERROR3=7
fi
fi
;;
status)
case "`which $LYNXBIN`" in
*"no "*) echo "Status doesn't work without lynx, try fullstatus" ;;
*) $LYNX $STATUSURL | awk ' /process$/ { print; exit } { print } ';;
esac
case "`which $LYNXBIN`" in
*"no "*) echo "Status doesn't work without lynx, try fullstatus" ;;
*) $LYNX $STATUSURL | awk ' /process$/ { print; exit } { print } ';;
esac
;;
fullstatus)
case "`which $LYNXBIN`" in
*"no "*) open $STATUSURL ;;
*) $LYNX $STATUSURL ;;
esac
;;
configtest)
if $HTTPD -t; then
:
else
ERROR=8
fi
if $HTTPD2 -t; then
:
else
ERROR2=8
fi
if $HTTPD3 -t; then
:
else
ERROR3=8
fi
;;
*)
echo "usage: $0 (start|stop|restart|fullstatus|status|graceful|configtest|help)"
So you noted that this file starts three Server-insances? Yepp. Currently I need PHP4 for some legacy-stuff (runs on port 8888), PHP5 for the current development (still runs on port 81) and for RT I needed another server instance as the PHP4-Module and the Perl-Module somehow did not want to work together. So that was the easiest way to fix that for me.