Làm thế nào để có hai phiên bản PHP được cài đặt và chuyển đổi dễ dàng giữa chúng?


76

Tôi muốn cài đặt cả PHP 5.2.17 và PHP 5.3.5 trên máy Ubuntu của mình và chuyển đổi theo nhu cầu cần thiết của tôi. Làm thế nào tôi có thể đạt được điều này?


trong ubfox có apache.conf trong / etc / apache2, tôi cũng nghĩ về điều này, có thể trong tương lai tôi sẽ tạo ra một số gói nó sẽ rất hữu ích cho các nhà phát triển web

Bạn có thể làm điều này với suPHP, không chắc chắn các chi tiết
Marco Ceppi

1
Có điều gì đó giống như python virtualenv để có các triển khai PHP bị cô lập sạch không?
lenzai

Bạn đã xem xét việc thiết lập máy chủ Ubuntu ảo bằng phần mềm ảo hóa mà bạn sử dụng một cách không đầu? Tôi sẽ ngạc nhiên nếu những gì bạn muốn làm không được phục vụ tốt (không có ý định chơi chữ) bởi một thiết lập như vậy.
Simon Hoare

1
Xác định ý nghĩa của việc "chuyển đổi dễ dàng". Tôi đã sử dụng điều này cho công việc: máy chủ web của tôi đã sử dụng các tệp .php.php5tệp PHP khác nhau . Bạn cũng có thể định cấu hình máy chủ WWW của mình để sử dụng các phiên bản PHP khác nhau cho các cổng khác nhau (như http://localhost:80http://localhost:8080) hoặc các miền khác nhau (thích http://localphp52http://localphp53) giữ nguyên cấu trúc thư mục còn lại để bạn có thể dễ dàng so sánh việc chạy một ứng dụng web trong hai môi trường bằng cách thay đổi hiện tại URL.
cprn

Câu trả lời:


61

Bạn có thể sử dụng trình quản lý phiên bản php để đạt được điều này. Các trình quản lý phiên bản khác nhau có sẵn như:

Yêu thích của tôi là phpbrew. Hi vọng điêu nay co ich.


2
Cảm ơn, bạn có thể vui lòng bao gồm hướng dẫn? (onnu vishadheekarikkamo?)
Tachyons

17
Trong khi về mặt lý thuyết có thể trả lời câu hỏi, tốt hơn là nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo.
Nanne

2
Chỉ cần kiểm tra các liên kết họ có tài liệu thực sự tốt trên trang web của họ. Bạn có thực sự muốn tôi sao chép-dán những thứ từ trang web của họ?.
aneeshep

7
Trớ trêu thay, một trong những lý do không chỉ đăng liên kết là linkrot, từ đó bài đăng này hiện đang bị ảnh hưởng.
MirroredFate

@aneeshep, không sao chép-dán tài liệu của họ, nhưng các đoạn trích có liên quan và một vài dòng về "Trình quản lý phiên bản php" là gì và cách sử dụng / định cấu hình cho vấn đề cụ thể đó sẽ thực sự được hoan nghênh.
Matthieu

20

Bạn có thể chạy 2 phiên bản PHP khác nhau cùng một lúc, nhưng không dễ dàng như việc lấy chúng. Bạn cần chạy một phiên bản được cài đặt riêng biệt và phục vụ nó theo các cài đặt trong cấu hình apache của bạn.

Bạn có thể làm điều này bằng cách sử dụng fastcgi chẳng hạn: về cơ bản những gì bạn đang tìm kiếm là cấu hình bạn thấy trên trang này . Bạn thêm một trình xử lý khác trong cấu hình của bạn dựa trên tình huống / cổng / tên miền bạn cần. Thủ thuật, sau khi cài đặt cả hai phiên bản, là bước này:

=== từ trang đó ==

  1. Bước cuối cùng là tạo máy chủ ảo. Cuối cùng, tôi có ba tệp trong / etc / apache2 / sites-enable: 000-default, php5.3.17 và php5.4.7 Với các nội dung sau

mặc định:

    <VirtualHost *:80>
      ServerName localhost
      DocumentRoot /var/www
      <Directory "/var/www">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
        AddHandler php-cgi .php
        Action php-cgi /php-fcgi/php5317.fcgi
      </Directory>
    </VirtualHost>

php5.3.17:

    <VirtualHost *:80>
      ServerName 5317.localhost
      DocumentRoot /var/www
      <Directory "/var/www">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
        AddHandler php-cgi .php
        Action php-cgi /php-fcgi/php5317.fcgi
      </Directory>
    </VirtualHost>

php5.4.7:

    <VirtualHost *:80>
      ServerName 547.localhost
      DocumentRoot /var/www
      <Directory "/var/www">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
        AddHandler php-cgi .php
        Action php-cgi /php-fcgi/php547.fcgi
      </Directory>
    </VirtualHost>

Xem để cài đặt hoàn chỉnh các câu hỏi liên kết . Đừng quên nhìn vào hai liên kết trong tiêu đề, chúng trông giống như các hướng dẫn đẹp (nhưng ít bị nén hơn). Đâyđó

(không được đặt ra bởi thực tế là câu hỏi được liên kết là một câu hỏi lớn không có câu trả lời được chấp nhận. Phương pháp nên (và không) hoạt động tốt, nhưng người dùng đã quên sử dụng <?phpvà sử dụng <?với shorttags, xem các bình luận)


13

Tôi đã cài đặt php 5.6 và 7.0 nhưng bên cạnh tất cả các mẹo, nó vẫn chạy 5.6, vì vậy lệnh này sẽ tiết kiệm trong ngày (trong trường hợp của tôi, tôi chọn tùy chọn 1 và khởi động lại apache):

sudo update-alternatives --config php

nhớ sử dụng phpinfo()php -vkiểm tra chéo là hữu ích vì cả hai đều có giá trị khác nhau.
Adi Prasetyo

6

Cái này hoạt động với tôi: https://lornajane.net/posts/2016/php-7-0-and-5-6-on-ubfox

Giống như kịch bản từ "Growling Flea", nhưng sử dụng các phiên bản mới.

Thêm PPA

Các gói PHP 5.6 và PHP 7.0 là từ PPA của bên thứ ba, không được cung cấp bởi kho Ubuntu chính thức từ Canonical. Các PPA tôi khuyên dùng ở đây là từ Ondřej Surý, người đóng gói PHP cho Debian (sau đó được Ubuntu sử dụng), vì vậy trong khi nó không phải là kho lưu trữ chính thức, thì anh ấy không hoàn toàn ngẫu nhiên! PPA là ở đây

Để thêm PPA vào thiết lập của bạn:

sudo add-apt-repository ppa:ondrej/php  

Sau đó, chúng tôi cũng sẽ muốn lấy thông tin về những gì được cung cấp từ PPA mới này, vì vậy hãy chạy:

sudo apt-get update   

Cài đặt các phiên bản PHP mới

Tôi đã cài đặt một số gói php5, nhưng tôi không gỡ cài đặt bất cứ thứ gì, tôi chỉ để apt tìm ra những gì nó muốn làm khi tôi yêu cầu nó cài đặt các phiên bản mới:

sudo apt-get install php5.6 php7.0

Điều này dẫn đến rất nhiều phàn nàn từ apt và rất nhiều xung đột. Độ phân giải được đề xuất đầu tiên là xóa tất cả các gói php5 để có thể cài đặt PHP 5.6 - vì vậy tôi chỉ chấp nhận đề xuất đầu tiên.

Tôi sử dụng apache để thiết lập này cung cấp cho tôi apache với cả hai mô-đun php5.6 và php7.0 có sẵn và mô-đun php5.6 thực sự được tải.

Cũng như chính PHP, tất cả các phần mở rộng và các công cụ khác mà bạn mong đợi với PHP đều có sẵn cho cả hai phiên bản PHP, vì vậy rất dễ dàng để thêm vào các mô-đun mà bạn cần. Tôi đã rất, rất ấn tượng với cách thức này được thực hiện độc đáo.

Cấu hình và chuyển đổi phiên bản

Bây giờ bạn có hai phiên bản PHP hoàn toàn riêng biệt được cài đặt trên hệ thống của bạn, vì vậy hãy xem tất cả các phần đã đi đâu!

Các tệp cấu hình đều nằm trong /etc/php/5.6/etc/php/7.0 tương ứng - bên trong đây là nơi bạn có thể định cấu hình các tiện ích mở rộng nào được tải, đặt cài đặt ini và mọi thứ khác cho từng phiên bản một cách riêng biệt.

Tôi là người dùng apache và như tôi đã đề cập cả hai mô-đun đều có sẵn. Vì vậy, để chuyển từ cái này sang cái khác tôi cần làm:

sudo a2dismod php5.6
sudo a2enmod php7.0
sudo service apache2 restart

Đối với người dùng nginx, các thay đổi gần như dễ dàng, Digital Ocean có tài liệu tốt về điều này (họ có tài liệu tuyệt vời!) Vì vậy hãy xem hướng dẫn của họ: https://www.digitalocean.com/community/tutorials/how-to- nâng cấp lên php-7-on-ubfox-14-04 vì nó bao gồm một phần về cấu hình lại nginx để sử dụng một phiên bản PHP khác.

Từ dòng lệnh, tôi có sẵn cả php5.6 và php7.0 dưới dạng các lệnh. Tôi cũng vẫn có một lệnh php - nhìn vào / etc / thay thế để thấy rằng nó liên kết với một phiên bản cụ thể của PHP cli *. Bạn cũng có thể nhanh chóng kiểm tra xem cái nào của bạn đang sử dụng bằng cách chạy php -v.

* cụ thể hơn, chạy php nào để xem phiên bản PHP nào đang được sử dụng - nhưng điều này có thể sẽ trỏ đến /usr/bin/php, mà đối với tôi, bản thân nó là một liên kết tượng trưng cho /etc/alternatives/phplệnh.

Làm việc với phần mở rộng

PPA này đi kèm với gói php-lê thông thường cung cấp lệnh pecl cho cả hai phiên bản PHP, vì vậy mọi phần mở rộng có sẵn thông qua PECL đều có thể được cài đặt theo cách thông thường. Bạn cũng sẽ cần các tiêu đề có liên quan để cài đặt php5.6-dev hoặc php7.0-dev.

Khi quá trình cài đặt pecl hoàn tất, bạn sẽ nhận được một ghi chú để thêm tệp * .so vào php.ini của bạn; trong thực tế, điều tốt nhất để làm ở đây là nhìn vào những gì trong /etc/php/mods-available. Sẽ có một số mô-đun đã có ở đây, mỗi mô-đun trong tệp riêng được đặt tên theo phần mở rộng và kết thúc bằng .ini. Bạn có thể sao chép một cái để sử dụng làm mẫu hoặc tạo mẫu của riêng bạn và đặt tất cả cấu hình có liên quan cho tiện ích mở rộng trong đó (tối thiểu, bạn cần extension=[extensionName].so).

Khi tiện ích mở rộng mới có sẵn các mod, hãy bật và sau đó kiểm tra bằng cách thực hiện:

sudo phpenmod extension  
php -m  

Điều này sẽ tạo các liên kết tượng trưng ở đúng nơi để phiên bản PHP hiện tại của bạn tải mô-đun này và bạn sẽ thấy nó trong danh sách các mô-đun đầu ra của php -m. Mẹo chuyên nghiệp: nếu bạn không nhìn thấy nó ở đầu ra, hãy cuộn toàn bộ đến đỉnh đầu ra và xem có thông báo lỗi hữu ích nào ở đó không.


3

Từ bài đăng này , tôi chỉ cần sắp xếp theo thứ tự các lệnh và giải thích theo thứ tự khi tôi được phục vụ (Ubuntu 12.04)

Phương pháp này cung cấp cho bạn:

  1. tập lệnh với menu, cho phép chuyển đổi giữa các phiên bản php được cài đặt (không phải cả hai cùng một lúc)

  2. các phiên bản PHP khác nhau được cài đặt trên máy chủ của bạn

  3. tách tập tin conf

Cài đặt tất cả các phiên bản mà bạn cần (tôi có hai)

Cài đặt phụ thuộc:

sudo apt-get install flex apache2-threaded-dev libxml2-dev apache2 apache2-mpm-prefork apache2-threaded-dev apache2-utils apache2.2-bin apache2.2-common

Cài đặt PHP 5.3 lần đầu tiên. Tải xuống nguồn php

md5sum Downloads/php-5.3.10.tar.bz2
mkdir ~/Sources
cd ~Sources/
cp -Rf ../Downloads/php-5.3.10.tar.bz2 .
tar xjf php-5.3.10.tar.bz2
cd php-5.3.10/
sudo mkdir /usr/local/php/php_5.3.10

Cài đặt PHP5.6 lần đầu tiên. Tải xuống nguồn php

md5sum Downloads/php-5.6.11.tar.bz2
mkdir ~/Sources
cd ~Sources/
cp -Rf ../Downloads/php-5.6.11.tar.bz2 .
tar xjf php-5.6.11.tar.bz2
cd php-5.6.11/
sudo mkdir /usr/local/php/php-5.6.11

Các phiên bản trình quản lý tập lệnh PHP: Tạo một tệp được gọi php.shvà đặt nó vào /bin/:

#!/bin/bash
opcion=0
cat << CABECERAMENU
Opciones del menu
1 => PHP 5.3.10
2 => PHP 5.6.11
CABECERAMENU
echo -n "Ingrese su eleccion: "
read opcion
echo
case $opcion in
    "1")
        rm /etc/apache2/php.conf
        ln -s /usr/local/php/php_5.3.10.conf /etc/apache2/php.conf
        /etc/init.d/apache2 restart
    ;;
    "2")
        rm /etc/apache2/php.conf
        ln -s /usr/local/php/php_5.6.11.conf /etc/apache2/php.conf
        /etc/init.d/apache2 restart
    ;;
    *)
        echo "Opcion no valida"
    ;;
