最近因項(xiàng)目需要,引出一個(gè)議題:如何執(zhí)行字符串的php代碼(php和html混寫)。
注:傳統(tǒng)情況下,php代碼存儲(chǔ)在文件中,直接運(yùn)行文件即可。以下討論的情況是,如果php代碼是從數(shù)據(jù)庫(kù)中獲取到,那么要如何運(yùn)行?
最直觀的方案
將字符串代碼寫到臨時(shí)文件,然后在項(xiàng)目中include該文件,執(zhí)行完成再刪除這個(gè)臨時(shí)文件
system exec 之類的系統(tǒng)函數(shù)
php函數(shù)eval (會(huì)不會(huì)有安全問(wèn)題?)
進(jìn)一步的瞎想
把字符串代碼當(dāng)做參數(shù),傳入到php的cli或者php-fpm中運(yùn)行
重新定義include,讓include可以直接操作字符串
幾種思路的驗(yàn)證
1:寫臨時(shí)文件,然后include文件。豪無(wú)疑問(wèn),可行。那么豈不是每次都要寫文件,每個(gè)請(qǐng)求都要寫一次文件。好吧,總有辦法解決,緩存+過(guò)期驗(yàn)證之類的,但總感覺(jué)這方案不夠?qū)I(yè)。。
2:system exec之類的函數(shù)。稍微思考下就會(huì)明白,這類函數(shù)是執(zhí)行系統(tǒng)命令,不是運(yùn)行php代碼
3:eval函數(shù),手冊(cè)上寫著:
Caution :The eval() language construct is very dangerous because it allows execution of arbitrary PHP code