项目中要用到zend Optimizer,但是目前只支持php5.2,Ubuntu默认安装的php版本为5.3,找了好多方法,终于借助下面这篇文章的方法成功的安装了5.2及5.3两个版本的php
文章地址:http://zgadzaj.com/how-to-install-php-53-and-52-together-on-ubuntu-1204
Although Drupals 7+ run smoothly on PHP 5.3, Drupal 6 still feels much better with PHP 5.2. Even though D6 core is compatible with PHP 5.3 for quite some time now, a lot of contributes modules still get nasty hiccup when asked to run on the newer version. Therefore developing for both D7 and D6 at the same time becomes much less painful when running both versions of PHP in parallel.
One way of doing it is using mod_php5 Apache module to serve PHP 5.3 applications, while running PHP 5.2 applications using fastcgi module. Under Ubuntu 12.04 this can be achieved by installing PHP 5.3 from the repositories and manually compiling and installing PHP 5.2 afterwards.
Installing PHP 5.3 from repositories is fairly easy process, which you most probably already have under your belt, so let's just say that it looks more or less like this:
sudo apt-get install php5 php5-common php5-cli php5-dev php5-mysql phpmyadmin php5-pgsql phppgadmin php5-gd php5-mcrypt php5-curl php-pear libapache2-mod-php5 php5-xdebug php5-codesniffer
What is much more interesting though, and what this post will focus on, is how to add PHP 5.2 to the whole picture and make both those versions work nicely together.
Let's then start with downloading PHP 5.2 sources from Unsupported Historical Releases list.
I have originally started with version 5.2.10 (as it is the same version that we have on our production servers), but then was stopped short by OpenSSL error during configuration stage:
/usr/include/openssl/conf.h:132:7: note: expected 'struct lhash_st_CONF_VALUE *' but argument is of type 'int *'
make: *** [ext/openssl/openssl.lo] Error 1
to which I was not able to find any good fix (relatively easy to apply anyway), so finally ended up with the most recent version from 5.2 branch - 5.2.17, where those errors haven't occured anymore.
Let's then download and uncompress PHP sources into ~/Downloads/php-5.2.17
directory:
mkdir -p ~/Downloads/php-5.2.17
cd ~/Downloads/php-5.2.17
wget http://museum.php.net/php5/php-5.2.17.tar.gz
tar zxf php-5.2.17.tar.gz
Time to configure the package. Example ./configure
call could look as follows:
sudo ./configure \
--prefix=/usr/share/php52 \
--datadir=/usr/share/php52 \
--mandir=/usr/share/man \
--bindir=/usr/bin/php52 \
--with-libdir=lib64 \
--includedir=/usr/include \
--sysconfdir=/etc/php52/apache2 \
--with-config-file-path=/etc/php52/cli \
--with-config-file-scan-dir=/etc/php52/conf.d \
--localstatedir=/var \
--disable-debug \
--with-regex=php \
--disable-rpath \
--disable-static \
--disable-posix \
--with-pic \
--with-layout=GNU \
--with-pear=/usr/share/php \
--enable-calendar \
--enable-sysvsem \
--enable-sysvshm \
--enable-sysvmsg \
--enable-bcmath \
--with-bz2 \
--enable-ctype \
--with-db4 \
--without-gdbm \
--with-iconv \
--enable-exif \
--enable-ftp \
--enable-cli \
--with-gettext \
--enable-mbstring \
--with-pcre-regex=/usr \
--enable-shmop \
--enable-sockets \
--enable-wddx \
--with-libxml-dir=/usr \
--with-zlib \
--with-kerberos=/usr \
--with-openssl=/usr \
--enable-soap \
--enable-zip \
--with-mhash \
--with-exec-dir=/usr/lib/php5/libexec \
--without-mm \
--with-curl=shared,/usr \
--with-zlib-dir=/usr \
--with-gd=shared,/usr \
--enable-gd-native-ttf \
--with-gmp=shared,/usr \
--with-jpeg-dir=shared,/usr \
--with-xpm-dir=shared,/usr/X11R6 \
--with-png-dir=shared,/usr \
--with-freetype-dir=shared,/usr \
--with-ttf=shared,/usr \
--with-t1lib=shared,/usr \
--with-ldap=shared,/usr \
--with-mysql=shared,/usr \
--with-mysqli=shared,/usr/bin/mysql_config \
--with-pgsql=shared,/usr \
--with-pspell=shared,/usr \
--with-unixODBC=shared,/usr \
--with-xsl=shared,/usr \
--with-snmp=shared,/usr \
--with-sqlite=shared,/usr \
--with-tidy=shared,/usr \
--with-xmlrpc=shared \
--enable-pdo=shared \
--without-pdo-dblib \
--with-pdo-mysql=shared,/usr \
--with-pdo-pgsql=shared,/usr \
--with-pdo-odbc=shared,unixODBC,/usr \
--with-pdo-dblib=shared,/usr \
--enable-force-cgi-redirect --enable-fastcgi \
--with-libdir=/lib/x86_64-linux-gnu \
--with-pdo-sqlite=shared \
--with-sqlite=shared \
--enable-ipv6 \
--with-mcrypt \
--with-imap-ssl
Obviously you need to adapt it to yur specific needs by adding and/or removing relevant options. You can read more about options you want (or don't want) to include in PHP core configure options documentation.
Now, that probably didn't work out of the box, did it?
In most cases quite a lot of dependencies will be missing. You can try to take care of them in one shot, if you don't care too much about installing a little too much compared to what is really needed:
sudo apt-get install libxml2-dev libpcre3-dev libbz2-dev libcurl4-openssl-dev libdb4.8-dev libjpeg-dev libpng12-dev libxpm-dev libfreetype6-dev libmysqlclient-dev postgresql-server-dev-9.1 libt1-dev libgd2-xpm-dev libgmp-dev libsasl2-dev libmhash-dev unixodbc-dev freetds-dev libpspell-dev libsnmp-dev libtidy-dev libxslt1-dev libmcrypt-dev
You can also remedy missing dependencies one by one, and install only those packages that are really needed.
Let's go through some of the possible errors then (you can skip to the next section if your ./configure
finished without any errors and displayed nice Thank you for using PHP at the end of its execution):
This error message suggests you don't have libxml2 installed. What it really means though is that you don't have its development version installed!
Let's then search what we can find in available packages, what could help us resolve this issue:
$ apt-cache search libxml2 | grep dev
libcroco3-dev - Cascading Style Sheet (CSS) parsing and manipulation toolkit
libxml++2.6-dev - C++ interface to the GNOME XML library (libxml2)
libxml2-dev - Development files for the GNOME XML library
libgdome2-cpp-smart-dev - C++ bindings for GDome2 DOM implementation
libgdome2-dev - Development files for libgdome2
libgdome2-ocaml-dev - OCaml bindings for GDome2 DOM implementation
libgtkmathview-dev - rendering engine for MathML documents
libsp-gxmlcpp-dev - S+P C++ wrapper for Gnome libxml2/libxslt
What we are interested in here is libxml2-dev
, let's install it then:
sudo apt-get install libxml2-dev
sudo apt-get install libpcre3-dev
sudo apt-get install libbz2-dev
sudo apt-get install libcurl4-openssl-dev
sudo apt-get install libdb4.8-dev
sudo apt-get install libjpeg-dev
sudo apt-get install libpng12-dev
sudo apt-get install libxpm-dev
sudo apt-get install libfreetype6-dev
sudo apt-get install postgresql-server-dev-9.1
apt-cache search
especially in case of this error, as there could be later version of PostgreSQL available. sudo apt-get install libt1-dev
sudo apt-get install libgd2-xpm-dev
sudo apt-get install libgmp-dev
sudo apt-get install libmysqlclient-dev
sudo apt-get install libsasl2-dev
sudo apt-get install libmhash-dev
sudo apt-get install unixodbc-dev
sudo apt-get install freetds-dev
sudo apt-get install libpspell-dev
sudo apt-get install libsnmp-dev
sudo apt-get install libtidy-dev
sudo apt-get install libxslt1-dev
sudo apt-get install libmcrypt-dev
Add following switch to your ./configure
options (optionally updating the path to reflect your system):
--with-libdir=/lib/x86_64-linux-gnu
Add following switches to your ./configure
options:
--with-pdo-sqlite=shared
--with-sqlite=shared
Everything configured properly and without errors? Then it is time to compile (and go for a coffee while it is running):
sudo make
Yes, things can go awry here too. And most probably will.
There are two make errors and one warning you are most probably going to experience:
This is due to PHP bug #54736, which could be easily resolved using patch debian_patches_disable_SSLv2_for_openssl_1_0_0.patch attached to that bug report.
Download this patch to your ~/Downloads/php-5.2.17
directory, and execute:
patch -p1 < debian_patches_disable_SSLv2_for_openssl_1_0_0.patch.patch
You should see friendly success messages like these:
This time it's PHP bug #50990. In one of comments there susan dot smith dot dev at gmail dot com suggested solution which works and does its magic:
I solved replacing the outdated __GMP_BITS_PER_MP_LIMB defined constant with GMP_LIMB_BITS. The latter is present in all previous versions, and MPIR define it too.
You have to edit file ext/gmp/gmp.c
and replace one occurence of __GMP_BITS_PER_MP_LIMB
with GMP_LIMB_BITS
, in my case it was in line 1399.
Finally PHP bug #53568, with a pretty easy fix: edit file ext/zip/lib/zip_dirent.c
and in line 478 replace:
memset(&tm, sizeof(tm), 0);
memset(&tm, 0, sizeof(tm));
There, no more errors!
The simplest way of installing your new shiny PHP 5.2 now is:
sudo make install
Alternatively, if you plan to repeat the same installation again on other machines, or just want to keep the installation package file for the future, you can run:
sudo checkinstall
.deb
package file in your current directory.
Whichever way you choose, now you have PHP 5.2 installed in /usr/bin/php52
The /etc/php52/apache2/
configuration directory for PHP 5.2 should have already been created during the installation process (create it now if it is not the case). Now you need to let PHP 5.2 use the same extensions as your version 5.3 is using:
sudo ln -s /etc/php5/conf.d /etc/php52
sudo ln -s /etc/php5/cli /etc/php52
Copy example php.ini-recommended
file provided with PHP installation into its new directory (which will be defined in the next step):
sudo cp php.ini-recommended /etc/php52/apache2/php.ini
Next thing to do is to set up Apache to run PHP 5.2 using FastCGI. Start with installing fastcgi
module:
sudo apt-get install libapache2-mod-fastcgi
Make sure all required modules are enabled and restart Apache:
sudo a2enmod cgi fastcgi actions
sudo service apache2 restart
Create a wrapper script called php52-cgi
to run the fastcgi enabled version of PHP and place it under /usr/lib/cgi-bin/
, with the following content:
#!/bin/sh
PHPRC="/etc/php52/apache2/"
export PHPRC
PHP_FCGI_CHILDREN=4
export PHP_FCGI_CHILDREN
PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_MAX_REQUESTS
exec /usr/bin/php52/php-cgi
The PHPRC
parameter tells PHP 5.2 where to look for a php.ini
.
The PHP_FCGI_CHILDREN
pre-forks threads with the FastCGI process manager.
The PHP_FCGI_MAX_REQUESTS
limits the requests.
Finally the exec
executes php. You can read more about this on FastCGI site.
Make sure the file is executable:
sudo chmod +x /usr/lib/cgi-bin/php52-cgi
Finally create new include file /etc/apache2/php52.conf
, which will be used by those virtual hosts that need to run off PHP 5.2. Add the following content to it:
# Include file for virtual hosts that need to run PHP 5.2
<FilesMatch "\.php">
SetHandler application/x-httpd-php5
</FilesMatch>
ScriptAlias /php52-cgi /usr/lib/cgi-bin/php52-cgi
Action application/x-httpd-php5 /php52-cgi
AddHandler application/x-httpd-php5 .php
The FilesMatch
forces the handler to execute files with the suffix .php
. This must be set, because if mod_php with PHP 5.3 is installed, the module interprets the php file and not the cgi script.
The ScriptAlias
sets the path to the cgi script.
The AddHandler
registers a new handler.
The Action
activates the cgi script for the files passed from the handler.
Only one thing left to do now - for all hosts which you want to be running on PHP 5.2 , edit their configuration file and add the following line inside their <VirtualHost>
definition:
Include php52.conf
and reload new configuration:
sudo service apache2 reload
Final result? For all you Drupallers out there - you successfully managed to change this:
into this:
Well done!