最近將一個兩年多之前的用phpwind9.0搭建的論壇升級到php7,遇到了頁面沒法打開,顯示爲500錯誤,排查了一成天時間,終於解決!php
一、打開文件:src/applications/appcenter/service/srv/PwDebugApplication.phpweb
定位到214行代碼正則表達式
修改代碼:php7
if (!$toinstall instanceof iPwInstall) continue; $r = $toinstall->install($install); if ($r instanceof PwError) return $this->_e($install, $r); $install->addInstallLog('service', $_tmp);
修改後app
if($toinstall instanceof iPwInstall){ $r = $toinstall->install($install); if ($r instanceof PwError) return $this->_e($install, $r); $install->addInstallLog('service', $_tmp); }
二、打開文件:/src/windid/service/base/WindidUtility.php 函數
定位到94行代碼this
修改成:spa
if (!isset($exts[$imageInfo[2]])) return false;
三、修改preg_replace函數爲preg_replace_callback
src/library/ubb/PwUbbCode.php
src/library/ubb/PwSimpleUbbCode.php
說明:preg_replace正則表達式再也不支持/e,須要使用preg_replace_callback來替換code
四、/wind/web/WindForward.php:96router
修改代碼:
} elseif ($merge && !empty($this->vars[$key])) {
修改後:
} elseif ($merge && isset($this->vars[$key]) && $this->vars[$key]) {
五、僞靜態開啓後出現錯誤修復
定位代碼到:/src/library/route/PwRoute.php:217
修改代碼:
foreach ($this->params as $k => $v) { if ($route[$k] === $router->$methods[$k]() && $flag === $flags[$k]) $flag = $consts[$k]; $_args[$v] = $route[$k]; unset($args[$k]); }
修改後:
foreach ($this->params as $k => $v) { $_method=$methods[$k]; if ($route[$k] === $router->$_method() && $flag === $flags[$k]) $flag = $consts[$k]; $_args[$v] = $route[$k]; unset($args[$k],$_method); }
結論:此行代碼中沒有在foreach循環以內,所以不能出現關鍵字continue,而在php7前continue關鍵字是容許不在foreach中出現的,因而可知php7更加規範了;php7對preg_replace不在支持"/e"修飾符,是一個大坑;empty在php5.5後支持表達式了,第4處能夠不修改