当前位置

PHP5.x升级到PHP7.x后Drupal网站出现的问题

James Qi 在 2019年5月23日 - 19:01 提交

  我记忆中我们从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

    这个问题处理起来麻烦一些,下面详细些记录,报错截图如下:

create_function error

  找了资料 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的基础上修改来覆盖。

自由标签:

评论

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).

留言回复页面

添加新评论

Plain text

  • 不允许使用HTML标签。
  • 自动将网址与电子邮件地址转变为链接。
  • 自动断行和分段。