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

nr7wwzry  于 2022-11-16  发布在  Apache
关注(0)|答案(1)|浏览(176)

我在Windows 10上成功运行XAMPP(xampp-windows-x64-8.0.10-0-VS 16),其中包含PHP 8。现在我需要处理一些还没有准备好支持PHP 8的旧项目。找到了一些解释如何设置环境以支持两个PHP版本的帖子。我遵循了Is there way to use two PHP versions in XAMPP?中描述的说明,特别是在标题为“当您可以通过一个xampp安装同时使用多个PHP版本时,为什么要在PHP版本之间切换?"的回答中,选项1 * 仅对特定目录使用PHP7.4 *
我无法让它工作。以下是我目前所做的:
1.从php.net下载PHP 7.4(VC 15 x64非线程安全(2021-Sep-21 16:58:34)),并将zip解压到“xampp”目录下的新目录“php74”中,即 d:\xamp\php74
1.在 *php74”中创建了文件 php.ini,并修改了它。
1.已按说明编辑 http-xampp.conf 文件。
使用此设置(请参阅下面的配置文件),PHP 8就绪网站(仍然)在brwoser中正确显示。
当访问 localhost/photos-local-dev/ 时,我可以看到Apache正在尝试为该网站运行PHP 7.4,因为之前的错误消息 *...调用未定义函数get_magic_quotes_gpc()... * 不再显示。因此,httpd-xampp.conf 中的新指令是活动的。
但是,浏览器并没有将 * index.php * 传递给PHP7.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 ready网站,浏览器将 index.php 显示为文本,如上所示。这证实了这些 * load * 是必不可少的。那么,我可以添加指向PHP 7.4模块的相应指令吗?Apache如何区分?但是,唉,modules php7ts.dllphp7apach2_4.dll 甚至不存在于PHP74目录中?这些一定是xampp提供的PHP附加组件,因为它们在正式的zip文件中找不到。
有人真的让这个工作吗?上面提到的堆栈溢出问答的一些评论似乎表明了这一点。
那么,我错过了什么?
这是 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:\xampp\htdocs\photos-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:\xampp\php74\ext"
enable_dl=Off
file_uploads=On
upload_tmp_dir="D:\xampp\tmp"
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:\xampp\php\logs\php_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:\xampp\tmp"
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:\xampp\apache\bin\curl-ca-bundle.crt"
[openssl]
openssl.cafile="D:\xampp\apache\bin\curl-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
bgibtngc

bgibtngc1#

我尝试做同样的事情(将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“\xampp\php74”将覆盖该部分。
然而,“PHP模块”加载语句都是针对线程安全PHP的。您可以在PHP 7.4下载的“线程安全”版本中找到DLL。显然,Windows 10允许运行线程安全。我过去在早期版本的Windows上只运行非线程安全。所以我对这些模块组件也有点困惑。我所看到的所有指令都假定非线程安全PHP。
如果您想使用配置添加特定于站点的PHP(在这些括号之间使用特定于站点的站点配置),您不能仅仅让PHP 8全局路径和模块加载在配置文件的全局部分处于活动状态。
这没有回答你的问题,但它指出了方向。
我很自然地倾向于认为卸载PHP 8 DLL并加载PHP 7.4 DLL可以解决这个问题(如果你想保持全局PHP 8的话)。但是我不知道有一个用于配置文件的UNLOAD命令(UnloadFile或UnloadModule)。

相关问题