Bir geliştirme LAMP sunucusunda PHP 5.x'in birden çok sürümü nasıl çalıştırılabilir?


81

PHP uygulamalarımı PHP 5.0.0 ve PHP 5.2.8 gibi birden çok PHP 5.x sürümüyle test etmem gerekiyor.

Bir geliştirme LAMP sunucusunu yapılandırarak, uygulamaları birden çok PHP5 sürümüyle hızlı bir şekilde test edebilmemin bir yolu var mı?


Bir PATH değişkeni kullanabilmelisiniz, ancak% 100 değilim, bu yüzden tekrar için cevap vermiyorum
Malfist

ISPConfig 3 (Ubuntu 12.10) ile Çoklu PHP Versiyonları (PHP-FPM ve FastCGI) Nasıl Kullanılır - @ hek2mgl: Geliştirme araçlarıyla ilgili sorular konu dışı değildir.
hakre

@hakre Kabul edildi, FPM kullanmak, Apache modülü olarak yüklendiğinde birden fazla sürümün birbirini etkileme olasılığını
azaltacaktır

@Jack: Argh, Apache Modülü değil, FCGI;)
hakre

Şimdiye kadar phpbrew ve php- version'u denedim ama ikisi de PHP'yi derleyemiyor gibi görünüyor.
güzel göt

Yanıtlar:


17

Bunu yapmanın bir yolu, ana php sürümünüzü mod_php ile kurmak ve diğerlerini farklı portlarda (yani 81, 82, 83 vb.) Hızlı cgi aracılığıyla çalıştırmaktır. Bu, tamamen tutarlı davranışı garanti etmez.


32
Bir fikir: PHP 5.2.1 için 10521 numaralı bağlantı noktasını kullanın. 5.0.0 için 10500 :) kullanın
Wayne

2
Diğer bir seçenek, farklı yollar altında CGI (veya FastCGI) kullanarak çalıştırmak olabilir - yani / cgi500 /, / cgi528 /, ...
Grey Panther

Debian kullanıyorsanız ve paketleme kullanmak istiyorsanız, PHP sürümünüzü tutan bir chroot sistemi oluşturmak için debootstrap kullanmanızı ve ardından chroot'lu sistem içinde Apache'yi yapılandırmanızı öneririm.
Max Tsepkov

23

CentOS ile bunu, PHP'nin bir sürümü için fastcgi ve diğeri için php-fpm kombinasyonunu kullanarak burada açıklandığı gibi yapabilirsiniz:

https://web.archive.org/web/20130707085630/http://linuxplayer.org/2011/05/intall-multiple-version-of-php-on-one-server

CentOS 5.6'ya göre, yalnızca Apache için

1. rpmforge ve epel yum deposunu etkinleştirin

wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm
wget http://download.fedora.redhat.com/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
sudo rpm -ivh rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm
sudo rpm -ivh epel-release-5-4.noarch.rpm

2. php-5.1'i kurun

CentOS / RHEL 5.x serisi kutuda php-5.1'e sahiptir, basitçe yum ile kurun, örneğin:

sudo yum install php php-mysql php-mbstring php-mcrypt

3. php 5.2 ve 5.3'ü kaynaktan derleyin ve kurun

Php 5.2 ve 5.3 için internette birçok rpm paketi bulabiliriz. Bununla birlikte, hepsi CentOS ile gelen php ile çelişir, bu yüzden onları soure'den kurup kursak iyi olur, bu zor değil, önemli olan php'yi farklı bir yere kurmak.

Ancak, php'yi bir apache modülü olarak kurarken, aynı anda sadece bir php sürümünü kullanabiliriz. Aynı sunucuda aynı anda farklı php sürümünü çalıştırmamız gerekirse, örneğin farklı sanal ana bilgisayarların farklı php sürümlerine ihtiyacı olabilir. Neyse ki, harika FastCGI ve PHP-FPM yardımcı olabilir.

Fastcgi etkin olarak php-5.2 derleyin ve kurun

1) Gerekli geliştirme paketlerini kurun