esac

Biên dịch và cài đặt php 5.3:

cd ~/Sources/php-5.3.10/
sudo ./configure --prefix=/usr/local/php/php_5.3.10 --with-config-file-path=/usr/local/php/php_5.3.10/lib --with-mysql --with-libdir=/lib/x86_64-linux-gnu --with-apxs2=/usr/bin/apxs2 --enable-zip --with-gd --with-curl --with-xmlrpc --with-freetype-dir=/usr/lib/x86_64-linux-gnu  --with-jpeg-dir=/usr/lib/x86_64-linux-gnu --with-pdo-mysql --with-pdo-pgsql --enable-soap
sudo make clean
sudo make
sudo ls -lhart /usr/lib/apache2/modules/libphp5.*
sudo rm -rf /usr/lib/apache2/modules/libphp5.*
sudo make install
sudo ls -lhart /usr/lib/apache2/modules/libphp5.*
sudo rm -rf /usr/local/php/php-5.3.10/modules/libphp5.so
sudo mv /usr/lib/apache2/modules/libphp5.so /usr/local/php/php_5.3.10/modules/
ls -lhart /usr/local/php/php_5.3.10/modules/
sudo a2dismod php5
sudo service apache2 restart

Biên dịch và cài đặt php 5.6

cd ~/Sources/php-5.6.11
sudo ./configure --prefix=/usr/local/php/php_5.6.11 --with-config-file-path=/usr/local/php/php_5.6.11/lib --with-mysql --with-libdir=/lib/x86_64-linux-gnu --with-apxs2=/usr/bin/apxs2 --enable-zip --with-gd --with-curl --with-xmlrpc --enable-calendar --enable-sockets --with-freetype-dir=/usr/lib/x86_64-linux-gnu  --with-jpeg-dir=/usr/lib/x86_64-linux-gnu --with-pdo-mysql  --with-pdo-pgsql --enable-soap
sudo make clean
sudo make
sudo ls -lhart /usr/lib/apache2/modules/libphp5.*
sudo rm -rf /usr/lib/apache2/modules/libphp5.*
sudo make install
sudo ls -lhart /usr/lib/apache2/modules/libphp5.*
sudo rm -rf /usr/local/php/php_5.6.11/modules/libphp5.so
sudo mv /usr/lib/apache2/modules/libphp5.so /usr/local/php/php_5.6.11/modules
ls -lhart /usr/local/php/php_5.6.11/modules
sudo a2dismod php5
sudo service apache2 restart

