PHP:在网络服务器上提供空白页面(错误 500),但在本地(Smarty 模板引擎)上工作正常

PHP: Serves blank page on webserver (error 500), but works fine on local (Smarty template engine)

我在 PHP 7 中有一个使用 Smarty 3 模板引擎构建的网站,当将其上传到网络服务器 (Apache) 时,它提供的是空白页面而不是构建的 html.该网站在本地环境中 100% 完美运行,但服务器似乎不喜欢发生某些事情。

我使用时得到的输出,

ini_set('display_errors', 1);
error_reporting(E_ALL + E_NOTICE);
echo('<br>PHP version:' . phpversion());

是,

PHP version: 5.2.9

Fatal error: Call to undefined function spl_autoload_register() in /www/mydomain.com/html/assets/inc/vendor/smarty/Autoloader.php on line 81

现在我确定 PHP 的两个不同版本不会导致此问题,因为我过去已经上传和 运行 其他 .php 文件到服务器(PHP 7),它们对客户显示良好。

我不明白的是 spl_autoload_register() 函数是如何未定义的,因为该函数肯定在 Autoloader.php 的第 81 行,而且它并不像版本不可用在网络服务器上 PHP 运行ning (see the docs).

可能是 /html 路径?。 Web 服务器上的 /html 目录是 index.* 文件与所有其他页面及其资产一起存放的位置,因此我没有将它们放在错误的位置......但为什么路径从/www/mydomain.com 进入 /html,它不应该直接进入 /assets 吗?

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

Call to undefined function 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 用户,对新鲜事物没有任何问题。 (:



p.s。最后切换到普通 Web 服务器或至少 DigitalOcean Droplet、AWS EC2 实例等以完全控制服务器和库。

您也可以用替代品替换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 函数。