从PHP7.0更新到PHP7.2后,某些代码停止工作,我不明白为什么:
$res = rename($tmpfile, $output_file);
if ($res !== true) {
throw new Exception("Unable to rename temporary file");
}
在php7.2中,触发了异常,尽管重命名成功完成,但文件可读性很好,没有发生任何错误。我仍然得到异常,因为返回值为NULL。我插入了一些调试代码:
$res = rename($tmpfile, $output_file);
log('Debug: $res ' . $res);
log('Debug: $res true? ' . $res === true);
log('Debug: $res type ' . gettype($res));
if ($res !== true) {
throw new Exception("Unable to rename temporary file");
}
这将提供以下输出:
2018-08-03 10:37:39 Debug: $res
2018-08-03 10:37:39
2018-08-03 10:37:39 Debug: $res type NULL
2018-08-03 10:37:39 CURL_DOWNLOAD Exception: Unable to rename temporary file
#0 /var/www/formr.org/application/Library/Functions.php(1470): CURL::DownloadUrl('http://docs.goo...', '/var/www/formr....', NULL, 'GET', Array, Array)
如您所见,没有输出,类型为NULL。这是未记录的行为。 According to the php documentation的返回值只能是true或false。
我找不到任何有关此功能的行为已更改的文档。有人明白吗?
感谢帮助!
编辑:var_dump输出
$res = rename($tmpfile, $output_file);
ob_start();
var_dump($res);
$contents = ob_get_contents();
ob_end_clean();
log('Debug $res: ' . $contents);
礼物:
2018-08-03 12:37:40 Debug $res: NULL
在终端中测试rename()函数:
user$ sudo su www-data -s /bin/bash
www-data$ php -a
Interactive mode enabled
php > $old='/var/www/path/changed/filename.xlsx';
php > $new='/var/www/path/changed/newfilename.xlsx';
php > $res = rename($old, $new);
php > var_dump($res);
bool(true)
(出于隐私原因更改了文件名和路径,但我在原始文件上对其进行了测试。)
PHP版本:
$ php --version
PHP 7.2.7-0ubuntu0.18.04.2 (cli) (built: Jul 4 2018 16:55:24) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.2.7-0ubuntu0.18.04.2, Copyright (c) 1999-2018, by Zend Technologies
已安装的PHP版本是Ubuntu 18.04随附的版本。我自己没有重新编译它。
正如我刚刚注意到的那样,该程序有两次自己的重命名功能。但是它们并不是要重命名文件,而是要重命名数据库中的某些内容。
它们都只有一个参数。 PHP不支持按参数数量重载或区分,因此是否可能会有干扰?到目前为止,这还不是问题。而且,由于该文件实际上已被重命名,所以我不认为调用了错误的函数。
答案 0 :(得分:0)
由Apokryfos的最后评论解决:正确地调用带有命名空间\rename($old,$new)
的重命名函数会给我bool(true)
作为返回值。