yum install gcc libxml2-devel bzip2-devel zlib-devel \
    curl-devel libmcrypt-devel libjpeg-devel \
    libpng-devel gd-devel mysql-devel

2) Derleyin ve kurun

wget http://cn.php.net/get/php-5.2.17.tar.bz2/from/this/mirror
tar -xjf php-5.2.17.tar.bz2
cd php-5.2.17
./configure --prefix=/usr/local/php52 \
    --with-config-file-path=/etc/php52 \
    --with-config-file-scan-dir=/etc/php52/php.d \
    --with-libdir=lib64 \
    --with-mysql \
    --with-mysqli \
    --enable-fastcgi \
    --enable-force-cgi-redirect \
    --enable-mbstring \
    --disable-debug \
    --disable-rpath \
    --with-bz2 \
    --with-curl \
    --with-gettext \
    --with-iconv \
    --with-openssl \
    --with-gd \
    --with-mcrypt \
    --with-pcre-regex \
    --with-zlib
make -j4 > /dev/null
sudo make install
sudo mkdir /etc/php52
sudo cp php.ini-recommended /etc/php52/php.ini

3) bir fastcgi sarmalayıcı komut dosyası oluşturun

/usr/local/php52/bin/fcgiwrapper.sh dosyası oluştur

#!/bin/bash
PHP_FCGI_MAX_REQUESTS=10000
export PHP_FCGI_MAX_REQUESTS
exec /usr/local/php52/bin/php-cgi
chmod a+x /usr/local/php52/bin/fcgiwrapper.sh
Build and install php-5.3 with fpm enabled

wget http://cn.php.net/get/php-5.3.6.tar.bz2/from/this/mirror
tar -xjf php-5.3.6.tar.bz2 
cd php-5.3.6
./configure --prefix=/usr/local/php53 \
    --with-config-file-path=/etc/php53 \
    --with-config-file-scan-dir=/etc/php53/php.d \
    --enable-fpm \
    --with-fpm-user=apache \
    --with-fpm-group=apache \
    --with-libdir=lib64 \
    --with-mysql \
    --with-mysqli \
    --enable-mbstring \
    --disable-debug \
    --disable-rpath \
    --with-bz2 \
    --with-curl \
    --with-gettext \
    --with-iconv \
    --with-openssl \
    --with-gd \
    --with-mcrypt \
    --with-pcre-regex \
    --with-zlib 

make -j4 && sudo make install
sudo mkdir /etc/php53
sudo cp php.ini-production /etc/php53/php.ini

sed -i -e 's#php_fpm_CONF=\${prefix}/etc/php-fpm.conf#php_fpm_CONF=/etc/php53/php-fpm.conf#' \
    sapi/fpm/init.d.php-fpm
sudo cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
sudo chmod a+x /etc/init.d/php-fpm
sudo /sbin/chkconfig --add php-fpm
sudo /sbin/chkconfig php-fpm on

sudo cp sapi/fpm/php-fpm.conf /etc/php53/

Php-fpm'yi yapılandırın

/Etc/php53/php-fpm.conf'u düzenleyin, bazı ayarları değiştirin. Bu adım esas olarak bazı ayarların açıklamasını kaldırmak içindir, isterseniz değeri ayarlayabilirsiniz.

pid = run/php-fpm.pid
listen = 127.0.0.1:9000
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20

Ardından fpm'yi başlatın

sudo /etc/init.d/php-fpm start

Mod_fastcgi'yi, mod_fcgid'i kurun ve kurun

sudo yum install libtool httpd-devel apr-devel
wget http://www.fastcgi.com/dist/mod_fastcgi-current.tar.gz
tar -xzf mod_fastcgi-current.tar.gz
cd mod_fastcgi-2.4.6
cp Makefile.AP2 Makefile
sudo make top_dir=/usr/lib64/httpd/ install
sudo sh -c "echo 'LoadModule fastcgi_module modules/mod_fastcgi.so' > /etc/httpd/conf.d/mod_fastcgi.conf"
yum install mod_fcgid