Hãy sử dụng chúng:

$ sudo php.sh
Opciones del menu
1 => PHP 5.3.10
2 => PHP 5.6.11
Ingrese su eleccion: 1

 * Restarting web server apache2                                                                                                                                                                                                                                        apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
 ... waiting apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName

2

Các vấn đề:

  1. Ví dụ apache đơn không thể chạy hai phiên bản PHP khác nhau cùng lúc (ít nhất là theo như tôi biết).

  2. Hai phiên bản PHP khác nhau không thể được cài đặt từ các gói vì chúng sẽ xung đột (và thử ghi đè lên cùng một thư mục).

Giải pháp:

  • cho b) Biên dịch phiên bản khác của PHP PHP từ nguồn, theo cách thủ công (hoặc nếu bạn thích, lấy nguồn gói phù hợp và sửa đổi nó để tránh xung đột và sửa đổi đường dẫn cài đặt)

  • cho a) Tạo tập hợp cấu hình riêng cho apache với các đường dẫn mô-đun khác nhau và tập lệnh khởi động riêng. Và tất nhiên chạy nó trên cổng riêng.


không có tập lệnh đóng gói sẵn để biên dịch các thể hiện php parallele này? Chỉ để làm nó bằng tay và vá đường dẫn? Vì vậy, điều này có nghĩa là tất cả các công ty lưu trữ phát triển các tập lệnh tùy chỉnh để chạy các phiên bản song song này và không bao giờ chia sẻ nỗ lực của họ.
lenzai

