2012-12-14 44 views
4

我正在處理的Web應用程序需要能夠處理相同PHP擴展的兩個不同版本。 (特別是Mapserver for Mapserver 5.6和MapScript for Mapserver 6.2)如何加載相同php擴展的兩個版本?

在php執行開始之前,腳本不知道需要加載哪個版本。 (但每個請求只需要一個擴展名。)

我原來的計劃是使用php內置的dl函數,但是我發現dl由於安全問題而被禁用。 (http://php.net/manual/en/function.dl.php

有什麼辦法可以在執行過程中加載擴展嗎?或者可能總是加載兩者,但將它們放在不同的名稱空間中,以便可以分別訪問它們?

+0

除非擴展名支持命名空間,否則你可能不能。沒有機制來加載插件/模塊,並將它們填入與默認不同的命名空間,例如, 'dl('v1.so',\ this \ that)'。 –

+0

如果您不能重新編譯這兩個擴展,並且如果您只需加載兩個用於執行某些測試的操作,就會有一個*頭* *來唯一標識擴展名,並且可以使用二進制編輯器更改擴展名顯示的字母在內部,也可以將函數名稱改爲1個字母(並且也可以在任何地方重命名文件名)。免責聲明:沒有嘗試自己。 –

回答

2

我給出的問題+1,因爲這是一個很好的問題,很好的問。

但是,我無法想象會有一個答案,將做你正在尋找。如果擴展在版本之間不是向後兼容,那麼它顯然不是很好的設計,很難看到PHP如何爲此負責。

我能想到的最佳解決方案包括使用兩個單獨的php.ini或.htaccess文件,指定兩個獨立版本的擴展。從您的Web服務器運行的PHP程序將根據它們所在的目錄選擇不同版本的擴展。

例如http://myserver/newmaps/program.php將運行新版本的擴展,http://myserver/oldmaps/program.php將運行舊版本的擴展。

然後你只需要在兩個目錄中有相同的程序。如果它檢測到它沒有獲得它所需的擴展版本,它可能只是發出http重定向來加載其他版本。

+0

感謝您的回覆。當我問到時,我擔心沒有優雅的解決方案。我會研究你的建議,但我懷疑它可能比它的價值更復雜。 – alexwells