Apache / PHP / Zend / PostGres 网站周末停止运行

Apache / PHP / Zend / PostGres 网站周末停止运行

我们继承了一个在 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 检查中,一切正常。

相关内容