3 回答

TA貢獻1798條經驗 獲得超3個贊
我想到的一個想法是將生成的代碼保存在一個臨時文件中(在tmpfs中),然后include對其進行處理。
$Test_Function = file_get_contents('data:application/x-php;base64,ZnVuY3Rpb24gdGVzdCgpe2VjaG8nVGhpcyB0ZXN0IGRhdGEgdXJsIGZ1bmN0aW9uIDEgaXMgd29ya2luZy4nO30gdGVzdCgpOw==');
file_put_contents("/mnt/tempfs/<name>.php", "<?php\n$Test_Function");
include "/mnt/tempfs/<name>.php";
關于性能:
tmpfs 工具允許創建內容駐留在虛擬內存中的文件系統。由于此類文件系統上的文件通常駐留在 RAM 中,因此文件訪問速度非??臁?/p>

TA貢獻1860條經驗 獲得超9個贊
我聞到了X/Y 問題的味道——您已經將URIeval
和data:
URI 視為特定問題的可能解決方案,并發現了兩者的缺點,但沒有回到最初的問題陳述。
從各種評論中,我們可以將問題定義為找到一種機制:
可以執行任意動態代碼
具有與正常相似的解析性能
include
將允許代碼緩存在 OpCache 中
不需要在其他地方放松安全
你說eval
在第 2 點(因為它啟動了一個新的解析器)和第 3 點(因為沒有可供 OpCache 使用的密鑰)失敗。
您已經確定data:
URI 在第 4 點失?。ㄒ驗樗鼈冃枰?code>allow_url_include),但我懷疑它們在第 2 點(因為 base64 解碼是一項重要的開銷)和第 3 點(因為 OpCache 不支持緩存任意流;我相信它只支持文件路徑和 PHAR 內容)
更好的整體解決方案是將代碼寫入“真實”文件,使用內存文件系統(例如tmpfs
提高性能)。這符合上述所有四個標準,因為就 PHP 而言,它與任何其他源文件相同;唯一的額外開銷是將文件寫入虛擬文件系統的 I/O 速度。
關鍵優化將確保您跟蹤動態內容何時更改,從某種修訂 ID 或字符串的哈希生成唯一的文件路徑。這可以實現兩件事:
您可以跳過寫入磁盤上已存在的文件,從而節省 I/O 時間
OpCache 將能夠緩存此文件的內容并重新使用它,即使您設置
opcache.validate_timestamps
為 false ,您也可以確信正確的代碼會運行
- 3 回答
- 0 關注
- 223 瀏覽
添加回答
舉報