我记忆中我们从2010年开始使用Drupal搭建网站,从开始的Drupal 6到随后主流的Drupal 7再到目前最新的Drupal 8,始终都是使用的PHP 5.x,前几年PHP 7刚刚出来的时候我们也安装过,但发现网站很多报错后就退回了PHP 5.x。
今年Drupal 8的最新版本已经说了不再支持PHP 5.x,需要升级到PHP 7.x,再加上我们看了一些文章说PHP 7的性能比PHP 5提升几倍,这对我们也很有吸引力,想到迟早也得升级的,于是再次尝试升级PHP版本。
PHP 7的安装、与Apache、MySQL的配合等都是我们同事来负责的,安装memcached插件的时候好像遇到一些问题,耗费了一些时间,不过后来都克服了。然后我来查看服务器上的Drupal站点,马上看到了各种问题,下面来一一记录问题和解决的办法:
- 开始网站都打不开了,显示配置文件settings.php中报错,是数组的一个问题,是我们的写法不规范,原来PHP 5有一定容错性,但PHP 7检查更严格,我们修改后解决:
if (!is_array($databases['default']['default']['prefix'])) $databases['default']['default']['prefix'] = array();//这是新增的一行 $databases['default']['default']['prefix']['default'] = '';
- 变量类型报错:Notice: A non well formed numeric value encountered in,这也是PHP 7对语法检查更严格了,解决办法是添加intval函数将文本变量转为整形变量:
$nid = arg(1); 改为 $nid = intval(arg(1));
- 与上面一样的报错,但出现在Drupal的第三方插件中,解决办法与上面类似,去修改这个地方改变变量类型:
Notice: A non well formed numeric value encountered in views_litepager_plugin_pager_lite->pre_render()
-
舍弃的函数写法:
Deprecated function: Function create_function() is deprecated in views_php_handler_area->render
这个问题处理起来麻烦一些,下面详细些记录,报错截图如下:
找了资料 https://www.drupal.org/project/views_php/issues/3026201 https://www.drupal.org/project/views_php/issues/2274543 ,这里面说views php模块需要安装补丁,这里面最新补丁是:https://www.drupal.org/files/issues/2019-04-12/views_php-2274543-54.patch ,安装顺利,但随后报错: Error: Call to undefined function libraries_load ,最后没有办法安装了一个比较老的补丁#8,另外找了php原始资料以及补丁的写法,然后自己对着报错的地方来改:
https://www.php.net/manual/zh/function.create-function.php
https://www.php.net/manual/en/functions.anonymous.php
- $function = create_function('$view, $handler, $results', ' ?>' . $this->options['php_output'] . '<?php '); + $code = $this->options['php_output']; + $function = function($view, $handler, $results) use ($code) { + eval('?>' . $code); + }; - $function = create_function('$view, $handler, &$static', $this->options['php_setup'] . ';'); + $code = $this->options['php_setup']; + $function = function($view, $handler, &$static) use ($code) { + eval($code); + };
折腾了几个小时,算是把目前发现的一些报错都消除了,后面还要再继续检查Drupal日志、Apache报错日志等,并让同事检查、留意是否还有报错,如果遇到问题继续修复并记录到这里来。观察几天后,如果没有问题就可以再到其它服务器上安装PHP 7,到时候还要看MediaWiki是否可以顺利迁移到PHP 7。
2019-6-18补充:还可以在程序中添加:error_reporting(E_ALL ^ E_DEPRECATED); 来让这种报错不显示,或者在php.ini里面设置error_reporting = E_ALL &~E_NOTICE &~E_DEPRECATED。
2019-7-1 补充:发现获取SSL网址内容报错,处理办法:file_get_contents(): SSL operation failed with code 1. And more。或者看下面的代码例子:
<?php $arrContextOptions = array( "ssl" => array( "verify_peer" => false, "verify_peer_name" => false, ), ); $response = file_get_contents("https://maps.co.weber.ut.us/...json", false, stream_context_create($arrContextOptions)); echo $response; ?>
2019-7-3补充:Warning: count(): Parameter must be an array or an object that implements Countable 在 composer_manager_sa_requirements() (行 35 在 /mnt/gb/www/emoji/sites/all/modules/composer_manager/composer_manager_sa/composer_manager_sa.install). 这个报错,修改composer_manager_sa.install,多加一行:
...
elseif ($vulnerabilities === NULL) {
$severity = REQUIREMENT_WARNING;
$description = $t('Composer security check is waiting to run on cron.');
$vulnerabilities = array();//jamesqi 2019-7-3
}
else {
$severity = REQUIREMENT_ERROR;
$formatted = composer_manager_sa_plain_text($lock_file, $vulnerabilities);
$description = '<pre>' . check_plain($formatted->fetch()) . '</pre>';
}
$requirements['composer_manager_security_advisories'] = array(
'title' => $t('Composer library security updates'),
'value' => format_plural(count($vulnerabilities), '@count security advisory.', '@count security advisories.'),
'description' => $description,
'severity' => $severity,
);
...
2019年7月17日补充:error.log中出现PHP Fatal error: Uncaught Error: Call to undefined function cache_get() in /.../includes/module.inc:762这种报错,可能是settings.php是老版本drupal 6基础上修改的,需要用新版本drupal 7的基础上修改来覆盖。
评论1
Warning: preg_match(): The /e
Warning: preg_match(): The /e modifier is no longer supported, use preg_replace_callback instead 在 blockanonymouslinks_comment_validate() (行 26 在 /mnt/gb/www/drupal7.youbianku.com/sites/all/modules/blockanonymouslinks/blockanonymouslinks.module). 留言回复页面