Làm cách nào để có thể chạy nhiều phiên bản PHP 5.x trên một máy chủ LAMP phát triển?


81

Tôi cần kiểm tra các ứng dụng PHP của mình với nhiều phiên bản PHP 5.x, chẳng hạn như PHP 5.0.0 và PHP 5.2.8.

Có cách nào để tôi có thể định cấu hình máy chủ LAMP phát triển để tôi có thể nhanh chóng kiểm tra các ứng dụng với nhiều phiên bản PHP5 không?


Bạn sẽ có thể sử dụng một biến PATH nhưng tôi không chắc chắn 100% vì vậy tôi không trả lời cho đại diện
Malfist

Cách sử dụng nhiều phiên bản PHP (PHP-FPM & FastCGI) với ISPConfig 3 (Ubuntu 12.10) - @ hek2mgl: Câu hỏi về các công cụ phát triển không phải là chủ đề.
hakre

@hakre Đồng ý, sử dụng FPM sẽ ít có khả năng nhiều phiên bản ảnh hưởng đến nhau hơn khi được tải dưới dạng mô-đun Apache :)
Ja͢ck

@Jack: Argh, không phải Apache Module, FCGI;)
hakre

Cho đến nay tôi đã thử phpbrewphp-version nhưng dường như cả hai đều không biên dịch được PHP.
Nice ass

Câu trả lời:


17

Một cách để làm điều này là thiết lập phiên bản php chính của bạn với mod_php và chạy tất cả các phiên bản khác thông qua cgi nhanh trên các cổng khác nhau (tức là 81, 82, 83, v.v.). Tuy nhiên, điều này sẽ không đảm bảo hành vi hoàn toàn nhất quán.


32
Một ý tưởng: Đối với PHP 5.2.1, hãy sử dụng cổng 10521. Đối với 5.0.0, hãy sử dụng 10500 :)
Wayne

2
Một tùy chọn khác sẽ là chạy nó bằng CGI (hoặc FastCGI) theo các đường dẫn khác nhau - tức là / cgi500 /, / cgi528 /, ...
Grey Panther

Trong trường hợp bạn đang sử dụng Debian và muốn sử dụng tính năng đóng gói, tôi khuyên bạn nên sử dụng debootstrap để tạo hệ thống chroot chứa phiên bản PHP của bạn, sau đó định cấu hình Apache bên trong hệ thống chroot'ed.
Max Tsepkov

23

Với CentOS, bạn có thể làm điều đó bằng cách sử dụng kết hợp fastcgi cho một phiên bản PHP và php-fpm cho phiên bản kia, như được mô tả ở đây:

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

Dựa trên CentOS 5.6, chỉ dành cho Apache

1. Bật kho lưu trữ rpmforge và epel yum

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. Cài đặt php-5.1

Dòng CentOS / RHEL 5.x có php-5.1 trong hộp, chỉ cần cài đặt nó với yum, ví dụ:

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

3. Biên dịch và cài đặt php 5.2 và 5.3 từ nguồn

Đối với php 5.2 và 5.3, chúng ta có thể tìm thấy nhiều gói rpm trên Internet. Tuy nhiên, tất cả chúng đều xung đột với php đi kèm với CentOS, vì vậy, tốt hơn chúng ta nên xây dựng và cài đặt chúng từ soure, điều này không khó, vấn đề là cài đặt php ở vị trí khác nhau.

Tuy nhiên, khi cài đặt php như một mô-đun apache, chúng ta chỉ có thể sử dụng một phiên bản php cùng một lúc. Nếu chúng ta cần chạy phiên bản php khác nhau trên cùng một máy chủ, chẳng hạn như máy chủ ảo khác nhau có thể cần phiên bản php khác nhau. May mắn thay, FastCGI và PHP-FPM tuyệt vời có thể giúp bạn.

Xây dựng và cài đặt php-5.2 có bật fastcgi

1) Cài đặt các gói nhà phát triển bắt buộc

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

2) Biên dịch và cài đặt

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) tạo tập lệnh trình bao bọc fastcgi

tạo tệp /usr/local/php52/bin/fcgiwrapper.sh

#!/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/

Định cấu hình php-fpm

Chỉnh sửa /etc/php53/php-fpm.conf, thay đổi một số cài đặt. Bước này chủ yếu là bỏ ghi chú một số cài đặt, bạn có thể điều chỉnh giá trị nếu muốn.

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

Sau đó, bắt đầu fpm

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

Cài đặt và thiết lập mod_fastcgi, mod_fcgid

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

Thiết lập và kiểm tra máy chủ ảo

1) Thêm dòng sau vào / etc / hosts

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

2) Tạo root tài liệu web và thả một index.php dưới nó để hiển thị phpinfo chuyển sang user root, chạy

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

Lưu ý: Thư mục / var / www / fcgi-bin trống là bắt buộc, ĐỪNG BỎ LỠ NÓ SAU

3) Tạo tệp cấu hình Apache (thêm vào httpd.conf)

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) khởi động lại apache. truy cập 3 trang web một cách tôn trọng để xem phpinfo và xác nhận kết quả. I E:

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