Sanal konakları kurun ve test edin

1) Aşağıdaki satırı / etc / hosts dosyasına ekleyin

127.0.0.1 web1.example.com web2.example.com web3.example.com

2) Web belgesi kökü oluşturun ve altına bir index.php bırakın, phpinfo'nun kullanıcı köküne geçişini gösterin, çalıştırın

mkdir /var/www/fcgi-bin
for i in {1..3}; do
    web_root=/var/www/web$i
    mkdir $web_root
    echo "<?php phpinfo(); ?>" > $web_root/index.php
done

Not: Boş / var / www / fcgi-bin dizini gereklidir, DAHA SONRA KALDIRMAYIN

3) Apache yapılandırma dosyası oluşturun (httpd.conf'a ekleyin)

NameVirtualHost *:80

# module settings
# mod_fcgid
<IfModule mod_fcgid.c>
        idletimeout 3600
        processlifetime 7200
        maxprocesscount 17
        maxrequestsperprocess 16
        ipcconnecttimeout 60 
        ipccommtimeout 90
</IfModule>
# mod_fastcgi with php-fpm
<IfModule mod_fastcgi.c>
        FastCgiExternalServer /var/www/fcgi-bin/php-fpm -host 127.0.0.1:9000
</IfModule>


# virtual hosts...

#################################################################
#1st virtual host, use mod_php, run php-5.1
#################################################################
<VirtualHost *:80>
        ServerName web1.example.com
        DocumentRoot "/var/www/web1"

        <ifmodule mod_php5.c>
                <FilesMatch \.php$>
                        AddHandler php5-script .php
                </FilesMatch>
        </IfModule>

        <Directory "/var/www/web1">
                DirectoryIndex index.php index.html index.htm
                Options -Indexes FollowSymLinks
                Order allow,deny
                Allow from all
        </Directory>

</VirtualHost>
#################################################################
#2nd virtual host, use mod_fcgid, run php-5.2
#################################################################
<VirtualHost *:80>
        ServerName web2.example.com
        DocumentRoot "/var/www/web2"

        <IfModule mod_fcgid.c>
                AddHandler fcgid-script .php
                FCGIWrapper /usr/local/php52/bin/fcgiwrapper.sh
        </IfModule>

        <Directory "/var/www/web2">
                DirectoryIndex index.php index.html index.htm
                Options -Indexes FollowSymLinks +ExecCGI
                Order allow,deny
                Allow from all
        </Directory>

</VirtualHost>
#################################################################
#3rd virtual host, use mod_fastcgi + php-fpm, run php-5.3
#################################################################
<VirtualHost *:80>
        ServerName web3.example.com
        DocumentRoot "/var/www/web3"


        <IfModule mod_fastcgi.c>
                ScriptAlias /fcgi-bin/ /var/www/fcgi-bin/
                AddHandler php5-fastcgi .php
                Action php5-fastcgi /fcgi-bin/php-fpm
        </IfModule>

        <Directory "/var/www/web3">
                DirectoryIndex index.php index.html index.htm
                Options -Indexes FollowSymLinks +ExecCGI
                Order allow,deny
                Allow from all
        </Directory>

</VirtualHost>

4) apache'yi yeniden başlatın. phpinfo'yu görüntülemek ve sonucu doğrulamak için 3 siteyi saygıyla ziyaret edin. yani:

http://web1.example.com
http://web2.example.com
http://web3.example.com

Her şey yolunda ise, istediğiniz php sürümüyle yeni sanal konak oluşturmak için 3 sanal ana bilgisayardan birini şablon olarak kullanabilirsiniz.


1
Ancak bu yalnızca bağlantıya dayalı bir cevaptır. Lütfen tamamen diğer siteye güvenmek yerine ilgili ayrıntıları yanıta dahil edin. Bağlantılar, kaybolabilecekleri can sıkıcı bir soruna sahiptir ve bu şekilde SO hala ilgili bilgileri içermez.
Maarten Bodewes

