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ı?
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ı?
Yanıtlar:
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.
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:
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
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
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
yum install gcc libxml2-devel bzip2-devel zlib-devel \
curl-devel libmcrypt-devel libjpeg-devel \
libpng-devel gd-devel mysql-devel
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
/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.
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.
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.
Listen 80
ve Listen 81
her birine dahil edebilirsiniz ifdefine
.
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.
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.
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.
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
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.ini
farklı 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