2009-11-30 59 views
2

我在Windows XP上運行Symfony(1.2.9)和PHP版本5.2.11。無法重新聲明類sfconfig

我有APC安裝(版本3.0.19)

我可以運行PHP腳本來證明APC正常工作(工程)。然而,當我嘗試使用APC在symfony的行動電話,我得到這個錯誤(在Apache的error.log文件):

[APC-錯誤]不能重新聲明類sfconfig

哪個及時崩潰的Apache。

我試過使用Symfony sfAPCCache包裝,然後直接調用apc_ *函數 - 結果是一樣的。有誰知道爲什麼會發生這種情況?

回答

3
+0

我會將您的答案標記爲已接受。它提供了一個修復(它允許我繼續工作),但沒有解釋爲什麼我必須將apc.stat配置設置爲零(關閉)。至少它可以工作,所以我可以繼續在我的Windows系統上開發。 當我移動到具有真實操作系統的服務器(不是米奇鼠標)時,我不會遇到這個問題。 – 2009-12-01 10:26:56

+0

如果可能,您可能想嘗試更新版本的php/APC並查看錯誤是否仍然存在。 – 2009-12-01 18:10:56

0

Ive有這個錯誤之前無關的APC,它總是幫助,不僅運行緩存:明確還要檢查並確保所有文件已從緩存目錄中刪除。

0

我的生活在我的開發windows 系統與php 5.2.11和幾個apc版本的情況相同。同樣的 情況描述,與stat = 0一切正常,但 當我設置stat = 1時,apache崩潰,錯誤「不能 redeclare類[some class]」。該代碼正在處理一個不同的windows系統,除此之外,它幾個月來一直在重載 加載的linux生產服務器上。我是%100肯定 沒有與apc相關的錯誤。它在我重新安裝操作系統後在我的機器 上啓動。

我花了一些時間評論出一些類包括和 意識到它可以與一些包含文件,但不與 特定的。我檢查了我的代碼沒有明顯的 差別。

然後我保存了所有的包含文件,並在Zend Studio的編輯器中添加了一些 附加的空格。它看起來 愚蠢我知道,但它的作品!我工作的項目 幾個人使用SVN和每個人都使用不同的 文本編輯器如記事本++,EditPlus的等等

但是我不能試圖保存 文件與一些不同重現錯誤編輯器有不同的配置,如 ansi,utf8有/無字節標記排序等。但我相信 我的問題是與文件格式(編碼, pc/unix模式)有關。我想重現錯誤,並想 提供更詳細的信息,但我嘗試了我的解決方案在另一個 項目與同樣的問題,它也可以。

我希望我能給出另一個觀點來解決這個問題。

0

對我來說,解決這個問題就是確保我的需求具有相同的路徑。

例如,我得到的錯誤是:
[apc-error] Cannot redeclare class someClass

在文件AI了下列文件:
require_once '/path/to/someClass.php';

在駐留在相同的目錄中someClass.php文件B我有以下內容:
require_once 'someClass.php';

我相信APC緩存不理解它們是相同的文件,因爲路徑是特定的編輯一個而不是另一個。

2

今天這個錯誤也發生在我身上,我意識到它爲什麼會發生(可能是其他原因)。

APC通過完全限定名稱(包括類名稱空間)正確標識每個類。不幸的是,你最終可能會用不同的名字來引用同一個類。

例如:

我的代碼中有一個錯誤的「使用」的聲明,導入一個非命名空間類,彷彿它已經在命名空間裏。

該類稱爲「MyClass」,名稱空間爲「\」,表示其正確且完全限定的名稱爲「\ MyClass」。

在某些時候,這個類被它的非限定名稱「MyClass」引用,並被自動加載。在另一個文件中,我(錯誤地)在use語句中使用名稱空間前綴引用該類,並說「use \ SomeNamespace \ MyClass;」。因此,該類(再次)傳遞給我的全局__autoload()方法,但名稱不同。更糟的是,autoload方法足夠聰明,無論如何都能找到類。

瞬間,我的腳本停止工作和所發生的一切是APC寫作「[APC-錯誤]不能重新聲明類......」到Apache Web服務器error.log中。我的頁面不再可用。

這不是一個APC錯誤,但只是正確的行爲。

對我來說,它有助於暫時禁用APC(讓我的腳本將不考慮衝突的運行),以及勾回聲陳述了我的__autoload函數產生傳遞的參數列表。裝載了錯誤名稱的類會很快顯示,我可以修復它並重新啓用APC。

希望這可以幫助別人。