尝试设置XAMPP (Windows)以并行支持两个PHP版本



我在包含PHP 8的Windows 10 (XAMPP - Windows -x64-8.0.10-0- vs16)上成功运行了XAMPP。现在我需要在一些老的项目上工作,这些项目还没有为PHP 8做好准备。找到了一些解释如何设置环境以支持两个PHP版本的帖子。我按照在XAMPP中是否有办法使用两个PHP版本中描述的说明进行操作?选项1仅对特定目录

使用PHP 7.4我不能使它工作。以下是我到目前为止所做的:

  1. 从php.net下载PHP 7.4 (VC15 x64 Non Thread Safe (2021-Sep-21 16:58:34)),并解压到新目录"php74"在"xampp"d:xampphp74.
  2. 在*php74"中创建文件php.ini,并进行修改
  3. 按描述编辑http-xampp.conf文件

有了这样的设置(见下面的配置文件),PHP 8就绪的网站(仍然)在浏览器中正常显示。

当访问localhost/photos-local-dev/时,我可以看到Apache正在尝试为该网站运行PHP 7.4,因为之前的错误信息…get_magic_quotes_gpc()…不再显示。所以httpd-xampp.conf中的新指令是有效的。但是,浏览器并没有将index.php传递给PHP 7.4,而是简单地显示index.php文件,就好像它是一个(几乎)纯文本文件一样(不要注意换行符;出于可读性的考虑,我重新格式化了一下):

