2016-10-06 90 views
2

所以我正在構建一個工具來增加網站的安全性。 該工具在CMS啓動之前加載並將掃描有問題內容的請求(如軟防火牆)使用代碼後卸載作曲家自動加載器

事情是 - 我在Composer上使用了一些庫來構建工具。到現在爲止還挺好。 現在我在想這可能是一個壞主意,因爲如果CMS也調用Composer Autoload,我們在代碼中可能會有不同版本的相同庫(這會產生問題和錯誤)。

那麼在我的腳本完成掃描請求後,有沒有辦法卸載我的作曲家自動加載?

謝謝你的任何幫助:)

+1

我想知道爲什麼你沒有將你的工具集成到CMS中,而是將它作爲一個單獨的工具進行開發? – Xatenev

+0

使用單獨的供應商目錄,以免碰到路徑衝突並使用'$ functions = spl_autoload_functions(); foreach($ function as $ function){ spl_autoload_unregister($ function); }' – Xatenev

+0

@Xatenev我想在未來的其他網站上使用這個工具。所以它必須是CMS不特定的。 – OmegaTCU

回答

0

是的,你可以註銷自動加載功能如下:

$functions = spl_autoload_functions(); 
foreach($functions as $function) { 
    spl_autoload_unregister($function); 
} 

來源:http://php.net/manual/en/function.spl-autoload-unregister.php#112225

但是,這不會離開你一個乾淨的石板(這是你想要的):

  • 你將不得不取消任何全局變量
  • 某些庫可能會定義常量,並且沒有辦法fo (source
  • 您在代碼中加載的任何類都將在請求的生命週期內保持加載狀態,並且據我所知,無法卸載它們(source

最好的辦法是把你的代碼集成到上述應用程序中(即合併作曲文件)並在維護應用程序時保持版本同步。

+0

好吧 - 我可以使用這個命名空間,這樣我就不會與來自網站的其他調用發生衝突嗎? – OmegaTCU

+0

對於你自己的代碼,是的。然而,讓我們說通過作曲者安裝的一些庫加載了一個Foo \ Bar類。您取消註冊自動加載,但「Foo \ Bar」類定義保持加載狀態。當後來運行的CMS詢問'Foo \ Bar'時,將會收到您的代碼加載的內容。因此,建議合併您的作曲家文件並保持lib版本的同步(請參閱我的編輯)。是的,這可能導致依賴地獄,但只要你的作曲家庫保持鎖定到穩定的版本/標籤,它應該是可管理的。 – MicE

0

以及作曲家生成您的供應商文件夾中的autoload.php。每個作曲家調用都會覆蓋autoload.php。

你可以爲你自己的供應商使用一個單獨的文件夾,這很好。

您還可以在composer.json中更改要與「installer-paths」一起使用的文件夾。

+0

謝謝我已經使用不同的供應商目錄。但我認爲自動加載然後會轉到我的目錄而不是cms的供應商目錄。 – OmegaTCU

+0

好的,你如何開始你的軟防火牆? - 我會推薦某種進程隔離。 (如PhpProcess) – Gladhon

0

不錯的問題。 當我的代碼中的兩個地方使用不同版本的guzzle時,我遇到了類似的問題。 因此,您無法在運行時取消註冊已註冊的類。 從firerwall的腳步中你不能運行clean。 因此,無論使用何種產品,您都無法確定您的產品是否兼容且無衝突。 悲傷,但是確實如此。

+0

所以我對這個項目的解決方案是將作曲家合併在一起。對於其他所有我需要編寫我自己的類來使其工作。如果我只使用自己的解決方案,我不應該說與作曲家的問題。這ofc帶有其他問題... – OmegaTCU

相關問題