Nếu tất cả OK, bạn có thể sử dụng một trong 3 máy chủ ảo làm mẫu để tạo máy chủ ảo mới, với phiên bản php mong muốn.


1
Tuy nhiên, đây chỉ là một câu trả lời liên kết. Vui lòng đưa các chi tiết liên quan vào câu trả lời thay vì dựa hoàn toàn vào trang web khác. Các liên kết có vấn đề khó chịu là chúng có thể biến mất và bằng cách này SO vẫn không chứa thông tin liên quan.
Maarten Bodewes

Bạn có thể muốn xem xét CloudLinux. Nó là một giải pháp trả phí nhưng nó có giá chấp nhận được.
transilvlad

1
Câu trả lời đúng! Dưới đây là giải pháp tương tự cho Ubuntu: howtoforge.com/...
Tobias Gaertner

10

Có nhiều phiên bản của apache + php chưa bao giờ thực sự khiến tôi thích thú, nhưng có lẽ đây là cách dễ nhất để làm điều đó. Nếu bạn không cảm thấy như HÔN ... thì đây là một ý tưởng.

Khởi động và chạy apache của bạn và thử cấu hình nó giống như debian và ubuntu làm điều đó, ví dụ: có các thư mục cho các mô-đun đã tải. Conf apache của bạn có thể sử dụng các dòng như sau:

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

Sau đó, xây dựng phiên bản php đầu tiên của bạn và cung cấp cho nó một tiền tố có số phiên bản rõ ràng, ví dụ: /usr/local/php/5.2.8, /usr/local/php/5.2.6 ...

Conf / load sẽ trông giống như sau:

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