0 && $page['start']>=count($page['items'])) { page_not_found('', duplicate_index_url(array('start'=>0))); } 
trigger_notify('loc_begin_index');//---------------------------------------------- change of image display order 
if (isset($_GET['image_order'])) { if ( (int)$_GET['image_order'] > 0){pwg_set_session_var('image_order', 
(int)$_GET['image_order']); } else {pwg_unset_session_var('image_order'); } redirect( duplicate_index_url( array(),//
nothing to redefine array('start') // changing display order goes back to section first page ) ); } if(isset(
$_GET['display'])) { $page['meta_robots']['noindex']=1; if (array_key_exists($_GET['display'],
ImageStdParams::get_defined_type_map())) {pwg_set_session_var('index_deriv', $_GET['display']); } } 
//-------------------------------------------------------------- initialization // navigation bar $page[
'navigation_bar'] = array(); if (count($page['items']) > $page['nb_image_page']) { $page['navigation_bar'] = 
create_navigation_bar( duplicate_index_url(array(), array('start')), count($page['items']), 

在试图找到问题时,我偶然发现了httpd-xampp.conf中的以下行:

<IfModule env_module>
SetEnv MIBDIRS "D:/xampp/php/extras/mibs"
SetEnv MYSQL_HOME "\xampp\mysql\bin"
SetEnv OPENSSL_CONF "D:/xampp/apache/bin/openssl.cnf"
SetEnv PHP_PEAR_SYSCONF_DIR "\xampp\php"
SetEnv PHPRC "\xampp\php"
SetEnv TMP "\xampp\tmp"
</IfModule>
#
# PHP-Module setup
#
LoadFile "D:/xampp/php/php8ts.dll"
LoadFile "D:/xampp/php/libpq.dll"
LoadFile "D:/xampp/php/libsqlite3.dll"
LoadModule php_module "D:/xampp/php/php8apache2_4.dll"

如果我停用LoadFileLoadModule行,然后尝试再次显示PHP 8准备好的网站,浏览器显示index.php作为文本,如上所述。这证实了那些加载是必不可少的。所以,我可以添加相应的指令指向PHP 7.4模块吗?Apache将如何区分?但是,唉,模块php7ts.dllphp7apach2_4.dll甚至不存在于PHP74目录?这些必须是由xampp提供的PHP附加组件,因为它们在官方zip文件中找不到。

真的有人让这个工作吗?上面提到的堆栈溢出q&a的一些注释似乎表明了这一点。

那么,我错过了什么?

httpd-xamp.conf:
#
# XAMPP settings
#
<IfModule env_module>
SetEnv MIBDIRS "D:/xampp/php/extras/mibs"
SetEnv MYSQL_HOME "\xampp\mysql\bin"
SetEnv OPENSSL_CONF "D:/xampp/apache/bin/openssl.cnf"
SetEnv PHP_PEAR_SYSCONF_DIR "\xampp\php"
SetEnv PHPRC "\xampp\php"
SetEnv TMP "\xampp\tmp"
</IfModule>
#
# PHP-Module setup
#
LoadFile "D:/xampp/php/php8ts.dll"
LoadFile "D:/xampp/php/libpq.dll"
LoadFile "D:/xampp/php/libsqlite3.dll"
LoadModule php_module "D:/xampp/php/php8apache2_4.dll"
<FilesMatch ".php$">
SetHandler application/x-httpd-php
</FilesMatch>
<FilesMatch ".phps$">
SetHandler application/x-httpd-php-source
</FilesMatch>
<IfModule php_module>
PHPINIDir "D:/xampp/php"
</IfModule>
<IfModule mime_module>
AddType text/html .php .phps
</IfModule>
ScriptAlias /php-cgi/ "D:/xampp/php/"
<Directory "D:/xampp/php">
AllowOverride None
Options None
Require all denied
<Files "php-cgi.exe">
Require all granted
</Files>
</Directory>
# Added by phun to support PHP 7.4 in parallel to PHP 8 that came with xampp
# |
ScriptAlias /php74 "D:/xampp/php74/"
Action application/x-httpd-php74-cgi /php74/php-cgi.exe
<Directory "D:/xampp/php74">
AllowOverride None
Options None
Require all denied
<Files "php-cgi.exe">
Require all granted
</Files>
</Directory>
# |
# Added by phun to support PHP 7.4 in parallel to PHP 8 that came with xampp
<Directory "D:/xampp/cgi-bin">
<FilesMatch ".php$">
SetHandler cgi-script
</FilesMatch>
<FilesMatch ".phps$">
SetHandler None
</FilesMatch>
</Directory>
<Directory "D:/xampp/htdocs/xampp">
<IfModule php_module>
<Files "status.php">
php_admin_flag safe_mode off
</Files>
</IfModule>
AllowOverride AuthConfig
</Directory>
<IfModule alias_module>
Alias /licenses "D:/xampp/licenses/"
<Directory "D:/xampp/licenses">
Options +Indexes
<IfModule autoindex_color_module>
DirectoryIndexTextColor  "#000000"
DirectoryIndexBGColor "#f8e8a0"
DirectoryIndexLinkColor "#bb3902"
DirectoryIndexVLinkColor "#bb3902"
DirectoryIndexALinkColor "#bb3902"
</IfModule>
Require local
ErrorDocument 403 /error/XAMPP_FORBIDDEN.html.var
</Directory>
Alias /phpmyadmin "D:/xampp/phpMyAdmin/"
<Directory "D:/xampp/phpMyAdmin">
AllowOverride AuthConfig
Require local
ErrorDocument 403 /error/XAMPP_FORBIDDEN.html.var
</Directory>
Alias /webalizer "D:/xampp/webalizer/"
<Directory "D:/xampp/webalizer">
<IfModule php_module>
<Files "webalizer.php">
php_admin_flag safe_mode off
</Files>
</IfModule>
AllowOverride AuthConfig
Require local
ErrorDocument 403 /error/XAMPP_FORBIDDEN.html.var
</Directory>
</IfModule>
# Added by phun to support PHP 7.4 in parallel to PHP 8 that came with xampp
# |
<Directory "D:xampphtdocsphotos-local-dev">
UnsetEnv PHPRC
<FilesMatch ".php$">
SetHandler application/x-httpd-php74
</FilesMatch>
</Directory>
# |
# Added by phun to support PHP 7.4 in parallel to PHP 8 that came with xampp

这是压缩后的php.ini(删除注释和空白行):

[PHP]
engine=On
short_open_tag=Off
precision=14
output_buffering=4096
zlib.output_compression=Off
implicit_flush=Off
unserialize_callback_func=
serialize_precision=-1
disable_functions=
disable_classes=
zend.enable_gc=On
zend.exception_ignore_args=Off
zend.exception_string_param_max_len=15
expose_php=On
max_execution_time=120
max_input_time=60
memory_limit=512M
error_reporting=E_ALL & ~E_DEPRECATED & ~E_STRICT
display_errors=On
display_startup_errors=On
log_errors=On
log_errors_max_len=1024
ignore_repeated_errors=Off
ignore_repeated_source=Off
report_memleaks=On
variables_order="GPCS"
request_order="GP"
register_argc_argv=Off
auto_globals_jit=On
post_max_size=40M
auto_prepend_file=
auto_append_file=
default_mimetype="text/html"
default_charset="UTF-8"
doc_root=
user_dir=
extension_dir="D:xamppphp74ext"
enable_dl=Off
file_uploads=On
upload_tmp_dir="D:xampptmp"
upload_max_filesize=40M
max_file_uploads=20
allow_url_fopen=On
allow_url_include=Off
default_socket_timeout=60
extension=bz2
extension=curl
extension=fileinfo
extension=gd
extension=gettext
extension=mbstring
extension=exif      ; Must be after mbstring as it depends on it
extension=mysqli
extension=pdo_mysql
extension=pdo_sqlite
asp_tags=Off
display_startup_errors=On
track_errors=Off
y2k_compliance=On
allow_call_time_pass_reference=Off
safe_mode=Off
safe_mode_gid=Off
safe_mode_allowed_env_vars=PHP_
safe_mode_protected_env_vars=LD_LIBRARY_PATH
error_log="D:xamppphplogsphp_error_log"
register_globals=Off
register_long_arrays=Off
magic_quotes_gpc=Off
magic_quotes_runtime=Off
magic_quotes_sybase=Off
extension=php_openssl.dll
extension=php_ftp.dll
[CLI Server]
cli_server.color=On
[Date]
[filter]
[iconv]
[imap]
[intl]
[sqlite3]
[Pcre]
[Pdo]
pdo_mysql.default_socket="MySQL"
[Pdo_mysql]
pdo_mysql.default_socket=
[Phar]
[mail function]
SMTP=localhost
smtp_port=25
mail.add_x_header=Off
[ODBC]
odbc.allow_persistent=On
odbc.check_persistent=On
odbc.max_persistent=-1
odbc.max_links=-1
odbc.defaultlrl=4096
odbc.defaultbinmode=1
[MySQLi]
mysqli.max_persistent=-1
mysqli.allow_persistent=On
mysqli.max_links=-1
mysqli.default_port=3306
mysqli.default_socket=
mysqli.default_host=
mysqli.default_user=
mysqli.default_pw=
mysqli.reconnect=Off
[mysqlnd]
mysqlnd.collect_statistics=On
mysqlnd.collect_memory_statistics=On
[OCI8]
[PostgreSQL]
pgsql.allow_persistent=On
pgsql.auto_reset_persistent=Off
pgsql.max_persistent=-1
pgsql.max_links=-1
pgsql.ignore_notice=0
pgsql.log_notice=0
[bcmath]
bcmath.scale=0
[browscap]
[Session]
session.save_handler=files
session.save_path="D:xampptmp"
session.use_strict_mode=0
session.use_cookies=1
session.use_only_cookies=1
session.name=PHPSESSID
session.auto_start=0
session.cookie_lifetime=0
session.cookie_path=/
session.cookie_domain=
session.cookie_httponly=
session.cookie_samesite=
session.serialize_handler=php
session.gc_probability=1
session.gc_divisor=1000
session.gc_maxlifetime=1440
session.referer_check=
session.cache_limiter=nocache
session.cache_expire=180
session.use_trans_sid=0
session.sid_length=26
session.trans_sid_tags="a=href,area=href,frame=src,form="
session.sid_bits_per_character=5
[Assertion]
zend.assertions=1
[COM]
[mbstring]
[gd]
[exif]
[Tidy]
tidy.clean_output=Off
[soap]
soap.wsdl_cache_enabled=1
soap.wsdl_cache_dir="/tmp"
soap.wsdl_cache_ttl=86400
soap.wsdl_cache_limit=5
[sysvshm]
[ldap]
ldap.max_links=-1
[dba]
[opcache]
[curl]
curl.cainfo="D:xamppapachebincurl-ca-bundle.crt"
[openssl]
openssl.cafile="D:xamppapachebincurl-ca-bundle.crt"
[ffi]
[Syslog]
define_syslog_variables=Off
[Session]
define_syslog_variables=Off
[Date]
date.timezone=Europe/Berlin
[MySQL]
mysql.allow_local_infile=On
mysql.allow_persistent=On
mysql.cache_size=2000
mysql.max_persistent=-1
mysql.max_link=-1
mysql.default_port=3306
mysql.default_socket="MySQL"
mysql.connect_timeout=3
mysql.trace_mode=Off
[Sybase-CT]
sybct.allow_persistent=On
sybct.max_persistent=-1
sybct.max_links=-1
sybct.min_server_severity=10
sybct.min_client_severity=10
[MSSQL]
mssql.allow_persistent=On
mssql.max_persistent=-1
mssql.max_links=-1
mssql.min_error_severity=10
mssql.min_message_severity=10
mssql.compatability_mode=Off
mssql.secure_connection=Off

我正在尝试做同样的事情(将PHP 7.4添加到最近安装的包含PHP 8.1的XAMPP),因为Drupal似乎不喜欢8.1。但我试图运行单独配置的网站(一些使用PHP 8.1和一些PHP 7.4)。

SetEnv PHPRC "\xampp\php" 

是全局默认值。它仍然指向PHP 8.1目录。如果你只是想用7.4全局替换8.1,你可以将文件夹更改为"php74"(假设你有那个新名字)。

可能包括SetEnv PHPRC "xamppphp74">

然而,PHP模块"load语句都是为线程安全PHP准备的。您将在"线程安全"中找到dll。下载PHP 7.4版本。显然,Windows 10允许线程安全运行。我以前只在早期版本的Windows上运行NON-THREAD-SAFE。所以我对这些模块组件也有点困惑。我所看到的所有指令都假定是非线程安全的PHP。

如果你想使用configuration来添加站点特定的PHP(在括号之间有站点特定的站点配置),你不能很好地将PHP 8全局路径和模块加载留在配置文件的全局部分中。

这不能回答你的问题,但它指出了方向。

我很自然地倾向于认为卸载PHP 8 dll并在PHP 7.4站点部分加载PHP 7.4 dll可以解决问题(如果您想保持全局PHP 8)。但我不知道有一个卸载命令配置文件(UnloadFile或UnloadModule)。

最新更新