Red Hat Training

A Red Hat training course is available for RHEL 8

第 15 章 动态编程语言、网页服务器、数据库服务器

15.1. 动态编程语言

15.1.1. Python 中的显著变化

15.1.1.1. RHEL 8 中,Python 3 是默认的 Python 实现

Red Hat Enterprise Linux 8 带有多个 Python 3 版本。Python 3.6 将在 RHEL 8 的整个生命周期内受支持。默认情况下,可能不会安装对应的软件包。

Python 2.7 包括在 python2 软件包中。但是,Python 2 的生命周期会更短,其目的在于让客户更顺利地过渡到 Python 3

详情请查看 Python 版本

默认 python 软件包和未指定版本的 /usr/bin/python 可执行文件都不是在 RHEL 8 中发布。我们建议用户直接使用 python3 或者 python2。另外,管理员也可以使用 alternatives 命令配置未指定版本的 python 命令。请参阅配置未指定版本的 Python

15.1.1.2. 从 Python 2 迁移到 Python 3

作为开发者,您可能想要将之前使用 Python 2 编写的代码迁移到 Python 3。

有关如何将大型代码库迁移到 Python 3 的更多信息,请参阅 Storageative Python 3 Porting Guide

请注意,在迁移后,原始 Python 2 代码就可以被 Python 3 解释器解释,也可以被 Python 2 解释器解析。

15.1.1.3. 配置未指定版本的 Python

系统管理员可以使用 alternatives 命令配置位于 /usr/bin/python 的未指定版本的 python 命令。请注意,在将未指定版本的命令配置为相应的版本前,必须安装所需的软件包 python3python38python39python2

重要

/usr/bin/python 可执行文件由 alternatives 系统控制。更新时可能会覆盖任何手动更改。

其他 Python 相关命令,如 pip3,没有可配置的未指定版本的变体。

15.1.1.3.1. 直接配置未指定版本的 python 命令

您可以将未指定版本的 python 命令直接配置为所选版本的 Python。

先决条件

  • 确保安装了所需的 Python 版本。

流程

  • 要将未指定版本的 python 命令配置为 Python 3.6,请使用:

    # alternatives --set python /usr/bin/python3
  • 要将未指定版本的 python 命令配置为 Python 3.8,请使用:

    # alternatives --set python /usr/bin/python3.8
  • 要将未指定版本的 python 命令配置为 Python 3.9,请使用:

    # alternatives --set python /usr/bin/python3.9
  • 要将未指定版本的 python 命令配置为 Python 2,请使用:

    # alternatives --set python /usr/bin/python2
15.1.1.3.2. 以互动方式将未指定版本的 python 命令配置为所需的 Python 版本

您可以以互动方式将未指定版本的 python 命令配置为所需的 Python 版本。

先决条件

  • 确保安装了所需的 Python 版本。

流程

  1. 要以互动方式配置未指定版本的 python 命令,请使用:

    # alternatives --config python
  2. 从提供的列表中选择所需版本。
  3. 要重置此配置并删除未指定版本的 python 命令,请使用:

    # alternatives --auto python
15.1.1.3.3. 其他资源
  • alternatives(8)unversioned-python(1) man page

15.1.1.4. 在 Python 脚本中处理解释器指令

在 Red Hat Enterprise Linux 8 中,可执行 Python 脚本应该使用在最小 Python 版本中明确指定的解释器指令(也称为 hashbangs 或 shebangs)。例如:

#!/usr/bin/python3
#!/usr/bin/python3.6
#!/usr/bin/python2

在构建任何 RPM 软件包时,/usr/lib/rpm/redhat/brp-mangle-shebangs buildroot 策略(BRP)脚本会自动运行,并尝试在所有可执行文件中更正解释器指令。

当遇到带有模糊解释器指令的 Python 脚本时,BRP 脚本会生成错误,例如:

#!/usr/bin/python

#!/usr/bin/env python
15.1.1.4.1. 在 Python 脚本中修改解释器指令

修改 Python 脚本中会导致 RPM 构建时构建错误的解释器指令。

先决条件

  • 您的 Python 脚本中的一些解释指令会导致构建错误。

流程

