故障排除

Fuel 支援各式各樣的配置,有時为了正常工作需要一些配置。以下列出了幾个當你在你的機器上設置 Fuel 時可能跳出的情況。

當你的問題沒有列在下面,或已列出但沒有提供適當的解決方案時,請在議題追蹤(http://dev.fuelphp.com)回報此問題。

純淨安装下 500 错误

发生在……

當你的 HTTP 伺服器權限不足以在档案系统中跟隨符號連結。

解法

檢查 .htaccess 档案并修改下列行

Option +FollowSymLinks

以便它讀取:

Option +SymLinksIfOwnerMatch

純淨安装下語法错误

Parse error: syntax error, unexpected T_FUNCTION, expecting ')' in /Users/info/Sites/fuel/public/index.php on line 9

发生在……

當在低於 5.3 的 PHP 版本运行 Fuel 時。

解法

在一个分離的测试档案檢查 phpinfo(); 并看看你是否正在运行 5.3 或更高版本。更多資訊在需求

當在本地开发時,更新你的伺服器到 PHP 5.3 的最新版本。如果你不是在本地开发,你将需要詢問你的主機供應商。PHP 5.3 以下的版本不只我們不支援,還有 PHP 它們自己本身也是。

我在 autoloader.php 得到 "child pid [xxxx] exit signal Bus error"

发生在……

在未知的情況下,當使用多位元組支援。

解法

这似乎是一个 PHP 的 bug,在撰寫本文的時候還沒有修正被发布。 大多数使用 PHP 5.3.3 和多位元組支援的人沒有回報此問題。 我們還沒有看到使用 PHP 5.4.x 的使用者遇到相同的错误。

做为一種變通方法,建議停用 zend-multibyte 和 mbstring,或嘗试使用不同版本的 PHP。

能運作,但首頁是 404。

发生在……

在某些 PHP 安装必須在 .htaccess 档案中的 index.php 後面添加一个問號

解法

像这樣添加問號:

# 打開 URL 改寫
RewriteEngine On

# 安装目录
RewriteBase /
# 如果 fuel 不在上一層
# RewriteBase /public

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ index.php?/$1 [L]
# 注意 ? 在 index.php 之後

一些 fcgi 安装需要此解法的變種:


RewriteRule ^(.*)$ index.php?$1 [L]
# 請注意 ? 後的斜線已经被移除的事實

# 其他可能的設定:

RewriteRule ^(.*)$ /index.php/$1 [L]
# 請注意,前導斜線添加在 index.php 之前

Oil 無法連到 DB 但应用程序可以

mysql_connect(): [2002] No such file or directory (trying to connect via unix:///var/mysql/mysql.sock) in /Users/phil/Sites/fuel/fuel/core/classes/database/mysql/connection.php on 73

发生在……

发生在當你嘗试藉由命令列與資料庫互动,通常在你为你的 MySQL 伺服器使用 MAMP 時。造成这樣的原因是,MAMP 提供的 PHP-CLI 對 MAMP 來說是一个不同的安装,所以 PHP 對資料庫伺服器一無所知。

注:在执行以下步驟修正問題之前,驗證藉由正常瀏覽器存取的資料庫連線。

解法

在你的 database.php 變更 "localhost" 为 "127.0.0.1"

如果不行:

建立一个指向 MAMP 的 mysql.socket 的符號連結。

$ sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock /var/mysql/mysql.sock

在某些情況下你必須先建立目录:

$ sudo mkdir /var/mysql
$ sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock /var/mysql/mysql.sock

ORM/DB 回傳我的資料爲 HTML 實體

发生在……

Fuel 有安全性的對策被稱为「輸出编码」,在預設情況下是打開的。 这意味著,任何傳遞給 View 或 Presenter 的值被認为是危險的,除非你明確地标記它为安全的。 所有不安全的值将透過 htmlentities, 包括陣列內容和物件特性。

解法

學習更多關於 View 类別中的安全性

Orm\Exception [ Error ]: Listing columns not failed

错误

Orm\Exception [ Error ]: Listing columns not failed, you have to set the model properties with a static $_properties setting in the model.

发生在……

當使用 ORM 模型不是藉由 MySQL 連線時。

解法

確認 db 配置值是正確的并且测试你的資料庫連線。

更新模型包含的特性。

protected static $_properties = array('id', 'title', 'contents', 'publish');

或在 APPATH/config/db.php 中變更 db 类型为 "mysql"

在變更 index.php 的位置後,Asset 不運作。

发生在……

那是因为你的路徑沒有正確定義,Asset 类別使用一个相對於 index.php 的路徑。

解法

要修正这个問題,你必須修改 app/config/asset.php 去設定正確路徑。注意,在 index.php 中一个名为 DOCROOT 的常数被定義:

define('DOCROOT', __DIR__.DIRECTORY_SEPARATOR);

你可以在 app/config/asset.php 中使用。这将設定路徑回到預設文件夾 DOCROOT/public/assets,子文件夾 css/ img/ 和 js/ 的所在:

'paths' => array(DOCROOT.'public/assets/'),

发生在……

这可能会发生,因为在 DOCROOT/index.php,realpath() 被用來处理相對路徑,这将快取路徑資訊,包括符號連結。

解法

要修正这个問題,你必須修改 DOCROOT/index.php 并为每一个包含符號連結的路徑使用 clearstatcache() 以清除快取。或者,你可以重載你的網頁伺服器以清除路徑快取。你不能手动发出 clearstatcache() 命令, 因为它被每一个線程快取,且发出該命令将只清除目前線程的快取。

Exception thrown without a stack frame

发生在……

造成此訊息的原因是當 PHP 已经在它的拆解階段(tear-down phase)发生了错误,而且沒有错误处理程序是可用的了。

解法

为什么会发生这種情況的原因有很多。我們会嘗试記錄最顯而易見的:

  • 你的網頁伺服器沒有寫入儲存 log 档案資料夾的權限(預設是 APPPATH.'logs')。