4
Một phiên bản apache đơn có thể chạy 2 phiên bản php cùng một lúc.
Nanne

1

Thay vì tạo nhiều, VirtualHosttôi chỉ cần thêm mã dưới đây vào .htaccesstệp của mình và thật ngạc nhiên là nó đã hoạt động,

<FilesMatch \.php$>
    SetHandler "proxy:unix:/var/run/php/php7.2-fpm.sock|fcgi://localhost/"
</FilesMatch>

Nút: Tôi đã cài đặt php7.2-fpmtrước khi sử dụng mã.


0

Nếu bạn muốn chạy chúng cùng một lúc, bạn cần hai cổng khác nhau. Có lẽ bạn chỉ có thể thay đổi cấu hình apache (httpd.conf) bằng một tập lệnh đơn giản để di chuyển một hoặc một phiên bản khác vào đúng vị trí trước khi bắt đầu apache.


1
Tôi đã cài đặt PHP 5.3.5. Làm cách nào để cài đặt PHP 5.2.17? Bạn có thể vui lòng cho tôi biết nơi tôi và những gì tôi phải thay đổi để chuyển đổi giữa hai phiên bản này không? Tệp httpd.conf trống trong cài đặt của tôi.
Debiprasad

0

Bạn cũng có thể chạy từng trang web với người dùng khác nhau. An toàn hơn.

