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

15.1. 动态编程语言

15.1.1. Python 中的显著变化

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

Red Hat Enterprise Linux 8 提供了 Python 3.6。默认可能没有安装该软件包。要安装 Python 3.6,请使用 yum install python3 命令。

Python 2.7python2 软件包中可用。但是 Python 2 的生命周期会较短,其目的是帮助客户更顺畅地转换到 Python 3

默认 python 软件包和未版本化的 /usr/bin/python 执行文件都不会在 RHEL 8 中发布。我们建议用户直接使用 python3python2。另外,管理员也可以使用 alternatives 命令来配置 python 命令。

详情请查看 在 Red Hat Enterprise Linux 8 中使用 Python

15.1.1.2. 从 Python 2 迁移到 Python 3

作为开发人员,您可能想要将之前写为 Python 2 的代码迁移到 Python 3。有关如何将大型代码迁移到 Python 3 的详情请参考 Python 3 移植指南

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

15.1.2. 配置未指定版本的 Python

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

重要

/usr/bin/python 执行文件由 alternatives 系统控制。更新后可覆盖所有手动更改。

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

15.1.2.1. 直接配置未指定版本的 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 2,请使用:

    # alternatives --set python /usr/bin/python2

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

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

要以互动方式配置未指定版本的 python 命令,请使用这个步骤。

流程

  1. 执行以下命令:

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

    # alternatives --auto python

15.1.2.3. Python 脚本必须在 RPM 构建时在 hashbangs 中指定主版本

在 RHEL 8 中,可执行的 Python 脚本应该使用 hashbangs(shebangs),至少指定主 Python 版本。

/usr/lib/rpm/redhat/BRP-mangle-shebangs buildroot 策略(BRP)脚本在构建 RPM 软件包时会自动运行。这个脚本会尝试在所有可执行文件中修正 hashbangs。当脚本遇到未指定 Python 主版本的 Python 哈希值时,它会生成出错信息,且 RPM 的构建失败。这种模糊 hashbangs 的例子包括:

  • #! /usr/bin/python
  • #! /usr/bin/env python

要在 RPM 构建时修改 Python 脚本中的 hashbangs,请使用 platform-python-devel 软件包中的pathfix.py 脚本:

pathfix.py -pn -i %{__python3} PATH ...

可以指定多个 PATH。如果 PATH 是一个目录, pathfix.py 会递归扫描与 ^[a-zA-Z0-9_]+\.py$ 匹配的 Python 脚本,而不仅是带有模糊 hashbang 的脚本。将运行 pathfix.py 的命令添加到 %prep 部分,或者在 %install 部分末尾。

如需更多信息,请参阅 Python 脚本中的 Handling hashbangs

15.1.2.4. 绑定了 net-snmp 软件包的 Python 不可用

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

15.1.2.5. 其它资源

15.1.3. PHP中的显著变化

Red Hat Enterprise Linux 8 提供了 PHP 7.2。此版本对 PHP 5.4 进行了以下主要更改,可在 RHEL 7 中提供:

  • PHP 默认使用 FastCGI Process Manager (FPM)(安全使用线程的 httpd)
  • httpd 配置文件中不应该再使用 php_valuephp-flag 变量,它们应该在池配置中设置: /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.4. Perl中的显著变化

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

  • Unicode 9.0 现在被支持。
  • 提供了新的 op-entryloading-fileloaded-file SystemTap probes。
  • 在分配标量提高性能时,会使用 copy-on-write 机制。
  • 添加了用于明确处理 IPv4 和 IPv6 套接字的 IO::Socket::IP 模块。
  • 添加了用于以结构化方式访问 perl - V 数据的 Config::Perl::V 模块。
  • 添加了一个新的 perl-App-cpanminus 软件包,其中包括从 Perl 归档网络(CPAN)仓库中获取、提取、构建和安装模块的 cpanm 程序。
  • 出于安全考虑,当前目录. 已从 @INC 模块搜索路径中删除。
  • do 语句现在会返回一个弃用警告,因为上面描述的行为变化导致无法加载文件。
  • 不再支持 do subroutine(LIST) 调用,这会导致语法错误。
  • 默认将哈希值随机化。每次运行 perl 时,从哈希值返回的密钥和值的顺序都会发生变化。要禁用随机化,请将 PERL_PERTURB_KEYS 环境变量设置为 0
  • 在正则表达式模式中未转义的 { 个字符不再被允许。
  • 已删除 $_ 变量的语法范围支持。
  • 在阵列或哈希上使用 defined 运算符会导致严重错误。
  • UNIVERSAL 模块中导入功能会导致严重错误。
  • 已删除 find2perl, s2p, a2p, c2phpstruct 工具。
  • 已删除 ${^ENCODING} 工具。不再支持 encoding pragma 的默认模式。要在 UTF-8 以外的编码中写入源代码,请使用编码的 Filter 选项。
  • perl 打包现在与 upstream 相一致。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.5. Ruby中的显著变化

RHEL 8 提供了 Ruby 2.5,它引入了与 RHEL 7 中的 Ruby 2.0.0 相关的新功能和改进。主要变更包括:

  • 已添加增量垃圾收集器。
  • 添加了 Refinements 语法。
  • 现在收集垃圾回收符号。
  • $SAFE=2$SAFE=3 安全等级现已过时。
  • FixnumBignum 类已统一为 Integer 类。
  • 通过优化 Hash 类,改进了对实例变量的访问,以及互斥的 mutex 类, 从而提高了性能。
  • 某些旧的 API 已弃用。
  • 捆绑的程序库,如 RubyGems, Rake, RDoc, Psych, Minitesttest-unit 已更新。
  • 以前通过 Ruby 提供的其他库,如 mathn, DL, ext/tkXMLRPC 已被弃用或不再提供。
  • SemVer 版本方案现在用于 Ruby 版本。

15.1.6. SWIG 中的显著变化

RHEL 8 包括 Simplified Wrapper and Interface Generator(SWIG)版本 3.0,它比 RHEL 7 发布的 2.0 上提供了丰富的新功能、改进和程序错误修复。最值得注意的是,我们使用了对 C++11 标准的支持。SWIG 现在还支持 Go 1.6PHP 7, Octave 4.2Python 3.5

15.1.7. Node.js 包括在 RHEL 中

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

15.1.8. Tcl

工具命令语言(Tcl) 是一种动态编程语言。这个语言的解释器和 C 程序库是由 tcl 软件包提供的。

使用 TclTk (Tcl/Tk)对,可以生成跨平台 GUI 应用程序。TKtk 软件包提供。

注: Tk 可以是以下任意一种:

  • 多种语言的编程工具包
  • 可用于多种语言的 Tk C 程序库绑定,如 C、Ruby、Perl 和 Python
  • 实例化 Tk 控制台的希望解释器
  • 向特定 Tcl 解释器中添加大量新命令的 Tk 扩展

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

RHEL 8 提供了 Tcl/Tk 版本 8.6 发布,它比 Tcl/Tk 版本 8.5 提供了多个显著的更改:

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

    有两个新命令:lmapdict map。它们允许通过 Tcl 容器来表示转换。

  • 脚本堆栈的频道

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

如需了解更多有关 Tcl/Tk 版本 8.6 更改和新保护方法的详细信息,请参见以下资源:

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


为了尽快向用户提供最新的信息,本文档可能会包括由机器自动从英文原文翻译的内容。如需更多信息,请参阅此说明。