Apache / PHP / Zend / PostGres 站點週末停止工作
我們繼承了一個在 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->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 文件、錯誤日誌,這就是我能找到的全部。我不知道伺服器上發生了什麼變化/損壞。
有人對如何開始解決這個問題有任何想法嗎?
找到了!問題在於getTodaysHours函式。該查詢中有關 is_dst 的某些內容導致錯誤。我從該函式返回了一個虛擬值,並且該站點已備份。
我仍然不知道 printMediaFunction 以前是如何工作的。但我已經將它包裝在一個 function_exists 檢查中,一切都很好。