Tôi đã sử dụng aproach này một lần.

http://blog.servergrove.com/2011/08/22/how-to-setup-multipl-php-versions-on-apache/

Bây giờ tôi nghĩ tốt hơn là sử dụng php-fpm ... nhưng nó phức tạp hơn để cấu hình nhiều phiên bản php.

Sẽ cần phải chạy nhiều php-fpms và đặt apache để sử dụng lẫn nhau.


3
Chào mừng bạn đến hỏi Ubuntu! Trong khi về mặt lý thuyết có thể trả lời câu hỏi, tốt hơn là nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo.
user98085

Tôi không có đủ thời gian để làm như bạn nói. Tôi đoán, tôi chỉ muốn thể hiện một cách. Stil cần phải học cách sử dụng các công cụ định hình. Dù sao cũng cảm ơn bạn!
Henrique Fernandes

0

Tôi đã viết một tập lệnh bash cho phép tôi dễ dàng chuyển đổi giữa các phiên bản php đã cài đặt trên hộp của mình. Tôi chạy một số máy chủ ảo vì tôi có một số dự án web với khách hàng có chương trình cũ và mới. Một số dự án này yêu cầu các phiên bản cũ hơn của php và các dự án khác yêu cầu php7.0.

Đọc qua ý kiến ​​của tôi và chắc chắn rằng bạn hiểu những gì đang xảy ra trước khi sử dụng.

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

Tôi đã có cùng một vấn đề khi tôi đang xử lý nhiều dự án. Tôi đã giới thiệu bài viết này Nhưng nó giống như mỗi lần tôi cần chuyển đổi các phiên bản nếu cần nhưng điều này mang lại sự linh hoạt cho cli và web riêng biệt.

Chuyển từ php5.6 sang php7.0

Đối với Apache, chúng ta có thể sử dụng lệnh như:

sudo a2dismod php5.6 ; sudo a2enmod php7.0 ; sudo service apache2 restart

Đối với CLI, chúng ta có thể sử dụng lệnh như:

sudo update-alternatives --set php /usr/bin/php7.0

Chuyển từ php7.0 sang php5.6

Đối với Apache, chúng ta có thể sử dụng lệnh như:

sudo a2dismod php7.0 ; sudo a2enmod php5.6 ; sudo service apache2 restart

Đối với CLI, chúng ta có thể sử dụng lệnh như:

sudo update-alternatives --set php /usr/bin/php5.6

Mặc dù liên kết này có thể trả lời câu hỏi, tốt hơn là bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở nên không hợp lệ nếu trang được liên kết thay đổi. - Từ đánh giá
ví von

@waltinator Cảm ơn bạn đã xem xét, chắc chắn sẽ quan tâm đến vấn đề này
Shivdhwaj Pandey

0

Nó có thể được thực hiện bằng cách vô hiệu hóa và kích hoạt phiên bản mới của PHP-

  • chuyển sang phiên bản cũ hơn -
    a2dismod php7.0
    dịch vụ apache2 khởi động lại
  • chuyển sang phiên bản mới hơn
    a2enmod php7.0
    dịch vụ apache2 khởi động lại
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.