热门排行
简介
PHP For Windows是一种新型的 CGI 程序编写语言,易学易用,运行速度快,可以方便快捷地编写出实用程序,本站提供的是thread-safe版php7.1.4下载地址,线程安全 与apache 搭配的环境使用,有需要的朋友们欢迎前来下载使用。
PHP7.1.4可同时运行于 Windows,Unix,Linux 平台的Web后台程序,内置了对文件上传,密码认证,Cookies 操作,邮件收发,动态 GIF 生成等功能,PHP 直接为很多数据库提供原本的连接,包括Oracle,Sybase,Postgres,mysql,Informix,Dbase,Solid,access 等,完全支持ODBC接口,用户更换平台时,无需变换 PHP 代码,可即拿即用。
PHP7.1
新特性
1.可为空(Nullable)类型
类型现在允许为空,当启用这个特性时,传入的参数或者函数返回的结果要么是给定的类型,要么是 null 。可以通过在类型前面加上一个问号来使之成为可为空的。
function test(?string $name)
{
var_dump($name);
}
以上例程会输出:
string(5) "tpunt"
NULL
Uncaught Error: Too few arguments to function test(), 0 passed in...
2.Void 函数
在PHP 7 中引入的其他返回值类型的基础上,一个新的返回值类型void被引入。 返回值声明为 void 类型的方法要么干脆省去 return 语句,要么使用一个空的 return 语句。 对于 void 函数来说,null 不是一个合法的返回值。
function swap(&$left, &$right) : void
{
if ($left === $right) {
return;
}
$tmp = $left;
$left = $right;
$right = $tmp;
}
$a = 1;
$b = 2;
var_dump(swap($a, $b), $a, $b);
以上例程会输出:
null
int(2)
int(1)
试图去获取一个 void 方法的返回值会得到 null ,并且不会产生任何警告。这么做的原因是不想影响更高层次的方法。
3.短数组语法 Symmetric array destructuring
短数组语法([])现在可以用于将数组的值赋给一些变量(包括在foreach中)。 这种方式使从数组中提取值变得更为容易。
$data = [
['id' => 1, 'name' => 'Tom'],
['id' => 2, 'name' => 'Fred'],
];
while (['id' => $id, 'name' => $name] = $data) {
// logic here with $id and $name
}
4.类常量可见性
现在起支持设置类常量的可见性。
class ConstDemo
{
const PUBLIC_CONST_A = 1;
public const PUBLIC_CONST_B = 2;
protected const PROTECTED_CONST = 3;
private const PRIVATE_CONST = 4;
}
5.iterable 伪类
现在引入了一个新的被称为iterable的伪类 (与callable类似)。 这可以被用在参数或者返回值类型中,它代表接受数组或者实现了Traversable接口的对象。 至于子类,当用作参数时,子类可以收紧父类的iterable类型到array 或一个实现了Traversable的对象。对于返回值,子类可以拓宽父类的 array或对象返回值类型到iterable。
function iterator(iterable $iter)
{
foreach ($iter as $val) {
//
}
}
6.多异常捕获处理
一个catch语句块现在可以通过管道字符(|)来实现多个异常的捕获。 这对于需要同时处理来自不同类的不同异常时很有用。
try {
// some code
} catch (FirstException | SecondException $e) {
// handle first and second exceptions
} catch (\Exception $e) {
// ...
}
7.list()现在支持键名
现在list()支持在它内部去指定键名。这意味着它可以将任意类型的数组 都赋值给一些变量(与短数组语法类似)
$data = [
['id' => 1, 'name' => 'Tom'],
['id' => 2, 'name' => 'Fred'],
];
while (list('id' => $id, 'name' => $name) = $data) {
// logic here with $id and $name
}
8.支持为负的字符串偏移量
现在所有接偏移量的内置的基于字符串的函数都支持接受负数作为偏移量,包括数组解引用操作符([]).
var_dump("abcdef"[-2]);
var_dump(strpos("aabbcc", "b", -3));
以上例程会输出:
string (1) "e"
int(3)
9.ext/openssl 支持 AEAD
通过给openssl_encrypt()和openssl_decrypt() 添加额外参数,现在支持了AEAD (模式 GCM and CCM)。
通过 Closure::fromCallable() 将callables转为闭包
Closure新增了一个静态方法,用于将callable快速地 转为一个Closure 对象。
class Test
{
public function exposeFunction()
{
return Closure::fromCallable([$this, 'privateFunction']);
}
private function privateFunction($param)
{
var_dump($param);
}
}
$privFunc = (new Test)->exposeFunction();
$privFunc('some value');
以上例程会输出:
string(10) "some value"
1
1
10.异步信号处理 Asynchronous signal handling
A new function called pcntl_async_signals() has been introduced to enable asynchronous signal handling without using ticks (which introduce a lot of overhead).
增加了一个新函数 pcntl_async_signals()来处理异步信号,不需要再使用ticks(它会增加占用资源)
pcntl_async_signals(true); // turn on async signals
pcntl_signal(SIGHUP, function($sig) {
echo "SIGHUP\n";
});
posix_kill(posix_getpid(), SIGHUP);
以上例程会输出:
SIGHUP
11.HTTP/2 服务器推送支持 ext/curl
Support for server push has been added to the CURL extension (requires version 7.46 and above). This can be leveraged through the curl_multi_setopt() function with the new CURLMOPT_PUSHFUNCTION constant. The constants CURL_PUST_OK and CURL_PUSH_DENY have also been added so that the execution of the server push callback can either be approved or denied.
蹩脚英语:
对于服务器推送支持添加到curl扩展(需要7.46及以上版本)。
可以通过用新的CURLMOPT_PUSHFUNCTION常量 让curl_multi_setopt()函数使用。
也增加了常量CURL_PUST_OK和CURL_PUSH_DENY,可以批准或拒绝 服务器推送回调的执行
不兼容性
1.当传递参数过少时将抛出错误
在过去如果我们调用一个用户定义的函数时,提供的参数不足,那么将会产生一个警告(warning)。 现在,这个警告被提升为一个错误异常(Error exception)。这个变更仅对用户定义的函数生效, 并不包含内置函数。例如:
function test($param){}
test();
输出:
Uncaught Error: Too few arguments to function test(), 0 passed in %s on line %d and exactly 1 expected in %s:%d
2.禁止动态调用函数
禁止动态调用函数如下
assert() - with a string as the first argument
compact()
extract()
func_get_args()
func_get_arg()
func_num_args()
get_defined_vars()
mb_parse_str() - with one arg
parse_str() - with one arg
(function () {
'func_num_args'();
})();
输出
Warning: Cannot call func_num_args() dynamically in %s on line %d
3.无效的类,接口,trait名称命名
以下名称不能用于 类,接口或trait 名称命名:
void
iterable
4.Numerical string conversions now respect scientific notation
Integer operations and conversions on numerical strings now respect scientific notation. This also includes the (int) cast operation, and the following functions: intval() (where the base is 10), settype(), decbin(), decoct(), and dechex().
5.mt_rand 算法修复
mt_rand() will now default to using the fixed version of the Mersenne Twister algorithm. If deterministic output from mt_srand() was relied upon, then the MT_RAND_PHP with the ability to preserve the old (incorrect) implementation via an additional optional second parameter to mt_srand().
6.rand() 别名 mt_rand() 和 srand() 别名 mt_srand()
rand() and srand() have now been made aliases to mt_rand() and mt_srand(), respectively. This means that the output for the following functions have changes: rand(), shuffle(), str_shuffle(), and array_rand().
7.Disallow the ASCII delete control character in identifiers
The ASCII delete control character (0x7F) can no longer be used in identifiers that are not quoted.
8.error_log changes with syslog value
If the error_log ini setting is set to syslog, the PHP error levels are mapped to the syslog error levels. This brings finer differentiation in the error logs in contrary to the previous approach where all the errors are logged with the notice level only.
9.在不完整的对象上不再调用析构方法
析构方法在一个不完整的对象(例如在构造方法中抛出一个异常)上将不再会被调用
10.call_user_func()不再支持对传址的函数的调用
call_user_func() 现在在调用一个以引用作为参数的函数时将始终失败。
11.字符串不再支持空索引操作符 The empty index operator is not supported for strings anymore
对字符串使用一个空索引操作符(例如str[]=x)将会抛出一个致命错误, 而不是静默地将其转为一个数组
12.ini配置项移除
下列ini配置项已经被移除:
session.entropy_file
session.entropy_length
session.hash_function
session.hash_bits_per_character
PHP 7.1.x 中废弃的特性
1.ext/mcrypt
mcrypt 扩展已经过时了大约10年,并且用起来很复杂。因此它被废弃并且被 OpenSSL 所取代。 从PHP 7.2起它将被从核心代码中移除并且移到PECL中。
2.mb_ereg_replace()和mb_eregi_replace()的Eval选项
对于mb_ereg_replace()和mb_eregi_replace()的 e模式修饰符现在已被废弃
从 PHP 7.0 升级到 PHP 7.1步骤
在 PHP 7.0 发布一年之后,终于看到 PHP 7.1 稳定版发布,有不少新特性,迫不及待地想尝试一下这个版本。本文是介绍从 PHP 7.0 升级到 PHP 7.1
首先下载源码,我一般都是放在 /usr/local/src 中
[root@lnmp lnmp.cn]# cd /usr/local/src
[root@lnmp src]# wget -c //cn2.php.net/get/php-7.1.0.tar.gz/from/this/mirror -O php-7.1.0.tar.gz
然后解压并进入解压后的源码目录
[root@lnmp src]# tar -zxvf php-7.1.0.tar.gz
[root@lnmp src]# cd php-7.1.0/
安装前要先备份一下 php 7.0 的版本,这很重重重要
[root@lnmp php-7.1.0]# mv /usr/local/php7 /usr/local/php7.0
接下来开始安装了,可以先关闭 php-fpm, 也可以不关闭,其实没有关系。
既然是升级,为了不影响现有网站在升级后的正常运行,那就要做到升级后的 configure 和之前的版本基本一致。这就要把之前安装 PHP 的 configure 找出来,如果你忘记了之前的 configure (应该也没有人去记它吧),其实它就在 phpinfo 里边
[root@lnmp php-7.1.0]# php -i | grep configure
Configure Command => './configure' '--prefix=/usr/local/php7' '--enable-fpm' '--with-fpm-user=nginx' '--with-fpm-group=nginx' '--with-mysqli' '--with-zlib' '--with-curl' '--with-gd' '--with-jpeg-dir' '--with-png-dir' '--with-freetype-dir' '--with-openssl' '--enable-mbstring' '--enable-xml' '--enable-session' '--enable-ftp' '--enable-pdo' '-enable-tokenizer' '--enable-zip'
稍作替换就可以得到想要的 configure 命令了
[root@lnmp php-7.1.0]# php -i | grep configure | sed -e "s/Configure Command => //; s/'//g"
./configure --prefix=/usr/local/php7 --enable-fpm --with-fpm-user=nginx --with-fpm-group=nginx --with-mysqli --with-zlib --with-curl --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-openssl --enable-mbstring --enable-xml --enable-session --enable-ftp --enable-pdo -enable-tokenizer --enable-zip
[root@lnmp php-7.1.0]#
这个这里要特别提到一下就是,如果之前的 PHP 版本在安装后有用 PECL 或 phpize 新增过扩展的话,如果这些扩展可以加到 configure 里边,尽量加,否则安装后还要重新安装一次这些扩展
开始安装
[root@lnmp php-7.1.0]# ./configure --prefix=/usr/local/php7 --enable-fpm --with-fpm-user=nginx --with-fpm-group=nginx --with-mysqli --with-zlib --with-curl --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-openssl --enable-mbstring --enable-xml --enable-session --enable-ftp --enable-pdo -enable-tokenizer --enable-zip
如果成功的话,可以看到有 Thank you for using PHP. 的字样
接着 make
[root@lnmp php-7.1.0]# make
视机子配置不同,编译可能会要点时间。最后是
[root@lnmp php-7.1.0]# make install
至此,PHP 7.1 已经安装基本完成
[root@lnmp php-7.1.0]# php -v
PHP 7.1.0 (cli) (built: Dec 5 2016 04:09:57) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.1.0-dev, Copyright (c) 1998-2016 Zend Technologies
[root@lnmp php-7.1.0]#
下面是配置,为了不影响现有网站的运行,这里将沿用 PHP 7.0 的配置,直接从备份的文件夹拷贝过去
[root@lnmp php-7.1.0]# cp /usr/local/php7.0/lib/php.ini /usr/local/php7/lib/php.ini
[root@lnmp php-7.1.0]# cp /usr/local/php7.0/etc/php-fpm.conf /usr/local/php7/etc/php-fpm.conf
[root@lnmp php-7.1.0]# cp /usr/local/php7.0/etc/php-fpm.d/www.conf /usr/local/php7/etc/php-fpm.d/www.conf
之前有特别提到有用 PECL 或 phpize 新增过扩展的话,因为拷贝过来的 php.ini 中已经引入了那些扩展,在这里要重新安装,否则在重启 php-fpm 时会出现类似警报:
Dec 05 04:18:53 localhost.localdomain php-fpm[11533]: [05-Dec-2016 04:18:53] NOTICE: PHP message: PHP Warning: PHP Startup: Unable to load dynamic library '/usr/local/php7/lib/php/extensions/no-debug-non-zts-20160303/memcached.so' - /usr/local/php7/lib/php/extensions/no-debug-non-zts-20160303/memcached.so: cannot open shared object file: No such file or directory in Unknown on line 0
是要重新安装,即便从旧版本中将这些 so 文件拷贝过来也不行,否则会出现不匹配的警告:
Dec 05 05:07:42 localhost.localdomain php-fpm[11672]: [05-Dec-2016 05:07:42] NOTICE: PHP message: PHP Warning: PHP Startup: memcache: Unable to initialize module
如果已经忘记过安装过什么扩展,可以查看 php.ini 或扩展目录:
[root@lnmp no-debug-non-zts-20151012]# /usr/local/php7.0/bin/php-config --extension-dir
/usr/local/php7/lib/php/extensions/no-debug-non-zts-20151012
因为旧版本的文件夹已经改名,这里同样要改成 7.0
[root@lnmp php-7.1.0]# ls /usr/local/php7.0/lib/php/extensions/no-debug-non-zts-20151012
memcache.so memcached.so opcache.a opcache.so pdo_mysql.so
其中 opcache.a opcache.so 是自带的,其他都是新增的。其他扩展之前怎么安装,现在又怎么重新安装一遍吧,这里不再累述。
好了之后重新启动 php-fpm
[root@lnmp php-7.1.0]# systemctl restart php-fpm
查看状态
[root@lnmp php-7.1.0]# systemctl status php-fpm -l
● php-fpm.service - The PHP FastCGI Process Manager
Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2016-12-05 05:31:22 UTC; 9s ago
Main PID: 17367 (php-fpm)
CGroup: /system.slice/php-fpm.service
├─17367 php-fpm: master process (/usr/local/php7/etc/php-fpm.conf)
├─17368 php-fpm: pool www
└─17369 php-fpm: pool www
已经正常运行,测试下 phpinfo 页面
友情提示:
Zip [23.38MB]
sha256: 1ee487ac01b59f316e3d590c6a8b354cd538bb9ff5c411af1a484819174f21f1