PHP:在webserver上提供空白页面(错误500),但在本地(Smarty模板引擎)

时间:2016-07-12 21:47:04

标签: php html apache server smarty

我有一个在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吗?

真的希望这是有道理的,提前谢谢你!

1 个答案:

答案 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函数,其自定义函数完全相同。