要修改解释程序指令,请完成以下任务之一:

  • 应用 platform-python-devel 软件包中的 pathfix.py 脚本:

    # pathfix.py -pn -i %{__python3} PATH …​

    请注意,可以指定多个 PATHs。如果 PATH 是一个目录,pathfix.py 会以递归方式扫描与模式 ^[a-zA-Z0-9_]+\.py$ 匹配的任何 Python 脚本,而不仅仅是包含模糊解释器指令的 Python 脚本。在 %prep 部分或 %install 部分末尾添加这个命令。

  • 修改打包的 Python 脚本,使其符合预期的格式。为此,pathfix.py 也可以在 RPM 构建过程外使用。当在 RPM 构建之外运行 pathfix.py 时,使用解释器指令的路径(如 /usr/bin/python3 )替换上例中的 %{__python3}

如果打包的 Python 脚本需要 Python 3.6 以外的版本,请调整前面的命令使其包含所需的版本。

15.1.1.4.2. 在自定义软件包中更改 /usr/bin/python3 解释器指令

默认情况下,/usr/bin/python3 形式的解释程序指令被替换为从 platform-python 软件包指向 Python 的解释程序指令,该指令用于 Red Hat Enterprise Linux 的系统工具。您可以更改自定义软件包中的 /usr/bin/python3 解释程序指令,使其指向从 AppStream 存储库安装的特定 Python 版本。

流程

  • 要为特定版本的 Python 构建软件包,请将相应 python 软件包的 python*-rpm-macros 子软件包添加到 SPEC 文件的 BuildRequires 部分。例如,对于 Python 3.6,包括以下行:

    BuildRequires:  python36-rpm-macros

    因此,自定义软件包中的 /usr/bin/python3 解释程序指令会自动转换为 /usr/bin/python3.6

注意

要防止 BRP 脚本检查和修改解释器指令,请使用以下 RPM 指令:

%undefine %brp_mangle_shebangs

15.1.1.5. Python 绑定 net-snmp 软件包不可用

Net-SNMP 工具套件没有为 Python 3 提供绑定,它是 RHEL 8 中的默认 Python 实现。因此,RHEL 8 不提供 python-net-snmppython2-net-snmppython3-net-snmp 软件包。

15.1.2. PHP 中的显著变化

