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
函数。
我在 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
函数。