我有一个在PHP 7中使用Smarty 3模板引擎构建的网站,当将其上传到Web服务器(Apache)时,它会提供空白页面而不是构造的html。该网站在本地环境中100%完美,但服务器似乎不喜欢发生的事情。
使用时得到的输出
ini_set('display_errors', 1);
error_reporting(E_ALL + E_NOTICE);
echo('<br>PHP version:' . phpversion());
是,
PHP版本:
5.2.9
致命错误:在第81行的
spl_autoload_register()
中调用未定义的函数/www/mydomain.com/html/assets/inc/vendor/smarty/Autoloader.php
现在我很肯定两个不同版本的PHP不会导致这个问题,因为我过去已经上传并运行了其他.php
文件到服务器(PHP 7),以及它们对客户来说很好。
我不理解的是spl_autoload_register()
函数是如何定义的,因为函数绝对存在于Autoloader.php
的第81行,并且它不像它不是't}可用于在Web服务器上运行的PHP版本(see the docs)。
它可能是/html
路径吗?网络服务器上的/html
目录是index.*
文件与所有其他页面及其资产一起出现的位置,因此我没有将它们放在错误的位置......但为什么路径从/www/mydomain.com
进入/html
,不应该直接进入/assets
吗?
真的希望这是有道理的,提前谢谢你!
答案 0 :(得分:1)
调用未定义的函数spl_autoload_register()
在index.php文件中执行:
<?php phpinfo(); die;
您会看到SPL
扩展名不存在。
从源代码编译时,可能没有安装SPL扩展。
只需安装新版本的PHP(更好的5.6),问题就会消失。
或更好的升级您的包裹:
Debian,Ubuntu等以deb为基础:
apt-get update
apt-get upgrade
apt-get dist-upgrade
Arch,Gentoo等:
pacman -Syu
我是Arch Linux用户,对新鲜事物没有任何问题。 (:
附:最后切换到普通的Web服务器或至少是DigitalOcean Droplet,AWS EC2实例等,以便对服务器和libs进行完全控制。
此外,您可以将spl_autoload_register
替换为替换。
在相对文件夹中创建一个名为spl_autoload_register.php
的文件,并输入以下代码:
<?php
if (!function_exists('spl_autoload_register')):
$_spl_autoloaders = array();
/**
* Autoloader compatibility callback.
*/
function __autoload($classname)
{
global $_spl_autoloaders;
foreach ($_spl_autoloaders as $autoloader) {
if (!is_callable($autoloader)) {
continue;
}
call_user_func($autoloader, $classname);
if (class_exists($classname, false)) {
return;
}
}
}
/**
* Register a function to be autoloaded.
*/
function spl_autoload_register($autoload_function, $throw = true, $prepend = false) {
if ($throw && !is_callable($autoload_function)) {
throw new Exception('Function not callable');
}
global $_spl_autoloaders;
if (in_array($autoload_function, $_spl_autoloaders)) {
return;
}
if ($prepend) {
array_unshift($_spl_autoloaders, $autoload_function);
return;
}
$_spl_autoloaders[] = $autoload_function;
}
/**
* Unregister an autoloader function.
*/
function spl_autoload_unregister($function) {
global $_spl_autoloaders;
foreach ($_spl_autoloaders as &$autoloader) {
if ($autoloader === $function) {
unset($autoloader);
return true;
}
}
return false;
}
/**
* Get the registered autoloader functions.
*/
function spl_autoload_functions() {
return $GLOBALS['_spl_autoloaders'];
}
endif;
然后在您的应用的主文件顶部需要它:
require_once 'spl_autoload_register.php';
此代码将替换缺少的spl_autoload_register
函数,其自定义函数完全相同。