diff --git a/translated/tech/20150612 How to Configure Apache Containers with Docker on Fedora 22.md b/published/20150612 How to Configure Apache Containers with Docker on Fedora 22.md similarity index 69% rename from translated/tech/20150612 How to Configure Apache Containers with Docker on Fedora 22.md rename to published/20150612 How to Configure Apache Containers with Docker on Fedora 22.md index 9665855542..0dafdcb675 100644 --- a/translated/tech/20150612 How to Configure Apache Containers with Docker on Fedora 22.md +++ b/published/20150612 How to Configure Apache Containers with Docker on Fedora 22.md @@ -1,28 +1,29 @@ 如何在Fedora 22上面配置Apache的Docker容器 ============================================================================= -在这篇文章中,我们将会学习关于Docker的一些知识,如何使用Docker部署Apache httpd服务,并且共享到Docker Hub上面去。首先,我们学习怎样拉取和使用Docker Hub里面的镜像,然后交互式地安装Apache到一个Fedora 22的镜像里去,之后我们将会学习如何用一个Dockerfile文件来制作一个镜像,以一种更快,更优雅的方式。最后,我们会在Docker Hub上公开我们创建地镜像,这样以后任何人都可以下载并使用它。 -### 安装Docker,运行hello world ### +在这篇文章中,我们将会学习关于Docker的一些知识,如何使用Docker部署Apache httpd服务,并且共享到Docker Hub上面去。首先,我们学习怎样拉取和使用Docker Hub里面的镜像,然后在一个Fedora 22的镜像上交互式地安装Apache,之后我们将会学习如何用一个Dockerfile文件来以一种更快,更优雅的方式制作一个镜像。最后,我们将我们创建的镜像发布到Docker Hub上,这样以后任何人都可以下载并使用它。 + +### 安装并初体验Docker ### **要求** -运行Docker,里至少需要满足这些: +运行Docker,你至少需要满足这些: - 你需要一个64位的内核,版本3.10或者更高 -- Iptables 1.4 - Docker会用来做网络配置,如网络地址转换(NAT) +- Iptables 1.4 - Docker会用它来做网络配置,如网络地址转换(NAT) - Git 1.7 - Docker会使用Git来与仓库交流,如Docker Hub - ps - 在大多数环境中这个工具都存在,在procps包里有提供 -- root - 防止一般用户可以通过TCP或者其他方式运行Docker,为了简化,我们会假定你就是root +- root - 尽管一般用户可以通过TCP或者其他方式来运行Docker,但是为了简化,我们会假定你就是root -### 使用dnf安装docker ### +#### 使用dnf安装docker #### 以下的命令会安装Docker dnf update && dnf install docker -**注意**:在Fedora 22里,你仍然可以使用Yum命令,但是被DNF取代了,而且在纯净安装时不可用了。 +**注意**:在Fedora 22里,你仍然可以使用Yum命令,但是它被DNF取代了,而且在纯净安装时不可用了。 -### 检查安装 ### +#### 检查安装 #### 我们将要使用的第一个命令是docker info,这会输出很多信息给你: @@ -32,25 +33,29 @@ docker version -### 启动Dcoker为守护进程 ### +#### 以守护进程方式启动Dcoker#### 你应该启动一个docker实例,然后她会处理我们的请求。 docker -d +现在我们设置 docker 随系统启动,以便我们不需要每次重启都需要运行上述命令。 + + chkconfig docker on + 让我们用Busybox来打印hello world: dockr run -t busybox /bin/echo "hello world" -这个命令里,我们告诉Docker执行 /bin/echo "hello world",在Busybox镜像的一个实例/容器里。Busybox是一个小型的POSIX环境,将许多小工具都结合到了一个单独的可执行程序里。 +这个命令里,我们告诉Docker在Busybox镜像的一个实例/容器里执行 /bin/echo "hello world"。Busybox是一个小型的POSIX环境,将许多小工具都结合到了一个单独的可执行程序里。 如果Docker不能在你的系统里找到本地的Busybox镜像,她就会自动从Docker Hub里拉取镜像,正如你可以看下如下的快照: ![Hello world with Busybox](http://blog.linoxide.com/wp-content/uploads/2015/06/docker-hello-world-busybox-complete.png) -Hello world with Busybox +*Hello world with Busybox* -再次尝试相同的命令,这次由于Docker已经有了本地的Busybox镜像,所有你将会看到的就是echo的输出: +再次尝试相同的命令,这次由于Docker已经有了本地的Busybox镜像,你将会看到的全部就是echo的输出: docker run -t busybox /bin/echo "hello world" @@ -66,31 +71,31 @@ Hello world with Busybox docker pull fedora:22 -起一个容器在后台运行: +启动一个容器在后台运行: docker run -d -t fedora:22 /bin/bash -列出正在运行地容器,并用名字标识,如下 +列出正在运行地容器及其名字标识,如下 docker ps ![listing with docker ps and attaching with docker attach](http://blog.linoxide.com/wp-content/uploads/2015/06/docker-ps-with-docker-attach-highlight.png) -使用docker ps列出,并使用docker attach进入一个容器里 +*使用docker ps列出,并使用docker attach进入一个容器里* -angry_noble是docker分配给我们容器的名字,所以我们来附上去: +angry_noble是docker分配给我们容器的名字,所以我们来连接上去: docker attach angry_noble -注意:每次你起一个容器,就会被给与一个新的名字,如果你的容器需要一个固定的名字,你应该在 docker run 命令里使用 -name 参数。 +注意:每次你启动一个容器,就会被给与一个新的名字,如果你的容器需要一个固定的名字,你应该在 docker run 命令里使用 -name 参数。 -### 安装Apache ### +#### 安装Apache #### 下面的命令会更新DNF的数据库,下载安装Apache(httpd包)并清理dnf缓存使镜像尽量小 dnf -y update && dnf -y install httpd && dnf -y clean all -配置Apache +**配置Apache** 我们需要修改httpd.conf的唯一地方就是ServerName,这会使Apache停止抱怨 @@ -98,7 +103,7 @@ angry_noble是docker分配给我们容器的名字,所以我们来附上去: **设定环境** -为了使Apache运行为单机模式,你必须以环境变量的格式提供一些信息,并且你也需要在这些变量里的目录设定,所以我们将会用一个小的shell脚本干这个工作,当然也会启动Apache +为了使Apache运行为独立模式,你必须以环境变量的格式提供一些信息,并且你也需要创建这些变量里的目录,所以我们将会用一个小的shell脚本干这个工作,当然也会启动Apache vi /etc/httpd/run_apache_foreground @@ -106,7 +111,7 @@ angry_noble是docker分配给我们容器的名字,所以我们来附上去: #!/bin/bash - #set variables + #设置环境变量 APACHE_LOG_DI=R"/var/log/httpd" APACHE_LOCK_DIR="/var/lock/httpd" APACHE_RUN_USER="apache" @@ -114,12 +119,12 @@ angry_noble是docker分配给我们容器的名字,所以我们来附上去: APACHE_PID_FILE="/var/run/httpd/httpd.pid" APACHE_RUN_DIR="/var/run/httpd" - #create directories if necessary + #如果需要的话,创建目录 if ! [ -d /var/run/httpd ]; then mkdir /var/run/httpd;fi if ! [ -d /var/log/httpd ]; then mkdir /var/log/httpd;fi if ! [ -d /var/lock/httpd ]; then mkdir /var/lock/httpd;fi - #run Apache + #运行 Apache httpd -D FOREGROUND **另外地**,你可以粘贴这个片段代码到容器shell里并运行: @@ -130,11 +135,11 @@ angry_noble是docker分配给我们容器的名字,所以我们来附上去: **保存你的容器状态** -你的容器现在可以运行Apache,是时候保存容器当前的状态为一个镜像,以备你需要的时候使用。 +你的容器现在准备好运行Apache,是时候保存容器当前的状态为一个镜像,以备你需要的时候使用。 为了离开容器环境,你必须顺序按下 **Ctrl+q** 和 **Ctrl+p**,如果你仅仅在shell执行exit,你同时也会停止容器,失去目前为止你做过的所有工作。 -回到Docker主机,使用 **docker commit** 加容器和你期望的仓库名字/标签: +回到Docker主机,使用 **docker commit** 及容器名和你想要的仓库名字/标签: docker commit angry_noble gaiada/apache @@ -144,17 +149,15 @@ angry_noble是docker分配给我们容器的名字,所以我们来附上去: **运行并测试你的镜像** -最后,从你的新镜像起一个容器,并且重定向80端口到容器: +最后,从你的新镜像启动一个容器,并且重定向80端口到该容器: docker run -p 80:80 -d -t gaiada/apache /etc/httpd/run_apache_foreground - - 到目前,你正在你的容器里运行Apache,打开你的浏览器访问该服务,在[http://localhost][2],你将会看到如下Apache默认的页面 ![Apache default page running from Docker container](http://blog.linoxide.com/wp-content/uploads/2015/06/docker-apache-running.png) -在容器里运行的Apache默认页面 +*在容器里运行的Apache默认页面* ### 使用Dockerfile Docker化Apache ### @@ -190,21 +193,14 @@ angry_noble是docker分配给我们容器的名字,所以我们来附上去: CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"] - - 我们一起来看看Dockerfile里面有什么: -**FROM** - 这告诉docker,我们将要使用Fedora 22作为基础镜像 - -**MAINTAINER** 和 **LABLE** - 这些命令对镜像没有直接作用,属于标记信息 - -**RUN** - 自动完成我们之前交互式做的工作,安装Apache,新建目录并编辑httpd.conf - -**ENV** - 设置环境变量,现在我们再不需要run_apache_foreground脚本 - -**EXPOSE** - 暴露80端口给外网 - -**CMD** - 设置默认的命令启动httpd服务,这样我们就不需要每次起一个新的容器都重复这个工作 +- **FROM** - 这告诉docker,我们将要使用Fedora 22作为基础镜像 +- **MAINTAINER** 和 **LABLE** - 这些命令对镜像没有直接作用,属于标记信息 +- **RUN** - 自动完成我们之前交互式做的工作,安装Apache,新建目录并编辑httpd.conf +- **ENV** - 设置环境变量,现在我们再不需要run_apache_foreground脚本 +- **EXPOSE** - 暴露80端口给外网 +- **CMD** - 设置默认的命令启动httpd服务,这样我们就不需要每次起一个新的容器都重复这个工作 **建立该镜像** @@ -214,7 +210,7 @@ angry_noble是docker分配给我们容器的名字,所以我们来附上去: ![docker build complete](http://blog.linoxide.com/wp-content/uploads/2015/06/docker-build-complete.png) -docker完成创建 +*docker完成创建* 使用 **docker images** 列出本地镜像,查看是否存在你新建的镜像: @@ -226,7 +222,7 @@ docker完成创建 这就是Dockerfile的工作,使用这项功能会使得事情更加容易,快速并且可重复生成。 -### 公开你的镜像 ### +### 发布你的镜像 ### 直到现在,你仅仅是从Docker Hub拉取了镜像,但是你也可以推送你的镜像,以后需要也可以再次拉取他们。实际上,其他人也可以下载你的镜像,在他们的系统中使用它而不需要改变任何东西。现在我们将要学习如何使我们的镜像对世界上的其他人可用。 @@ -236,7 +232,7 @@ docker完成创建 ![Docker Hub signup page](http://blog.linoxide.com/wp-content/uploads/2015/06/docker-hub-signup.png) -Docker Hub 注册页面 +*Docker Hub 注册页面* **登录** @@ -256,11 +252,11 @@ Docker Hub 注册页面 ![Docker push Apache image complete](http://blog.linoxide.com/wp-content/uploads/2015/06/docker-pushing-apachedf-complete.png) -Docker推送Apache镜像完成 +*Docker推送Apache镜像完成* ### 结论 ### -现在,你知道如何Docker化Apache,试一试包含其他一些组块,Perl,PHP,proxy,HTTPS,或者任何你需要的东西。我希望你们这些家伙喜欢她,并推送你们自己的镜像到Docker Hub。 +现在,你知道如何Docker化Apache,试一试包含其他一些组件,Perl,PHP,proxy,HTTPS,或者任何你需要的东西。我希望你们这些家伙喜欢她,并推送你们自己的镜像到Docker Hub。 -------------------------------------------------------------------------------- @@ -268,7 +264,7 @@ via: http://linoxide.com/linux-how-to/configure-apache-containers-docker-fedora- 作者:[Carlos Alberto][a] 译者:[wi-cuckoo](https://github.com/wi-cuckoo) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译,[Linux中国](https://linux.cn/) 荣誉推出 diff --git a/translated/tech/20150612 Linux_Logo--A Command Line Tool to Print Color ANSI Logos of Linux Distributions.md b/published/20150612 Linux_Logo--A Command Line Tool to Print Color ANSI Logos of Linux Distributions.md similarity index 72% rename from translated/tech/20150612 Linux_Logo--A Command Line Tool to Print Color ANSI Logos of Linux Distributions.md rename to published/20150612 Linux_Logo--A Command Line Tool to Print Color ANSI Logos of Linux Distributions.md index e9a27aff00..8c17cc4f64 100644 --- a/translated/tech/20150612 Linux_Logo--A Command Line Tool to Print Color ANSI Logos of Linux Distributions.md +++ b/published/20150612 Linux_Logo--A Command Line Tool to Print Color ANSI Logos of Linux Distributions.md @@ -1,23 +1,22 @@ Linux_Logo – 输出彩色 ANSI Linux 发行版徽标的命令行工具 ================================================================================ -linuxlogo 或 linux_logo 是一款在Linux命令行下生成附带系统信息的彩色 ANSI 发行版徽标的工具。 - +linuxlogo(或叫 linux_logo)是一款在Linux命令行下用彩色 ANSI 代码生成附带有系统信息的发行版徽标的工具。 ![Linux_Logo – 输出彩色 ANSI Linux 发行版徽标](http://www.tecmint.com/wp-content/uploads/2015/06/Linux_Logo.png) -Linux_Logo – 输出彩色 ANSI Linux 发行版徽标 +*Linux_Logo – 输出彩色 ANSI Linux 发行版徽标* -这个小工具可以从 /proc 文件系统中获取系统信息并可以显示包括主机发行版在内的其他很多发行版的徽标。 +这个小工具可以从 /proc 文件系统中获取系统信息并可以显示包括主机上安装的发行版在内的很多发行版的徽标。 -与徽标一同显示的系统信息包括 – Linux 内核版本,最近一次编译Linux内核的时间,处理器/核心数量,速度,制造商,以及哪一代处理器。它还能显示总共的物理内存大小。 +与徽标一同显示的系统信息包括 : Linux 内核版本,最近一次编译Linux内核的时间,处理器/核心数量,速度,制造商,以及哪一代处理器。它还能显示总共的物理内存大小。 -值得一提的是,screenfetch是一个拥有类似功能的工具,它也能显示发行版徽标,同时还提供更加详细美观的系统信息。我们之前已经介绍过这个工具,你可以参考一下链接: -- [ScreenFetch – Generates Linux System Information][1] +无独有偶,screenfetch是一个拥有类似功能的工具,它也能显示发行版徽标,同时还提供更加详细美观的系统信息。我们之前已经介绍过这个工具,你可以参考一下链接: +- [screenFetch: 命令行信息截图工具][1] -linux_logo 和 Screenfetch 并不能相提并论。尽管 screenfetch 的输出较为整洁并提供更多细节, linux_logo 则提供了更多的彩色 ANSI 图标, 并且提供了格式化输出的选项。 +linux\_logo 和 Screenfetch 并完全一样。尽管 screenfetch 的输出较为整洁并提供更多细节, 但 linux\_logo 则提供了更多的彩色 ANSI 图标, 并且提供了格式化输出的选项。 -linux_logo 主要使用C语言编写并将 linux 徽标呈现在 X 窗口系统中因此需要安装图形界面 X11 或 X 系统。这个软件使用GNU 2.0协议。 +linux\_logo 主要使用C语言编写并将 linux 徽标呈现在 X 窗口系统中因此需要安装图形界面 X11 或 X 系统(LCTT 译注:此处应是错误的。按说不需要任何图形界面支持,并且译者从其官方站 http://www.deater.net/weave/vmwprod/linux_logo 也没找到任何相关 X11的信息)。这个软件使用GNU 2.0协议。 本文中,我们将使用以下环境测试 linux_logo 工具。 @@ -26,7 +25,7 @@ linux_logo 主要使用C语言编写并将 linux 徽标呈现在 X 窗口系统 ### 在 Linux 中安装 Linux Logo工具 ### -**1. linuxlogo软件包 ( 5.11 稳定版) 可通过如下方式使用 apt, yum,或 dnf 在所有发行版中使用默认的软件仓库进行安装** +**1. linuxlogo软件包 ( 5.11 稳定版) 可通过如下方式使用 apt, yum 或 dnf 在所有发行版中使用默认的软件仓库进行安装** # apt-get install linux_logo [用于基于 Apt 的系统] (译者注:Ubuntu中,该软件包名为linuxlogo) # yum install linux_logo [用于基于 Yum 的系统] @@ -42,7 +41,7 @@ linux_logo 主要使用C语言编写并将 linux 徽标呈现在 X 窗口系统 ![获取默认系统徽标](http://www.tecmint.com/wp-content/uploads/2015/06/Get-Default-OS-Logo.png) -获取默认系统徽标 +*获取默认系统徽标* **3. 使用 `[-a]` 选项可以输出没有颜色的徽标。当在黑白终端里使用 linux_logo 时,这个选项会很有用。** @@ -50,7 +49,7 @@ linux_logo 主要使用C语言编写并将 linux 徽标呈现在 X 窗口系统 ![黑白 Linux 徽标](http://www.tecmint.com/wp-content/uploads/2015/06/Black-and-White-Linux-Logo.png) -黑白 Linux 徽标 +*黑白 Linux 徽标* **4. 使用 `[-l]` 选项可以仅输出徽标而不包含系统信息。** @@ -58,7 +57,7 @@ linux_logo 主要使用C语言编写并将 linux 徽标呈现在 X 窗口系统 ![输出发行版徽标](http://www.tecmint.com/wp-content/uploads/2015/06/Print-Distribution-Logo.png) -输出发行版徽标 +*输出发行版徽标* **5. `[-u]` 选项可以显示系统运行时间。** @@ -66,7 +65,7 @@ linux_logo 主要使用C语言编写并将 linux 徽标呈现在 X 窗口系统 ![输出系统运行时间](http://www.tecmint.com/wp-content/uploads/2015/06/Print-System-Uptime.png) -输出系统运行时间 +*输出系统运行时间* **6. 如果你对系统平均负载感兴趣,可以使用 `[-y]` 选项。你可以同时使用多个选项。** @@ -74,7 +73,7 @@ linux_logo 主要使用C语言编写并将 linux 徽标呈现在 X 窗口系统 ![输出系统平均负载](http://www.tecmint.com/wp-content/uploads/2015/06/Print-System-Load-Average.png) -输出系统平均负载 +*输出系统平均负载* 如需查看更多选项并获取相关帮助,你可以使用如下命令。 @@ -82,7 +81,7 @@ linux_logo 主要使用C语言编写并将 linux 徽标呈现在 X 窗口系统 ![Linuxlogo 选项及帮助](http://www.tecmint.com/wp-content/uploads/2015/06/linuxlogo-options.png) -Linuxlogo选项及帮助 +*Linuxlogo选项及帮助* **7. 此工具内置了很多不同发行版的徽标。你可以使用 `[-L list]` 选项查看在这些徽标的列表。** @@ -90,7 +89,7 @@ Linuxlogo选项及帮助 ![Linux 徽标列表](http://www.tecmint.com/wp-content/uploads/2015/06/List-of-Linux-Logos.png) -Linux 徽标列表 +*Linux 徽标列表* 如果你想输出这个列表中的任意徽标,可以使用 `-L NUM` 或 `-L NAME` 来显示想要选中的图标。 @@ -105,7 +104,7 @@ Linux 徽标列表 ![输出 AIX 图标](http://www.tecmint.com/wp-content/uploads/2015/06/Print-AIX-Logo.png) -输出 AIX 图标 +*输出 AIX 图标* **注**: 命令中的使用 `-L 1` 是因为 AIX 徽标在列表中的编号是1,而使用 `-L aix` 则是因为 AIX 徽标在列表中的名称为 aix @@ -116,13 +115,13 @@ Linux 徽标列表 ![各种 Linux 徽标](http://www.tecmint.com/wp-content/uploads/2015/06/Various-Linux-Logos.png) -各种 Linux 徽标 +*各种 Linux 徽标* -你可以通过徽标对应的编号或名字使用任意徽标 +你可以通过徽标对应的编号或名字使用任意徽标。 ### 一些使用 Linux_logo 的建议和提示### -**8. 你可以在登录界面输出你的 Linux 发行版徽标。要输出默认徽标,你可以在 ` ~/.bashrc`` 文件的最后添加以下内容。** +**8. 你可以在登录界面输出你的 Linux 发行版徽标。要输出默认徽标,你可以在 ` ~/.bashrc` 文件的最后添加以下内容。** if [ -f /usr/bin/linux_logo ]; then linux_logo; fi @@ -132,15 +131,15 @@ Linux 徽标列表 ![Print Logo on User Login](http://www.tecmint.com/wp-content/uploads/2015/06/Print-Logo-on-Login.png) -在用户登录时输出徽标 +*在用户登录时输出徽标* -其实你也可以在登录后输出任意图标,只需加入以下内容 +其实你也可以在登录后输出任意图标,只需加入以下内容: if [ -f /usr/bin/linux_logo ]; then linux_logo -L num; fi **重要**: 不要忘了将 num 替换成你想使用的图标。 -**10. You can also print your own logo by simply specifying the location of the logo as shown below.** +**10. 你也能直接指定徽标所在的位置来显示你自己的徽标。** # linux_logo -D /path/to/ASCII/logo @@ -152,12 +151,11 @@ Linux 徽标列表 # /usr/local/bin/linux_logo -a > /etc/issue.net -**12. 创建一个 Penguin 端口 - 用于回应连接的端口。要创建 Penguin 端口, 则需在 /etc/services 文件中加入以下内容 ** +**12. 创建一个 Linux 上的端口 - 用于回应连接的端口。要创建 Linux 端口, 则需在 /etc/services 文件中加入以下内容** penguin 4444/tcp penguin -这里的 `4444` 是一个未被任何其他资源使用的空闲端口。你也可以使用其他端口。 -你还需要在 /etc/inetd.conf中加入以下内容 +这里的 `4444` 是一个未被任何其他资源使用的空闲端口。你也可以使用其他端口。你还需要在 /etc/inetd.conf中加入以下内容: penguin stream tcp nowait root /usr/local/bin/linux_logo @@ -165,6 +163,8 @@ Linux 徽标列表 # killall -HUP inetd +(LCTT 译注:然后你就可以远程或本地连接到这个端口,并显示这个徽标了。) + linux_logo 还可以用做启动脚本来愚弄攻击者或对你朋友使用恶作剧。这是一个我经常在我的脚本中用来获取不同发行版输出的好工具。 试过一次后,你就不会忘记的。让我们知道你对这个工具的想法及它对你的作用吧。 不要忘记给评论、点赞或分享! @@ -174,10 +174,10 @@ linux_logo 还可以用做启动脚本来愚弄攻击者或对你朋友使用恶 via: http://www.tecmint.com/linux_logo-tool-to-print-color-ansi-logos-of-linux/ 作者:[Avishek Kumar][a] -译者:[KevSJ](https://github.com/KevSJ) -校对:[校对者ID](https://github.com/校对者ID) +译者:[KevinSJ](https://github.com/KevinSJ) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译,[Linux中国](https://linux.cn/) 荣誉推出 [a]:http://www.tecmint.com/author/avishek/ -[1]:http://www.tecmint.com/screenfetch-system-information-generator-for-linux/ +[1]:https://linux.cn/article-1947-1.html diff --git a/translated/share/20150625 Screen Capture Made Easy with these Dedicated Tools.md b/published/20150625 Screen Capture Made Easy with these Dedicated Tools.md similarity index 62% rename from translated/share/20150625 Screen Capture Made Easy with these Dedicated Tools.md rename to published/20150625 Screen Capture Made Easy with these Dedicated Tools.md index b2408dbeee..965b19d008 100644 --- a/translated/share/20150625 Screen Capture Made Easy with these Dedicated Tools.md +++ b/published/20150625 Screen Capture Made Easy with these Dedicated Tools.md @@ -1,95 +1,92 @@ 用这些专用工具让你截图更简单 ================================================================================ -"一图胜过千万句",这句二十世纪早期在美国应运而生的名言,说的是一张单一的静止图片所蕴含的信息足以匹敌大量的描述性文字。本质上说,图片所传递的信息量的确是比文字更有效更高效。 +“一图胜千言”,这句二十世纪早期在美国应运而生的名言,说的是一张单一的静止图片所蕴含的信息足以匹敌大量的描述性文字。本质上说,图片所传递的信息量的确是比文字更有效更高效。 -截图(或抓帧)是一种捕捉自计算机所录制可视化设备输出的快照或图片,屏幕捕捉软件能让计算机获取到截图。此类软件有很多用处,因为一张图片能很好地说明计算机软件的操作,截图在软件开发过程和文档中扮演了一个很重要的角色。或者,如果你的电脑有了个技术性问题,一张截图能让技术支持理解你碰到的这个问题。要写好计算机相关的文章、文档和教程,没有一款好的截图工具是几乎不可能的。如果你想在保存屏幕上任意一些零星的信息,特别是不方便打字时,截图也很有用。 +截图(或抓帧)是一种捕捉自计算机的快照或图片,用来记录可视设备的输出。屏幕捕捉软件能从计算机中获取到截图。此类软件有很多用处,因为一张图片能很好地说明计算机软件的操作,截图在软件开发过程和文档中扮演了一个很重要的角色。或者,如果你的电脑有了技术性问题,一张截图能让技术支持理解你碰到的这个问题。要写好计算机相关的文章、文档和教程,没有一款好的截图工具是几乎不可能的。如果你想保存你放在屏幕上的一些零星的信息,特别是不方便打字时,截图也很有用。 -在开源世界,Linux有许多专注于截图功能的工具供选择,基于图形的和控制台的都有。如果要说一个功能丰富的专用截图工具,那就来看看Shutter吧。这款工具是小型开源工具的杰出代表,当然也有其它的选择。 +在开源世界,Linux有许多专注于截图功能的工具供选择,基于图形的和控制台的都有。如果要说一个功能丰富的专用截图工具,看起来没有能超过Shutter的。这款工具是小型开源工具的杰出代表,但是也有其它的不错替代品可以选择。 -屏幕捕捉功能不仅仅只有专业的工具提供,GIMP和ImageMagick这两款主攻图像处理的工具,也能提供像样的屏幕捕捉功能。 +屏幕捕捉功能不仅仅只有专门的工具提供,GIMP和ImageMagick这两款主攻图像处理的工具,也能提供像样的屏幕捕捉功能。 ----------- ### Shutter ### ![Shutter in action](http://www.linuxlinks.com/portal/content/reviews/Graphics/Screenshot-Shutter1.png) -Shutter是一款功能丰富的截图软件。你可以给你的特殊区域、窗口、整个屏幕甚至是网站截图 - 在其中应用不用的效果,比如用高亮的点在上面绘图,然后上传至一个图片托管网站,一切尽在这个小窗口内。 +Shutter是一款功能丰富的截图软件。你可以对特定区域、窗口、整个屏幕甚至是网站截图 - 并为其应用不同的效果,比如用高亮的点在上面绘图,然后上传至一个图片托管网站,一切尽在这个小窗口内。 包含特性: - - 截图范围: - - 一块特殊区域 + - 一个特定区域 - 窗口 - 完整的桌面 - 脚本生成的网页 - 在截图中应用不同效果 - 热键 - 打印 -- 直接截图或指定一个延迟时间 -- 将截图保存至一个指定目录并用一个简便方法重命名它(用特殊的通配符) -- 完成集成在GNOME桌面中(TrayIcon等等) -- 当你截了一张图并以%设置了尺寸时,直接生成缩略图 -- Shutter会话选项: - - 会话中保持所有截图的痕迹 +- 直接截图或指定延迟时间截图 +- 将截图保存至一个指定目录并用一个简便方法重命名它(用指定通配符) +- 完全集成在GNOME桌面中(TrayIcon等等) +- 当你截了一张图并根据尺寸的百分比直接生成缩略图 +- Shutter会话集: + - 跟踪会话中所有的截图 - 复制截图至剪贴板 - 打印截图 - 删除截图 - 重命名文件 -- 直接上传你的文件至图像托管网站(比如http://ubuntu-pics.de),取回所有需要的图像并将它们与其他人分享 +- 直接上传你的文件至图像托管网站(比如 http://ubuntu-pics.de ),得到链接并将它们与其他人分享 - 用内置的绘画工具直接编辑截图 +--- + - 主页: [shutter-project.org][1] - 开发者: Mario Kemper和Shutter团队 - 许可证: GNU GPL v3 - 版本号: 0.93.1 ----------- ### HotShots ### ![HotShots in action](http://www.linuxlinks.com/portal/content/reviews/Graphics/Screenshot-HotShots.png) -HotShots是一款捕捉屏幕并能以各种图片格式保存的软件,同时也能添加注释和图形数据(箭头、行、文本, ...)。 +HotShots是一款捕捉屏幕并能以各种图片格式保存的软件,同时也能添加注释和图形数据(箭头、行、文本 ...)。 -你也可以把你的作品上传到网上(FTP/一些web服务),HotShots是用Qt开发而成的。 +你也可以把你的作品上传到网上(FTP/一些web服务),HotShots是用Qt开发而成的。 HotShots无法从Ubuntu的Software Center中获取,不过用以下命令可以轻松地来安装它: - sudo add-apt-repository ppa:ubuntuhandbook1/apps - + sudo add-apt-repository ppa:ubuntuhandbook1/apps sudo apt-get update - sudo apt-get install hotshots 包含特性: - 简单易用 -- 全功能使用 -- 嵌入式编辑器 +- 功能完整 +- 内置编辑器 - 热键 - 内置放大功能 -- 徒手和多屏捕捉 +- 手动控制和多屏捕捉 - 支持输出格式:Black & Whte (bw), Encapsulated PostScript (eps, epsf), Encapsulated PostScript Interchange (epsi), OpenEXR (exr), PC Paintbrush Exchange (pcx), Photoshop Document (psd), ras, rgb, rgba, Irix RGB (sgi), Truevision Targa (tga), eXperimental Computing Facility (xcf), Windows Bitmap (bmp), DirectDraw Surface (dds), Graphic Interchange Format (gif), Icon Image (ico), Joint Photographic Experts Group 2000 (jp2), Joint Photographic Experts Group (jpeg, jpg), Multiple-image Network Graphics (mng), Portable Pixmap (ppm), Scalable Vector Graphics (svg), svgz, Tagged Image File Format (tif, tiff), webp, X11 Bitmap (xbm), X11 Pixmap (xpm), and Khoros Visualization (xv) - 国际化支持:巴斯克语、中文、捷克语、法语、加利西亚语、德语、希腊语、意大利语、日语、立陶宛语、波兰语、葡萄牙语、罗马尼亚语、俄罗斯语、塞尔维亚语、僧伽罗语、斯洛伐克语、西班牙语、土耳其语、乌克兰语和越南语 +--- + - 主页: [thehive.xbee.net][2] - 开发者 xbee - 许可证: GNU GPL v2 - 版本号: 2.2.0 ----------- - ### ScreenCloud ### ![ScreenCloud in action](http://www.linuxlinks.com/portal/content/reviews/Graphics/Screenshot-ScreenCloud.png) ScreenCloud是一款易于使用的开源截图工具。 -在这款软件中,用户可以用三个热键中的其中一个或只需点击ScreenCloud托盘图标就能进行截图,用户也可以自行选择保存截图的地址。 +在这款软件中,用户可以用三个热键之一或只需点击ScreenCloud托盘图标就能进行截图,用户也可以自行选择保存截图的地址。 -如果你选择上传你的截图到screencloud主页,链接会自动复制到你的剪贴板上,你能通过email或在一个聊天对话框里和你的朋友同事分享它,他们肯定会点击这个链接来看你的截图的。 +如果你选择上传你的截图到screencloud网站,链接会自动复制到你的剪贴板上,你能通过email或在一个聊天对话框里和你的朋友同事分享它,他们肯定会点击这个链接来看你的截图的。 包含特性: @@ -106,18 +103,18 @@ ScreenCloud是一款易于使用的开源截图工具。 - 插件支持:保存至Dropbox,Imgur等等 - 支持上传至FTP和SFTP服务器 +--- + - 主页: [screencloud.net][3] - 开发者: Olav S Thoresen - 许可证: GNU GPL v2 - 版本号: 1.2.1 ----------- - ### KSnapshot ### ![KSnapShot in action](http://www.linuxlinks.com/portal/content/reviews/Graphics/Screenshot-KSnapshot.png) -KSnapshot也是一款易于使用的截图工具,它能给整个桌面、一个单一窗口、窗口的一部分或一块所选区域捕捉图像。,图像能以各种不用的格式保存。 +KSnapshot也是一款易于使用的截图工具,它能给整个桌面、单一窗口、窗口的一部分或一块所选区域捕捉图像。图像能以各种不同格式保存。 KSnapshot也允许用户用热键来进行截图。除了保存截图之外,它也可以被复制到剪贴板或用任何与图像文件关联的程序打开。 @@ -127,10 +124,12 @@ KSnapshot是KDE 4图形模块的一部分。 - 以多种格式保存截图 - 延迟截图 -- 剔除窗口装饰图案 +- 剔除窗口装饰(边框、菜单等) - 复制截图至剪贴板 - 热键 -- 能用它的D-Bus界面进行脚本化 +- 能用它的D-Bus接口进行脚本化 + +--- - 主页: [www.kde.org][4] - 开发者: KDE, Richard J. Moore, Aaron J. Seigo, Matthias Ettrich @@ -142,7 +141,7 @@ KSnapshot是KDE 4图形模块的一部分。 via: http://www.linuxlinks.com/article/2015062316235249/ScreenCapture.html 译者:[ZTinoZ](https://github.com/ZTinoZ) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译,[Linux中国](https://linux.cn/) 荣誉推出 diff --git a/translated/tech/20150709 Linux FAQs with Answers--How to install a Brother printer on Linux.md b/published/20150709 Linux FAQs with Answers--How to install a Brother printer on Linux.md similarity index 81% rename from translated/tech/20150709 Linux FAQs with Answers--How to install a Brother printer on Linux.md rename to published/20150709 Linux FAQs with Answers--How to install a Brother printer on Linux.md index ad90ec75a4..987df67ed6 100644 --- a/translated/tech/20150709 Linux FAQs with Answers--How to install a Brother printer on Linux.md +++ b/published/20150709 Linux FAQs with Answers--How to install a Brother printer on Linux.md @@ -1,10 +1,12 @@ -Linux有问必答-- 如何为在Linux中安装兄弟打印机 +Linux有问必答:如何为在Linux中安装兄弟牌打印机 ================================================================================ -> **提问**: 我有一台兄弟HL-2270DW激光打印机,我想从我的Linux机器上答应文档。我该如何在我的电脑上安装合适的驱动并使用它? +> **提问**: 我有一台兄弟牌HL-2270DW激光打印机,我想从我的Linux机器上打印文档。我该如何在我的电脑上安装合适的驱动并使用它? 兄弟牌以买得起的[紧凑型激光打印机][1]而闻名。你可以用低于200美元的价格得到高质量的WiFi/双工激光打印机,而且价格还在下降。最棒的是,它们还提供良好的Linux支持,因此你可以在Linux中下载并安装它们的打印机驱动。我在一年前买了台[HL-2270DW][2],我对它的性能和可靠性都很满意。 -下面是如何在Linux中安装和配置兄弟打印机驱动。本篇教程中,我会演示安装HL-2270DW激光打印机的USB驱动。首先通过USB线连接你的打印机到Linux上。 +下面是如何在Linux中安装和配置兄弟打印机驱动。本篇教程中,我会演示安装HL-2270DW激光打印机的USB驱动。 + +首先通过USB线连接你的打印机到Linux上。 ### 准备 ### @@ -16,13 +18,13 @@ Linux有问必答-- 如何为在Linux中安装兄弟打印机 ![](https://farm1.staticflickr.com/380/18535558583_cb43240f8a_c.jpg) -下一页,你会找到你打印机的LPR驱动和CUPS包装器驱动。前者是命令行驱动后者允许你通过网页管理和配置你的打印机。尤其是基于CUPS的GUI对(本地、远程)打印机维护非常有用。建议你安装这两个驱动。点击“Driver Install Tool”下载安装文件。 +下一页,你会找到你打印机的LPR驱动和CUPS包装器驱动。前者是命令行驱动,后者允许你通过网页管理和配置你的打印机。尤其是基于CUPS的图形界面对(本地、远程)打印机维护非常有用。建议你安装这两个驱动。点击“Driver Install Tool”下载安装文件。 ![](https://farm1.staticflickr.com/329/19130013736_1850b0d61e_c.jpg) 运行安装文件之前,你需要在64位的Linux系统上做另外一件事情。 -因为兄弟打印机驱动是为32位的Linux系统开发的,因此你需要按照下面的方法安装32位的库。 +因为兄弟打印机驱动是为32位的Linux系统开发的,因此你需要按照下面的方法安装32位的库。 在早期的Debian(6.0或者更早期)或者Ubuntu(11.04或者更早期),安装下面的包。 @@ -54,7 +56,7 @@ Linux有问必答-- 如何为在Linux中安装兄弟打印机 ![](https://farm1.staticflickr.com/292/18535599323_1a94f6dae5_b.jpg) -同意GPL协议直呼,接受接下来的任何默认问题。 +同意GPL协议之后,接受接下来的任何默认问题。 ![](https://farm1.staticflickr.com/526/19130014316_5835939501_b.jpg) @@ -68,7 +70,7 @@ Linux有问必答-- 如何为在Linux中安装兄弟打印机 $ sudo netstat -nap | grep 631 -打开一个浏览器输入http://localhost:631。你会下面的打印机管理界面。 +打开一个浏览器输入 http://localhost:631 。你会看到下面的打印机管理界面。 ![](https://farm1.staticflickr.com/324/18968588688_202086fc72_c.jpg) @@ -98,7 +100,7 @@ via: http://ask.xmodulo.com/install-brother-printer-linux.html 作者:[Dan Nanni][a] 译者:[geekpi](https://github.com/geekpi) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译,[Linux中国](https://linux.cn/) 荣誉推出 diff --git a/published/20150709 Why is the ibdata1 file continuously growing in MySQL.md b/published/20150709 Why is the ibdata1 file continuously growing in MySQL.md index af798b387a..64f74aecb0 100644 --- a/published/20150709 Why is the ibdata1 file continuously growing in MySQL.md +++ b/published/20150709 Why is the ibdata1 file continuously growing in MySQL.md @@ -6,7 +6,7 @@ 当监控服务器发送一个关于 MySQL 服务器存储的报警时,恐慌就开始了 —— 就是说磁盘快要满了。 -一番调查后你意识到大多数地盘空间被 InnoDB 的共享表空间 ibdata1 使用。而你已经启用了 [innodb_file_per_table][2],所以问题是: +一番调查后你意识到大多数地盘空间被 InnoDB 的共享表空间 ibdata1 使用。而你已经启用了 [innodb\_file\_per\_table][2],所以问题是: ### ibdata1存了什么? ### @@ -17,7 +17,7 @@ - 双写缓冲区 - 撤销日志 -其中的一些在 [Percona 服务器][3]上可以被配置来避免增长过大的。例如你可以通过 [innodb_ibuf_max_size][4] 设置最大变更缓冲区,或设置 [innodb_doublewrite_file][5] 来将双写缓冲区存储到一个分离的文件。 +其中的一些在 [Percona 服务器][3]上可以被配置来避免增长过大的。例如你可以通过 [innodb\_ibuf\_max\_size][4] 设置最大变更缓冲区,或设置 [innodb\_doublewrite\_file][5] 来将双写缓冲区存储到一个分离的文件。 MySQL 5.6 版中你也可以创建外部的撤销表空间,所以它们可以放到自己的文件来替代存储到 ibdata1。可以看看这个[文档][6]。 @@ -82,7 +82,7 @@ MySQL 5.6 版中你也可以创建外部的撤销表空间,所以它们可以 没有,目前还没有一个容易并且快速的方法。InnoDB 表空间从不收缩...参见[10 年之久的漏洞报告][10],最新更新自詹姆斯·戴(谢谢): -当你删除一些行,这个页被标为已删除稍后重用,但是这个空间从不会被回收。唯一的方法是使用新的 ibdata1 启动数据库。要做这个你应该需要使用 mysqldump 做一个逻辑全备份,然后停止 MySQL 并删除所有数据库、ib_logfile*、ibdata1* 文件。当你再启动 MySQL 的时候将会创建一个新的共享表空间。然后恢复逻辑备份。 +当你删除一些行,这个页被标为已删除稍后重用,但是这个空间从不会被回收。唯一的方法是使用新的 ibdata1 启动数据库。要做这个你应该需要使用 mysqldump 做一个逻辑全备份,然后停止 MySQL 并删除所有数据库、ib_logfile\*、ibdata1\* 文件。当你再启动 MySQL 的时候将会创建一个新的共享表空间。然后恢复逻辑备份。 ### 总结 ### diff --git a/published/PHP 7 upgrading.md b/published/PHP 7 upgrading.md new file mode 100644 index 0000000000..013df69a8b --- /dev/null +++ b/published/PHP 7 upgrading.md @@ -0,0 +1,626 @@ +PHP 7.0 升级备注 +=============== + +1. 向后不兼容的变化 +2. 新功能 +3. SAPI 模块中的变化 +4. 废弃的功能 +5. 变化的功能 +6. 新功能 +7. 新的类和接口 +8. 移除的扩展和 SAPI +9. 扩展的其它变化 +10. 新的全局常量 +11. INI 文件处理的变化 +12. Windows 支持 +13. 其它变化 + + +##1. 向后不兼容的变化 + +###语言变化 + +####变量处理的变化 + +* 间接变量、属性和方法引用现在以从左到右的语义进行解释。一些例子: + + $$foo['bar']['baz'] // 解释做 ($$foo)['bar']['baz'] + $foo->$bar['baz'] // 解释做 ($foo->$bar)['baz'] + $foo->$bar['baz']() // 解释做 ($foo->$bar)['baz']() + Foo::$bar['baz']() // 解释做 (Foo::$bar)['baz']() + + 要恢复以前的行为,需要显式地加大括号: + + ${$foo['bar']['baz']} + $foo->{$bar['baz']} + $foo->{$bar['baz']}() + Foo::{$bar['baz']}() + +* 全局关键字现在只接受简单变量。像以前的 + + global $$foo->bar; + + 现在要求如下写法: + + global ${$foo->bar}; + +* 变量或函数调用的前后加上括号不再有任何影响。例如下列代码,函数调用结果以引用的方式传给一个函数 + + function getArray() { return [1, 2, 3]; } + + $last = array_pop(getArray()); + // Strict Standards: 只有变量可以用引用方式传递 + $last = array_pop((getArray())); + // Strict Standards: 只有变量可以用引用方式传递 + + 现在无论是否使用括号,都会抛出一个严格标准错误。以前在第二种调用方式下不会有提示。 + +* 数组元素或对象属性自动安装引用顺序创建,现在的结果顺序将不同。例如: + + $array = []; + $array["a"] =& $array["b"]; + $array["b"] = 1; + var_dump($array); + + 现在结果是 ["a" => 1, "b" => 1],而以前的结果是 ["b" => 1, "a" => 1]。 + +相关的 RFC: +* https://wiki.php.net/rfc/uniform_variable_syntax +* https://wiki.php.net/rfc/abstract_syntax_tree + +####list() 的变化 + +* list() 不再以反序赋值,例如: + + list($array[], $array[], $array[]) = [1, 2, 3]; + var_dump($array); + + 现在结果是 $array == [1, 2, 3] ,而不是 [3, 2, 1]。注意仅赋值**顺序**变化了,而赋值仍然一致(LCTT 译注:即以前的 list()行为是从后面的变量开始逐一赋值,这样对与上述用法就会产生 [3,2,1] 这样的结果了。)。例如,类似如下的常规用法 + + list($a, $b, $c) = [1, 2, 3]; + // $a = 1; $b = 2; $c = 3; + + 仍然保持当前的行为。 + +* 不再允许对空的 list() 赋值。如下全是无效的: + + list() = $a; + list(,,) = $a; + list($x, list(), $y) = $a; + +* list() 不再支持对字符串的拆分(以前也只在某些情况下支持)。如下代码: + + $string = "xy"; + list($x, $y) = $string; + + 现在的结果是: $x == null 和 $y == null (没有提示),而以前的结果是: + $x == "x" 和 $y == "y" 。此外, list() 现在总是可以处理实现了 ArrayAccess 的对象,例如: + + list($a, $b) = (object) new ArrayObject([0, 1]); + + 现在的结果是: $a == 0 和 $b == 1。 以前 $a 和 $b 都是 null。 + +相关 RFC: +* https://wiki.php.net/rfc/abstract_syntax_tree#changes_to_list +* https://wiki.php.net/rfc/fix_list_behavior_inconsistency + +####foreach 的变化 + +* foreach() 迭代不再影响数组内部指针,数组指针可通过 current()/next() 等系列的函数访问。例如: + + $array = [0, 1, 2]; + foreach ($array as &$val) { + var_dump(current($array)); + } + + 现在将指向值 int(0) 三次。以前的输出是 int(1)、int(2) 和 bool(false)。 + +* 在对数组按值迭代时,foreach 总是在对数组副本进行操作,在迭代中任何对数组的操作都不会影响到迭代行为。例如: + + $array = [0, 1, 2]; + $ref =& $array; // Necessary to trigger the old behavior + foreach ($array as $val) { + var_dump($val); + unset($array[1]); + } + + 现在将打印出全部三个元素 (0 1 2),而以前第二个元素 1 会跳过 (0 2)。 + +* 在对数组按引用迭代时,对数组的修改将继续会影响到迭代。不过,现在 PHP 在使用数字作为键时可以更好的维护数组内的位置。例如,在按引用迭代过程中添加数组元素: + + $array = [0]; + foreach ($array as &$val) { + var_dump($val); + $array[1] = 1; + } + + 现在迭代会正确的添加了元素。如上代码输出是 "int(0) int(1)",而以前只是 "int(0)"。 + +* 对普通(不可遍历的)对象按值或按引用迭代的行为类似于对数组进行按引用迭代。这符合以前的行为,除了如上一点所述的更精确的位置管理的改进。 + +* 对可遍历对象的迭代行为保持不变。 + +相关 RFC: https://wiki.php.net/rfc/php7_foreach + +####参数处理的变化 + +* 不能定义两个同名的函数参数。例如,下面的方法将会触发编译时错误: + + public function foo($a, $b, $unused, $unused) { + // ... + } + + 如上的代码应该修改使用不同的参数名,如: + + public function foo($a, $b, $unused1, $unused2) { + // ... + } + +* func\_get\_arg() 和 func\_get\_args() 函数不再返回传递给参数的原始值,而是返回其当前值(也许会被修改)。例如: + + function foo($x) { + $x++; + var_dump(func_get_arg(0)); + } + foo(1); + + 将会打印 "2" 而不是 "1"。代码应该改成仅在调用 func\_get\_arg(s) 后进行修改操作。 + + function foo($x) { + var_dump(func_get_arg(0)); + $x++; + } + + 或者应该避免修改参数: + + function foo($x) { + $newX = $x + 1; + var_dump(func_get_arg(0)); + } + +* 类似的,异常回溯也不再显示传递给函数的原始值,而是修改后的值。例如: + + function foo($x) { + $x = 42; + throw new Exception; + } + foo("string"); + + 现在堆栈跟踪的结果是: + + Stack trace: + #0 file.php(4): foo(42) + #1 {main} + + 而以前是: + + Stack trace: + #0 file.php(4): foo('string') + #1 {main} + + 这并不会影响到你的代码的运行时行为,值得注意的是在调试时会有所不同。 + + 同样的限制也会影响到 debug\_backtrace() 及其它检查函数参数的函数。 + +相关 RFC: https://wiki.php.net/phpng + +####整数处理的变化 + +* 无效的八进制表示(包含大于7的数字)现在会产生编译错误。例如,下列代码不再有效: + + $i = 0781; // 8 不是一个有效的八进制数字! + + 以前,无效的数字(以及无效数字后的任何数字)会简单的忽略。以前如上 $i 的值是 7,因为后两位数字会被悄悄丢弃。 + +* 二进制以负数镜像位移现在会抛出一个算术错误: + + var_dump(1 >> -1); + // ArithmeticError: 以负数进行位移 + +* 向左位移的位数超出了整型宽度时,结果总是 0。 + + var_dump(1 << 64); // int(0) + + 以前上述代码的结果依赖于所用的 CPU 架构。例如,在 x86(包括 x86-64) 上结果是 int(1),因为其位移操作数在范围内。 + +* 类似的,向右位移的位数超出了整型宽度时,其结果总是 0 或 -1 (依赖于符号): + + var_dump(1 >> 64); // int(0) + var_dump(-1 >> 64); // int(-1) + +相关 RFC: https://wiki.php.net/rfc/integer_semantics + +####字符串处理的变化 + +* 包含十六进制数字的字符串不会再被当做数字,也不会被特殊处理。参见例子中的新行为: + + var_dump("0x123" == "291"); // bool(false) (以前是 true) + var_dump(is_numeric("0x123")); // bool(false) (以前是 true) + var_dump("0xe" + "0x1"); // int(0) (以前是 16) + + var_dump(substr("foo", "0x1")); // string(3) "foo" (以前是 "oo") + // 注意:遇到了一个非正常格式的数字 + + filter\_var() 可以用来检查一个字符串是否包含了十六进制数字,或这个字符串是否能转换为整数: + + $str = "0xffff"; + $int = filter_var($str, FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX); + if (false === $int) { + throw new Exception("Invalid integer!"); + } + var_dump($int); // int(65535) + +* 由于给双引号字符串和 HERE 文档增加了 Unicode 码点转义格式(Unicode Codepoint Escape Syntax), 所以带有无效序列的 "\u{" 现在会造成错误: + + $str = "\u{xyz}"; // 致命错误:无效的 UTF-8 码点转义序列 + + 要避免这种情况,需要转义开头的反斜杠: + + $str = "\\u{xyz}"; // 正确 + + 不过,不跟随 { 的 "\u" 不受影响。如下代码不会生成错误,和前面的一样工作: + + $str = "\u202e"; // 正确 + +相关 RFC: +* https://wiki.php.net/rfc/remove_hex_support_in_numeric_strings +* https://wiki.php.net/rfc/unicode_escape + +####错误处理的变化 + +* 现在有两个异常类: Exception 和 Error 。这两个类都实现了一个新接口: Throwable 。在异常处理代码中的类型指示也许需要修改来处理这种情况。 + +* 一些致命错误和可恢复的致命错误现在改为抛出一个 Error 。由于 Error 是一个独立于 Exception 的类,这些异常不会被已有的 try/catch 块捕获。 + + 可恢复的致命错误被转换为一个异常,所以它们不能在错误处理里面悄悄的忽略。部分情况下,类型指示失败不再能忽略。 + +* 解析错误现在会生成一个 Error 扩展的 ParseError 。除了以前的基于返回值 / error_get_last() 的处理,对某些可能无效的代码的 eval() 的错误处理应该改为捕获 ParseError 。 + +* 内部类的构造函数在失败时总是会抛出一个异常。以前一些构造函数会返回 NULL 或一个不可用的对象。 + +* 一些 E_STRICT 提示的错误级别改变了。 + +相关 RFC: +* https://wiki.php.net/rfc/engine_exceptions_for_php7 +* https://wiki.php.net/rfc/throwable-interface +* https://wiki.php.net/rfc/internal_constructor_behaviour +* https://wiki.php.net/rfc/reclassify_e_strict + +####其它的语言变化 + +* 静态调用一个不兼容的 $this 上下文的非静态调用的做法不再支持。这种情况下,$this 是没有定义的,但是对它的调用是允许的,并带有一个废弃提示。例子: + + class A { + public function test() { var_dump($this); } + } + + // 注意:没有从类 A 进行扩展 + class B { + public function callNonStaticMethodOfA() { A::test(); } + } + + (new B)->callNonStaticMethodOfA(); + + // 废弃:非静态方法 A::test() 不应该被静态调用 + // 提示:未定义的变量 $this + NULL + + 注意,这仅出现在来自不兼容上下文的调用上。如果类 B 扩展自类 A ,调用会被允许,没有任何提示。 + +* 不能使用下列类名、接口名和特殊名(大小写敏感): + + bool + int + float + string + null + false + true + + 这用于 class/interface/trait 声明、 class_alias() 和 use 语句中。 + + 此外,下列类名、接口名和特殊名保留做将来使用,但是使用时尚不会抛出错误: + + resource + object + mixed + numeric + +* yield 语句结构当用在一个表达式上下文时,不再要求括号。它现在是一个优先级在 “print” 和 “=>” 之间的右结合操作符。在某些情况下这会导致不同的行为,例如: + + echo yield -1; + // 以前被解释如下 + echo (yield) - 1; + // 现在被解释如下 + echo yield (-1); + + yield $foo or die; + // 以前被解释如下 + yield ($foo or die); + // 现在被解释如下 + (yield $foo) or die; + + 这种情况可以通过增加括号来解决。 + +* 移除了 ASP (\<%) 和 script (\