第 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.7
在 python2
软件包中可用。但是 Python 2
的生命周期会较短,其目的是帮助客户更顺畅地转换到 Python 3
。
默认 python
软件包和未版本化的 /usr/bin/python
执行文件都不会在 RHEL 8 中发布。我们建议用户直接使用 python3
或 python2
。另外,管理员也可以使用 alternatives
命令来配置 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
命令。请注意,在将未指定版本的命令配置为对应的版本前,需要安装所需的 python3
、python38
或 python2
软件包。
/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
命令,请使用这个步骤。
流程
执行以下命令:
# alternatives --config python
- 从提供的列表中选择所需的版本。
要重置此配置并删除被指定版本的
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-snmp
、python2-net-snmp
或 python3-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_value
和php-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
(请注意mysqli
和pdo_mysql
扩展仍可用,由php-mysqlnd 软件包
提供) -
memcache
15.1.4. Perl
中的显著变化
RHEL 8 提供了 Perl 5.26
,与 RHEL 7 中的版本相比有以下变化:
-
Unicode 9.0
现在被支持。 -
提供了新的
op-entry
、loading-file
和loaded-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
,c2ph
和pstruct
工具。 -
已删除
${^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
安全等级现已过时。 -
Fixnum
和Bignum
类已统一为Integer
类。 -
通过优化
Hash
类,改进了对实例变量的访问,以及互斥的mutex
类, 从而提高了性能。 - 某些旧的 API 已弃用。
-
捆绑的程序库,如
RubyGems
,Rake
,RDoc
,Psych
,Minitest
和test-unit
已更新。 -
以前通过
Ruby
提供的其他库,如mathn
,DL
,ext/tk
和XMLRPC
已被弃用或不再提供。 -
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.6
、PHP 7
, Octave 4.2
和 Python 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
软件包提供的。
使用 Tcl 和 Tk (Tcl/Tk)对,可以生成跨平台 GUI 应用程序。TK 由 tk
软件包提供。
注: 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 压缩
列表处理
有两个新命令:
lmap
和dict map
。它们允许通过 Tcl 容器来表示转换。脚本堆栈的频道
有两个新命令,即 ,
chan push
和chan pop
,可允许添加或者删除与 I/O 频道的转换。
如需了解更多有关 Tcl/Tk 版本 8.6 更改和新保护方法的详细信息,请参见以下资源:
如果您需要迁移到 Tcl/Tk 8.6,请参阅 Migrating to Tcl/Tk 8.6。
为了尽快向用户提供最新的信息,本文档可能会包括由机器自动从英文原文翻译的内容。如需更多信息,请参阅此说明。