Red Hat Enterprise Linux 8 带有 PHP 7.2。这个版本在 RHEL 7 中包括以下主要更改,它包括在 PHP 5.4 中:

  • PHP 默认使用 FastCGI Process Manager(FPM)(与线程 httpd一起使用的安全)
  • php_valuephp-flag 变量不应该在 httpd 配置文件中使用;它们应在池配置中设置: /etc/php-fpm.d/*.conf
  • PHP 脚本错误和警告记录到 /var/log/php-fpm/www-error.log 文件,而不是记录到 /var/log/httpd/error.log
  • 当更改 PHP max_execution_time 配置变量时,应增加 httpd ProxyTimeout 设置以匹配
  • 运行 PHP 脚本的用户现在在 FPM 池配置中配置( /etc/php-fpm.d/www.conf 文件,apache 用户是默认设置)
  • php-fpm 服务需要在配置更改或安装新扩展后重启
  • zip 扩展已经从 php-common 软件包移动到单独的软件包中, php-pecl-zip

删除了以下扩展:

  • aspell
  • mysql (注意 mysqlipdo_mysql 扩展仍可用,由 php-mysqlnd 软件包提供)
  • memcache

15.1.3. Perl 中的显著变化

RHEL 8 中的 Perl 5.26 与 RHEL 7 中的版本相比有以下变化:

  • Unicode 9.0 现在被支持。
  • 提供了新的 op-entryloading-fileloaded-file SystemTap 探测。
  • 在分配 scalar 时,使用写时复制机制来提高性能。
  • 添加了用于透明处理 IPv4 和 IPv6 套接字的 IO::Socket::IP 模块。
  • 添加了以结构方式访问 perl -V 数据的 Config::Perl::V 模块。
  • 添加了一个新的 perl-App-cpanminus 软件包,其中包含从 Perl Archive Network(CPAN)仓库获取、提取、构建和安装模块的 cpanm 工具。
  • 出于安全考虑,当前目录 . 已从 @INC 模块搜索路径中删除。
  • 现在,当因为上述行为更改而加载文件时,do 语句会返回弃用警告。
  • do subroutine(LIST) 调用不再被支持,并导致语法错误。
  • 现在,默认随机化哈希。每个 perl 运行的哈希更改返回键和值的顺序。要禁用随机化,将 PERL_PERTURB_KEYS 环境变量设置为 0
  • 不再允许在正则表达式中使用未转义的 { 字符。
  • 删除了对 $_ 变量的样式范围支持。
  • 在阵列或散列中使用 defined 运算符会导致严重错误。
  • UNIVERSAL 模块导入函数会导致致命错误。
  • find2perls2pa2p c2phpstruct 工具已被删除。
  • ${^ENCODING} 工具已被删除。encoding sragma 的默认模式不再被支持。要在 UTF-8 以外的其它编码中写入源代码,请使用编码的 Filter 选项。
  • perl 打包现在与上游社区一致。perl 软件包也会安装核心模块,而 /usr/bin/perl 解释程序由 perl-interpreter 软件包提供。在以前的版本中,perl 软件包只包含一个最小解析程序,而 perl-core 软件包包括解释器和核心模块。
  • IO::Socket::SSL Perl 模块不再从 ./certs/my-ca.pem 文件或 ./ca 目录加载证书颁发机构证书、来自 ./certs/server-key.pem 文件的服务器私钥、来自 ./certs/server-cert.pem 文件的服务器证书、来自 ./certs/client-key.pem 文件的客户端私钥,以及来自 ./certs/client-cert.pem 文件的客户端证书。明确指定文件的路径。

15.1.4. Ruby 中的显著变化

RHEL 8 提供 Ruby 2.5,它比 RHEL 7 中的 Ruby 2.0.0 提供了多个新功能和增强。主要变更包括:

  • 添加了增量垃圾收集器。
  • 添加了 Refinements 语法。
  • 现在会对符号进行垃圾收集。
  • $SAFE=2$SAFE=3 安全级别现已过时。
  • FixnumBignum 类已统一为 Integer 类。
  • 通过优化 Hash 类提供了性能,改进了对实例变量的访问,Mutex 类更小、更快。
  • 某些旧的 API 已被弃用。
  • 捆绑的库,如 RubyGemsRakeRDocPsychMinitesttest-unit 已更新。
  • 以前,通过 Ruby 发布的其它库,如 mathnDLext/tkXMLRPC 已被弃用或不再包含。
  • SemVer 版本方案现在用于 Ruby 版本。

15.1.5. SWIG 中的显著变化

RHEL 8 包含简化的 wrapper 和 Interface Generator(SWIG)版本 3.0,它比 RHEL 7 中发布的版本 2.0 提供了大量新功能、增强和程序错误修复。最值得注意的是,实现了对 C++11 标准的支持。SWIG 现在还支持 Go 1.6PHP 7Octave 4.2Python 3.5

15.1.6. Node.js RHEL 提供了新功能

Node.js 是一个软件开发平台,用于使用 JavaScript 编程语言开发快速、可扩展的网络应用程序。它首次在 RHEL 中提供。之前,它只通过 Software Collection 提供。RHEL 8 提供 Node.js 10

15.1.7. Tcl

Tool command language (Tcl) 是动态编程语言。此语言的解释程序以及 C 库由 tcl 软件包提供。

使用 TclTk (Tcl/Tk)启用创建跨平台 GUI 应用程序。Tktk 软件包提供。

请注意: Tk 可以引用以下任意一种:

  • 用于多种语言的编程工具包
  • Tk C 库绑定可用于多种语言,如 C、Ruby、Perl 和 Python
  • 一个需要解释器来实例化 Tk 控制台
  • 为特定 Tcl 解释器添加多个新命令的 Tk 扩展

15.1.7.1. Tcl/Tk 8.6 中的显著变化

RHEL 8 发布 Tcl/Tk version 8.6,针对它提供了多个显著变化 Tcl/Tk version 8.5:

  • 基于对象的编程支持
  • 无堆栈评估实施
  • 增强的例外处理
  • 使用 Tcl 构建并安装的第三方软件包集合
  • 启用多线程操作
  • 对 SQL 数据库增强脚本的支持
  • IPv6 网络支持
  • 内置 Zlib 压缩
  • 列表处理

    提供了两个新命令 lmapdict map,它们允许通过它们进行转换。 Tcl 容器.

  • 由脚本构成的堆叠通道

    有两个新命令 chan pushchan pop 可用,允许向 I/O 频道添加或删除转换。

如需了解更多与 相关的信息 Tcl/Tk version 8.6 更改和新资源,请查看以下资源:

如果您需要迁移到 Tcl/Tk 8.6请参阅迁移到 Tcl/Tk 8.6