我们继承了一个在 Mac OSX 服务器 (10.5.8) 上运行的网站。它具有以下组件:
- Apache 2.2.25
- PHP 5.3.27
- Zend 框架 v2.3.0
- 连接到另一台服务器上的 PostGres 数据库
- pdo_pgsql:PostGreSQL 9.2.4
周一早上我们接到电话说网站无法正常工作。唯一显示的是网站背景。当我查看页面源代码时,我看到我有一个开始 <body> 标签,然后文档停止了。
网站上没有 PHP 日志记录。我对 php.ini 文件进行了以下更改:
- error_reporting = E_ALL(原来是~E_ALL)
- error_log = /路径/到/php_error_log
- log_errors = 开启
然后我重新启动了 Apache 服务。以下是我在日志中看到的错误(它实际上与 Apache error_log 捆绑在一起):
PHP 致命错误:无法在 /Library/WebServer/Documents/XXXXX/Website/module/Application/view/layout/header.phtml 第 39 行重新声明 printMediaIcons()(先前已在 /Library/WebServer/Documents/XXXXX/Website/module/Application/view/layout/header.phtml:20 中声明)
我不是 PHP 专家,但我理解错误信息。我不明白的是这怎么可能起作用。我想强调的是,我们没有改变任何事物在这个网站上。
为了取得一些进展,我编辑了 header.phtml 文件并删除了 printMediaIcons 函数及其所有调用。然后我又收到一个错误,这次是来自数据库:
2015 年 11 月 3 日星期二 13:09:05] [错误] [客户端 45.24.29.225] PHP 致命错误:未捕获异常“PDOException”,消息为“SQLSTATE[22P02]: 无效的文本表示:7 错误:类型布尔值的输入语法无效:“”'位于 /Library/WebServer/Documents/XXXXX/Website/vendor/zendframework/zendframework/library/Zend/Db/Adapter/Driver/Pdo/Connection.php:438\nStack 跟踪:\n#0 /Library/WebServer/Documents/XXXXX/Website/vendor/zendframework/zendframework/library/Zend/Db/Adapter/Driver/Pdo/Connection.php(438): PDO->query('SELECT id, time...')\n#1 /Library/WebServer/Documents/XXXXX/Website/vendor/zendframework/zendframework/library/Zend/Db/Adapter/Adapter.php(190): Zend\Db\Adapter\Driver\Pdo\Connection->execute('SELECT id, time...')\n#2 /Library/WebServer/Documents/XXXXX/Website/module/Application/src/Application/Model/BaseModel.php(214): Zend\Db\Adapter\Adapter->query('SELECT id, time...', 'execute')\n#3 /Library/WebServer/Documents/XXXXX/Website/module/Application/src/Application/Model/CalendarModel.php(71): Application\Model\BaseModel->executeQuery('SELECT id, time...')\n#4 /Library/WebSe in /Library/WebServer/Documents/XXXXX/Website/vendor/zendframework/zendframework/library/Zend/Db/Adapter/Driver/Pdo/Connection.php 位于第 438 行
它反对的 SQL 是一条用于读取企业营业时间的简单语句。以下是它调用的函数:
公共函数 getTodaysHours($timeTypeName) { $timeTypeId = $this->getTimeTypeId($timeTypeName);
$variableHours = $this->getVariableHours($timeTypeId); if($variableHours) return $this->getDisplayForTimes($variableHours['time_from'],
$variableHours['time_to']);
$sql = sprintf("SELECT id, time_from, time_to, day_of_week FROM open_times WHERE (day_of_week = '%s' OR day_of_week = 'All') AND (is_dst = '%s' OR is_dst IS NULL) AND time_type_id = '%s' ORDER BY day_of_week DESC;", CalendarModel::getToday(), CalendarModel::getIsDst(), $timeTypeId); $results = $this->executeQuery($sql); $results = $results->toArray(); $results = current($results); return $this->getDisplayForTimes($results['time_from'], $results['time_to']); }
该网站上周运行良好。我检查了 conf 文件、ini 文件、错误日志,这些就是我能找到的全部内容。我不知道服务器上发生了什么变化/损坏。
有人对如何开始解决这个问题有什么想法吗?
答案1
找到了!问题在于获取今日时间函数。该查询中与 is_dst 相关的某些内容导致了错误。我从该函数返回了一个虚拟值,波夫該站已恢復。
我还有不不知道 printMediaFunction 之前是如何工作的。但我已将其包装在 function_exists 检查中,一切正常。