CloudLinux'a bakmak isteyebilirsiniz. Ücretli bir çözümdür, ancak uygun fiyatlıdır.
transilvlad

1
Doğru cevap! İşte Ubuntu için de aynı çözüm: howtoforge.com/…
Tobias Gaertner

10

Birden fazla apache + php örneğine sahip olmak hiçbir zaman hayal gücümü gıdıklamadı, ama muhtemelen bunu yapmanın en kolay yolu. KISS gibi hissetmiyorsanız ... işte size bir fikir.

Apache'nizi kurun ve çalıştırın ve debian gibi yapılandırmayı deneyin ve ubuntu yapın, örneğin, yüklü modüller için dizinlere sahip olun. Apache conf'iniz aşağıdaki gibi satırları kullanabilir:

Include /etc/apache2/mods-enabled/*.load
Include /etc/apache2/mods-enabled/*.conf

Sonra ilk php sürümünüzü oluşturun ve ona sürüm numarasını açıkça içeren bir önek verin, örneğin, /usr/local/php/5.2.8, /usr/local/php/5.2.6 ...

Conf / load şunun gibi görünür:

php5.2.6.load

LoadModule php5_module /usr/local/php/5.2.6/libphp5.so

php5.2.8.load

LoadModule php5_module /usr/local/php/5.2.8/libphp5.so

Sürümler arasında geçiş yapmak için yapmanız gereken tek şey, yükleme ve conf dosyalarını apache'nin başka bir sürüm için dahil ettiği dizinden değiştirmek. Bunu basit bir bash betiği ile otomatikleştirebilirsiniz (asıl dosyayı silin, alternatif sürümler dosyasını yerinde kopyalayın ve apache'yi yeniden başlatın.

Bu kurulumun bir avantajı, her şeyin uygun olmasıdır, bu yüzden php.ini'yi seçenekler ve modüller açısından aynı tuttuğunuz sürece (yine de CGI ile yapmak zorunda kalırsınız). Hepsi SAPI'den geçiyor. Uygulamalarınızın herhangi bir değişikliğe ihtiyacı olmayacak ve ilgili URL'leri kullanmaları gerekmeyecektir.

Bunun işe yarayacağını düşünüyorum , ama yine de, denemedim ve seninle aynı gereksinimlere sahip olmadığım için bunu yapma ihtimalim de yok. Yine de denersen yorum yap.


8

Not: Aşağıdaki yöntem pencerelerde çalışacaktır.

Alternatif bir yöntem (bir seferde tek bir PHP sürümünü çalıştırmak uygunsa), her biri farklı bir PHP sürümü kullanacak olan birden çok Apache hizmetini tanımlamaktır.

Öncelikle Apache yapılandırma dosyasındaki koşulları kullanın:

 <ifdefine php54>
    SetEnv PHPRC C:/apache/php54/
    ScriptAlias /php/ "C:/apache/php54/"
    AddType application/x-httpd-php .php
    Action application/x-httpd-php "/php/php-cgi.exe"
</ifdefine>

<ifdefine php55>
    SetEnv PHPRC C:/apache/php55/
    ScriptAlias /php/ "C:/apache/php55/"
    AddType application/x-httpd-php .php
    Action application/x-httpd-php "/php/php-cgi.exe"
</ifdefine>

Şimdi httpd.exe'yi kullanarak komut satırından iki ayrı hizmet oluşturun (yöneticiye yükseltildi):

httpd.exe -k install -n Apache224_php54 -D php54

httpd.exe -k install -n Apache224_php55 -D php55

Artık yukarıdaki hizmetlerden birini aynı anda başlatabilirsiniz (birini başlatmadan önce birini kapatmalısınız).

Apache'yi daha önce hizmet olarak yüklediyseniz, aşağıdaki komutu kullanarak bunu kaldırabilirsiniz (hizmet adını kullandığınız adla değiştirin):

apache -k uninstall -n Apache224

Bir başka not da, hizmetleri gerektiği gibi başlatmak ve durdurmak için kişisel olarak "Seobiseu" adlı bir "bildirim alanı simge programı" kullanıyorum. Yukarıdaki iki hizmeti ona ekledim.


Bu aslında çok akıllıca bir çözüm. Birden çok hizmeti paralel olarak çalıştırmak istiyorsanız , sırasıyla Listen 80ve Listen 81her birine dahil edebilirsiniz ifdefine.
caiosm1005

Güzel fikir, ama soru bir LAMP sunucusu ile ilgili, bir WAMP sunucusu değil.
Vinicius Monteiro

4

Muhtemelen yerel / masaüstü bir makineden bahsettiğinizi ve muhtemelen yerel / masaüstü bir makine hakkında konuşmaya devam etmek istediğinizi anlayınca, size veya başka birine yardımcı olma ihtimaline karşı sizin için bir alternatif oluşturacağım:

Bulutta birden fazla sanal sunucu örneği oluşturun ve kodunuzu aralarında git deposu olarak paylaşın (veya sanırım kişisel deneyimim olmasa da, gerçekten ihtiyacınız olan tek şey merkezi olmayan bir şey). Bu, size mümkün olduğunca bir üretim deneyimine yakın olma avantajına sahiptir ve sunucu kurma konusunda deneyiminiz varsa, o kadar karmaşık değildir (veya pahalı, yalnızca bir sunucuyu döndürmek istiyorsanız, yapmanız gereken şeyi yapın, sonra tekrar aşağı döndürün, sonra 50 sent demek için birkaç sentten bahsediyorsunuz, eğer çalışır durumda bırakırsanız birkaç kuruşa kadar.

Bu günlerde tüm proje geliştirmelerimi bulutta yapıyorum ve altyapıyı yönetmeyi yerel / sanallaştırılmamış kurulumları kullanırken yaptığımdan çok daha basit buldum ve bu tür yan yana senaryoları oldukça iyi hale getiriyor basit. Düşünmeseydin, fikri oraya atmak istedim.


3

Ubuntu 10'da PHP5.3'ten başarılı bir şekilde düşürdüm.

Bunu yapmak için aşağıdaki komut dosyasını kullandım:

#! /bin/sh
php_packages=`dpkg -l | grep php | awk '{print $2}'`

sudo apt-get remove $php_packages

sed s/lucid/karmic/g /etc/apt/sources.list | sudo tee /etc/apt/sources.list.d/karmic.list

sudo mkdir -p /etc/apt/preferences.d/

for package in $php_packages;
do echo "Package: $package
Pin: release a=karmic
Pin-Priority: 991
" | sudo tee -a /etc/apt/preferences.d/php
done

sudo apt-get update

sudo apt-get install $php_packages

Komut satırından komut dosyalarını nasıl çalıştıracağını bilmeyenler için kısa bir öğretici:

1. cd ~/
2. mkdir bin
3. sudo nano ~/bin/myscriptname.sh
4. paste in the script code I have posted above this
5. ctrl+x (this exits and prompts for you to save)
6. chmod u+x myscriptname.sh

Bu 6 adım, ana dizininizdeki "bin" adlı bir klasörde bir komut dosyası oluşturur. Daha sonra aşağıdaki komutu çağırarak bu komut dosyasını çalıştırabilirsiniz:

~/bin/myscriptname.sh

Oulia!

Umarım bu bazılarınıza yardımcı olur!

Başvuru için, komut dosyasını aldığım yer: Ubuntu 10 için PHP5.2.10

Orada bunun işe yaradığını onaylayan birkaç kişi var ve benim için bir tedavi oldu.


iyi bir senaryo, ancak karmik benim için işe yaramadı çünkü Power PC'deydim. Mevcut yüklememi kaldırmak için komut dosyasını kullandım ve ardından manuel olarak oluşturdum 2.14
Jason

2

PHP'yi yaratan Rasmus Lerdorf, ihtiyaçlarınızı çözecek gibi görünen aktif bir Vagrant çözümünü sürdürüyor. Şu anda 20'den fazla farklı sürümü destekleyen PHP sürümleri arasında hızlı geçişe izin verir. Kutudan bir nginx sunucusuyla çıkar, ancak önceden yapılandırılmış bir ayarla apache2'ye kolayca geçirilebilir. Ayrıca MySQL'i kutudan çıktığı gibi destekler.

Bu şekilde, PHP'nin arkasındaki büyük adam tarafından korunan güzel bir serseri kutuda, ana web sunucularından ikisine yerleştirilebilen tüm PHP sürümlerine erişebileceksiniz.

Daha fazla bilgi için, Bay tarafından yapılan konuşmaya başvurmak istiyorum. Lerdorf, https://youtu.be/6XnysJAyThs?t=2864 adresinde

Vagrant çözümünü içeren github deposu https://github.com/rlerdorf/php7dev adresinde bulunur.


Bu muhtemelen, IMHO, 'en iyi' cevap - her sürüm için farklı bir VM (ancak bir IP adresinde birden çok sürüm çalıştırabilir misiniz?). Ancak php'nin yaratıcısının bunu yapması ne kadar ironik - php'nin en büyük kusuru, örneğin Joomla'yı işe yaramaz kılan sürümler arasındaki uyumsuzluktur.
EML

0

Kutumda çalışan birkaç projem var. Zaten birden fazla sürüm yüklediyseniz, bu bash betiği kolayca geçiş yapmanıza yardımcı olacaktır. Şu anda üzerinde çalıştığım projeye bağlı olarak sık sık ileri geri hareket ettirdiğim php5, php5.6 ve php7.0 var. İşte kodum.

Kopyalamaktan çekinmeyin. Kodun nasıl çalıştığını anladığınızdan emin olun. Bu webhostin içindir. yerel kutum modlarım / etc / apache2 / mods-enabled / konumunda saklanıyor

    #!/bin/bash
# This file is for switching php versions.  
# To run this file you must use bash, not sh
# 
    # OS: Ubuntu 14.04 but should work on any linux
# Example: bash phpswitch.sh 7.0
# Written by Daniel Pflieger
# growlingflea at g mail dot com

NEWVERSION=$1  #this is the git directory target

#get the active php enabled mod by getting the array of files and store
#it to a variable
VAR=$(ls /etc/apache2/mods-enabled/php*)

#parse the returned variables and get the version of php that is active.
IFS=' ' read -r -a array <<< "$VAR"
array[0]=${array[0]#*php}
array[0]=${array[0]%.conf}


#confirm that the newversion veriable isn't empty.. if it is tell user 
#current version and exit
if [ "$NEWVERSION" = "" ]; then
echo current version is ${array[0]}.  To change version please use argument
exit 1
fi 

OLDVERSION=${array[0]}
#confirm to the user this is what they want to do
echo "Update php"  ${OLDVERSION} to ${NEWVERSION}


#give the user the opportunity to use CTRL-C to exit ot just hit return
read x

#call a2dismod function: this deactivate the current php version
sudo a2dismod php${OLDVERSION}

#call the a2enmod version.  This enables the new mode
sudo a2enmod php${NEWVERSION} 

echo "Restart service??"
read x

#restart apache
sudo service apache2 restart

0

Test için sadece farklı IP adreslerinde birden fazla httpd örneği çalıştırıyorum, bu yüzden 192.168.0.70 üzerinde çalışan php7 ve 192.168.0.56 üzerinde çalışan php5.6 var. Üretimde php5.3 çalıştıran eski bir oscommerce çalıştıran bir sitem var ve site için sadece farklı bir conf dosyam var

httpd -f /etc/apache2/php70.conf
httpd -f /etc/apache2/php53.conf

Aynı zamanda php.inifarklı siteler için farklı dosyalara sahip olmanın temiz bir yoludur . Yalnızca birkaç siteniz varsa, işleri organize etmenin güzel bir yolu varsa ve bir şeyi yükselttiğinizde bir seferde 1 siteden daha fazlası için endişelenmenize gerek yoksa

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.