我记忆中我们从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
这个问题处理起来麻烦一些,下面详细些记录,报错截图如下:
- $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。
$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 = '
' . check_plain($formatted->fetch()) . '';
}
$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的基础上修改来覆盖。