Apache-2.2

Apache / PHP / Zend / PostGres 站點週末停止工作

  • November 3, 2015

我們繼承了一個在 Mac OSX 伺服器 (10.5.8) 上執行的網站。它具有以下組件:

  • 阿帕奇 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 = /path/to/php_error_log
  • log_errors = 開啟

然後我重新啟動了 Apache 服務。這是我開始在日誌中看到的錯誤(它實際上與 Apache error_log 捆綁在一起):

PHP 致命錯誤:無法在 /Library/WebServer/Documents/XXXXX/Website/ 中重新聲明 printMediaIcons()(之前在 /Library/WebServer/Documents/XXXXX/Website/module/Application/view/layout/header.phtml:20 中聲明)第 39 行的模組/應用程序/視圖/佈局/header.phtml

我不是 PHP 人,但我理解錯誤資訊。我不明白這是怎麼回事。我想強調的是,我們沒有更改此站點上的任何內容。

為了取得一些進展,我編輯了 header.phtml 文件並取出了 printMediaIcons 函式和對它的任何呼叫。然後我得到另一個錯誤,這次來自數據庫:

2015 年 11 月 3 日星期二 13:09:05]

$$ error $$ $$ client 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\n堆棧跟踪:\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 在 /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-&gt;getVariableHours($timeTypeId);

            if($variableHours)
                   return $this-&gt;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-&gt;executeQuery($sql);
            $results = $results-&gt;toArray();
            $results = current($results);

            return $this-&gt;getDisplayForTimes($results['time_from'], $results['time_to']);
    }

該網站上週執行良好。我檢查了 conf 文件、ini 文件、錯誤日誌,這就是我能找到的全部。我不知道伺服器上發生了什麼變化/損壞。

有人對如何開始解決這個問題有任何想法嗎?

找到了!問題在於getTodaysHours函式。該查詢中有關 is_dst 的某些內容導致錯誤。我從該函式返回了一個虛擬值,並且站點已備份。

我仍然知道 printMediaFunction 以前是如何工作的。但我已經將它包裝在一個 function_exists 檢查中,一切都很好。

引用自:https://serverfault.com/questions/733675