我記憶中我們從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). 留言回複頁面