Để chuyển đổi phiên bản, tất cả những gì bạn phải làm là thay đổi tải và tệp conf từ thư mục apache có bao gồm các tệp cho phiên bản khác. Bạn có thể tự động hóa điều đó bằng một tập lệnh bash đơn giản (xóa tệp thực, sao chép tệp phiên bản thay thế tại chỗ và khởi động lại apache.

Một ưu điểm của thiết lập này là mọi thứ đều đồng nhất, vì vậy bạn giữ nguyên php.ini về các tùy chọn và mô-đun (dù sao thì bạn cũng phải làm với CGI). Tất cả họ đều trải qua SAPI. Ứng dụng của bạn sẽ không cần bất kỳ thay đổi nào, cũng như không cần sử dụng URL tương đối.

Tôi nghĩ điều này sẽ hiệu quả, nhưng một lần nữa, tôi đã không thử nó và cũng không có khả năng làm như vậy vì tôi không có cùng yêu cầu với bạn. Hãy bình luận nếu bạn từng thử.


8

Lưu ý: Phương pháp sau sẽ hoạt động trên windows.

Một phương pháp thay thế (nếu có thể chạy một phiên bản PHP duy nhất tại một thời điểm) là xác định nhiều dịch vụ Apache, mỗi dịch vụ sẽ sử dụng một phiên bản PHP khác nhau.

Trước hết các điều kiện sử dụng trong tệp cấu hình Apache:

 <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>

Bây giờ bằng cách sử dụng httpd.exe, tạo hai dịch vụ riêng biệt từ dòng lệnh (được nâng lên thành quản trị viên):

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

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

Bây giờ bạn có thể khởi động một trong các dịch vụ trên cùng một lúc (nên tắt một dịch vụ trước khi bắt đầu dịch vụ kia).

Nếu trước đó bạn đã cài đặt Apache dưới dạng dịch vụ, bạn có thể xóa bằng cách sử dụng lệnh dưới đây (thay thế tên dịch vụ bằng tên bạn đã sử dụng):

apache -k uninstall -n Apache224

Một lưu ý nữa là cá nhân tôi sử dụng một "chương trình biểu tượng khu vực thông báo" được gọi là "Seobiseu" để bắt đầu và dừng các dịch vụ khi cần thiết. Tôi đã thêm hai dịch vụ trên vào nó.


Đó thực sự là một giải pháp rất thông minh. Nếu bạn muốn chạy nhiều dịch vụ song song, bạn có thể bao gồm Listen 80Listen 81trong từng dịch vụ ifdefinetương ứng.
caiosm1005

Ý tưởng hay, nhưng câu hỏi là về máy chủ LAMP, không phải máy chủ WAMP.
Vinicius Monteiro

4

Hiểu rằng có thể bạn đang nói về máy cục bộ / máy tính để bàn và có thể muốn tiếp tục nói về máy cục bộ / máy tính để bàn, tôi sẽ đưa ra một phương án thay thế cho bạn trong trường hợp nó có thể giúp ích cho bạn hoặc ai đó:

Thiết lập nhiều phiên bản máy chủ ảo trên đám mây và chia sẻ mã của bạn giữa chúng như một kho lưu trữ git (hoặc thương mại, tôi cho rằng, mặc dù tôi không có kinh nghiệm cá nhân, nhưng tất cả những gì bạn thực sự cần là một thứ gì đó phi tập trung). Điều này có lợi là mang lại cho bạn trải nghiệm sản xuất càng gần càng tốt và nếu bạn có kinh nghiệm thiết lập máy chủ thì nó không quá phức tạp (hoặc tốn kém, nếu bạn chỉ muốn quay một máy chủ lên, hãy làm những gì bạn cần làm, sau đó xoay nó xuống một lần nữa, sau đó bạn đang nói về một vài xu lên đến 50 xu, lên đến một vài đô la nếu bạn chỉ để nó chạy).

Tôi thực hiện tất cả quá trình phát triển dự án của mình trên đám mây những ngày này và tôi thấy việc quản lý cơ sở hạ tầng đơn giản hơn nhiều so với những gì tôi đã từng làm khi sử dụng cài đặt cục bộ / không ảo hóa và nó làm cho loại kịch bản song song này trở nên công bằng thẳng tiến. Tôi chỉ muốn ném ý tưởng ra khỏi đó nếu bạn chưa xem xét nó.


3

Tôi vừa hạ cấp thành công từ PHP5.3 trên Ubuntu 10.

Để làm điều này, tôi đã sử dụng tập lệnh sau:

#! /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

Đối với bất kỳ ai không biết cách chạy các tập lệnh từ dòng lệnh, đây là một hướng dẫn ngắn gọn:

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

6 bước này tạo một tập lệnh trong một thư mục có tên là "bin" trong thư mục chính của bạn. Sau đó, bạn có thể chạy tập lệnh này bằng cách gọi lệnh sau:

~/bin/myscriptname.sh

Oulia!

Hi vọng điều này giúp được cho một vài bạn!

Để tham khảo, đây là nơi tôi lấy kịch bản: PHP5.2.10 cho Ubuntu 10

Có một số người trên đó xác nhận rằng điều này hiệu quả, và nó đã có tác dụng đối với tôi.


kịch bản tốt, mặc dù nghiệp báo không hiệu quả với tôi vì tôi đang sử dụng Power PC. Tôi vừa sử dụng tập lệnh để xóa cài đặt hiện tại của mình sau đó tạo thủ công 2.14
Jason

2

Rasmus Lerdorf, người đã tạo ra PHP, đang duy trì một giải pháp Vagrant hoạt động có vẻ như để giải quyết nhu cầu của bạn. Nó cho phép chuyển đổi nhanh chóng giữa các phiên bản PHP, hiện hỗ trợ hơn 20 phiên bản khác nhau. Nó đi kèm với một máy chủ nginx, nhưng có thể dễ dàng chuyển sang apache2 với cài đặt được cấu hình sẵn. Nó cũng hỗ trợ MySQL ra khỏi hộp.

Bằng cách này, bạn sẽ có quyền truy cập vào tất cả các phiên bản PHP, có thể triển khai trên hai trong số các máy chủ web chính, trong một hộp lang thang đẹp mắt, được duy trì bởi ông lớn đằng sau PHP.

Để biết thêm thông tin, tôi muốn tham khảo bài nói chuyện của ông. Lerdorf tại https://youtu.be/6XnysJAyThs?t=2864

Kho lưu trữ github chứa giải pháp Vagrant được tìm thấy tại https://github.com/rlerdorf/php7dev


Đây có lẽ là IMHO, câu trả lời 'tốt nhất' - một máy ảo khác nhau cho mỗi phiên bản (nhưng bạn có thể chạy nhiều phiên bản trên một địa chỉ IP không?). Nhưng thật trớ trêu làm sao khi người tạo ra php phải làm điều này - lỗ hổng lớn nhất của php phải là sự thiếu tương thích giữa các phiên bản, điều này khiến Joomla chẳng hạn, trở nên vô dụng.
EML

0

Tôi có một số dự án đang chạy trên hộp của tôi. Nếu bạn đã cài đặt nhiều phiên bản, tập lệnh bash này sẽ giúp bạn dễ dàng chuyển đổi. Hiện tại, tôi có php5, php5.6 và php7.0 mà tôi thường chuyển đổi qua lại tùy thuộc vào dự án tôi đang làm việc. Đây là mã của tôi.

Hãy sao chép. Đảm bảo rằng bạn hiểu cách hoạt động của mã. Đây là cho webhostin. hộp cục bộ của tôi, mod của tôi được lưu trữ tại / etc / apache2 / mods-enable /

    #!/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

Để thử nghiệm, tôi chỉ chạy nhiều phiên bản httpd trên các địa chỉ IP khác nhau, vì vậy tôi có php7 chạy trên 192.168.0.70 và php5.6 chạy trên 192.168.0.56. Trong quá trình sản xuất, tôi có một trang web đang chạy hệ điều hành cũ chạy php5.3 và tôi chỉ có một tệp conf khác cho trang web

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

Đó cũng là một cách dễ dàng để có các php.initệp khác nhau cho các trang web khác nhau. Nếu bạn chỉ có một vài trang web nếu một cách tốt để giữ mọi thứ được ngăn nắp và bạn không phải lo lắng về nhiều hơn thì mỗi lần 1 trang web khi bạn nâng cấp thứ gì đó

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.