Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
PHP 動(dòng)態(tài)頁面轉(zhuǎn)換為靜態(tài) HTML 頁面的主要意義在于提高網(wǎng)站的性能和可用性。下面是一些具體的好處:
然而,將 PHP 動(dòng)態(tài)頁面轉(zhuǎn)換為靜態(tài) HTML 頁面并不適用于所有類型的網(wǎng)站,特別是對于需要?jiǎng)討B(tài)生成內(nèi)容和實(shí)時(shí)更新的網(wǎng)站,如電子商務(wù)網(wǎng)站、新聞網(wǎng)站等,這種轉(zhuǎn)換可能會(huì)導(dǎo)致信息更新不及時(shí),從而影響網(wǎng)站的可用性和用戶體驗(yàn)。因此,需要根據(jù)實(shí)際需求和情況來選擇是否需要將 PHP 動(dòng)態(tài)頁面轉(zhuǎn)換為靜態(tài) HTML 頁面。
要生成 HTML 文件,可以使用 PHP 中的文件處理函數(shù)和輸出函數(shù)來創(chuàng)建一個(gè)新的 HTML 文件并將其寫入磁盤。下面是一個(gè)簡單的示例:
<?php
// 創(chuàng)建一個(gè)新的 HTML 文件
$html = '<html><head><title>My HTML File</title></head><body><p>Hello, world!</p></body></html>';
$file = fopen('myhtmlfile.html', 'w');
// 將 HTML 內(nèi)容寫入文件
fwrite($file, $html);
// 關(guān)閉文件
fclose($file);
// 輸出成功信息
echo 'HTML 文件已經(jīng)生成!';
?>
在上面的示例中,首先創(chuàng)建了一個(gè)包含 HTML 代碼的字符串變量 $html。然后使用 fopen()函數(shù)創(chuàng)建一個(gè)新的文件,并將其設(shè)置為寫入模式 'w'。然后使用 fwrite() 函數(shù)將 HTML 內(nèi)容寫入文件。最后使用 fclose() 函數(shù)關(guān)閉文件。生成的文件名為 myhtmlfile.html,它將保存在與 PHP 腳本相同的目錄中。
請注意,上述示例是一個(gè)簡單的示例,用于說明如何生成 HTML 文件。在實(shí)際應(yīng)用中,您可能需要更復(fù)雜的 HTML 代碼,需要使用循環(huán)或條件語句生成動(dòng)態(tài)內(nèi)容,并使用樣式表或 JavaScript 對 HTML 進(jìn)行美化和交互。
將 PHP 動(dòng)態(tài)頁面進(jìn)行 HTML 緩存可以顯著提高網(wǎng)站性能,因?yàn)樗梢詼p少服務(wù)器請求和頁面加載時(shí)間。以下是一些用于將 PHP 動(dòng)態(tài)頁面進(jìn)行 HTML 緩存的常見方法:
1.使用 PHP 自帶的輸出緩存機(jī)制 ob_start() 和 ob_get_contents() 函數(shù)。
<?php
// 啟動(dòng)輸出緩存
ob_start();
// 輸出動(dòng)態(tài)內(nèi)容
echo 'Hello, world!';
// 將輸出內(nèi)容保存到緩存文件
file_put_contents('cached_page.html', ob_get_contents());
// 清空輸出緩存并關(guān)閉
ob_end_clean();
?>
在上述示例中,使用 ob_start() 函數(shù)啟動(dòng) PHP 輸出緩存,然后使用 echo 輸出動(dòng)態(tài)內(nèi)容。然后,使用 ob_get_contents() 函數(shù)將輸出內(nèi)容保存到緩存文件中,并使用 file_put_contents() 函數(shù)寫入緩存文件。最后,使用 ob_end_clean() 函數(shù)清空輸出緩存并關(guān)閉。
2.使用第三方緩存庫如 Memcached 或 Redis。
這些緩存庫可以在服務(wù)器內(nèi)存中存儲緩存頁面,并且能夠通過一個(gè)唯一的鍵名來訪問緩存頁面,從而加快頁面訪問速度。具體實(shí)現(xiàn)可以參考對應(yīng)的文檔或者庫的使用說明。
3.使用 HTTP 緩存頭信息。
這是一種在瀏覽器和服務(wù)器之間緩存頁面的機(jī)制,通過設(shè)置響應(yīng)頭信息來控制頁面緩存。可以通過設(shè)置 Expires、Cache-Control、Last-Modified 和 ETag 等響應(yīng)頭信息來控制頁面的緩存,從而減少對服務(wù)器的請求。具體實(shí)現(xiàn)可以參考 HTTP 協(xié)議規(guī)范或者使用對應(yīng)的 PHP 框架提供的緩存機(jī)制。
無論使用哪種方法,都需要謹(jǐn)慎考慮緩存時(shí)間和更新機(jī)制,以確保緩存頁面在需要時(shí)被及時(shí)更新,并避免緩存過期或出現(xiàn)臟數(shù)據(jù)等問題。
家好,這一章就是講關(guān)于創(chuàng)建幫助函數(shù)的問題。思考這樣一個(gè)問題,可能有一些公共的函數(shù)需要在全局調(diào)用,這個(gè)地方也要調(diào),那個(gè)地方也要調(diào),這樣的函數(shù)應(yīng)該怎么創(chuàng)建?涉及到今天創(chuàng)建幫助函數(shù)文件。
首先習(xí)慣性的是在APP下面創(chuàng)建一個(gè),這里面就是放全局運(yùn)用的函數(shù)。這邊一個(gè)小細(xì)節(jié),從學(xué)APP基礎(chǔ)都是這樣的。為什么現(xiàn)在很多人后面下面的不寫?這樣寫有一個(gè)前提條件,就是php文件必須要是純php文件,不能插html這種超文不連接或者是html、css、gs這種混在一起寫的,這樣寫不行,就是文件必須要是純php文件。
為什么不這樣寫?這樣寫有壞處,比如有人不規(guī)范,很多空格,實(shí)際代碼就寫了幾行,留了很多空格。實(shí)際在計(jì)算機(jī)服務(wù)器端運(yùn)算的時(shí)候會(huì)把這些空格也并入運(yùn)算的,雖然沒有什么任何結(jié)果,但也會(huì)運(yùn)算,這樣就會(huì)導(dǎo)致腳本運(yùn)行變慢,性能變差。
這樣不加小問號,不加結(jié)尾標(biāo)簽,到最后一個(gè)冒號結(jié)束的時(shí)候整個(gè)這段就運(yùn)行結(jié)束了,這樣反而運(yùn)行效率更高。所以在純文本的APP文件里面,現(xiàn)在比較好的寫法就是后面不寫B(tài),就是標(biāo)簽關(guān)閉的符號不寫,就直接這樣寫。
小問題給大家嘮叨一下,假設(shè)在這邊命名了一個(gè)函數(shù),返回一個(gè)叫hello word,就是返回一個(gè)字符串。現(xiàn)在比如想在外部漏油里面調(diào)用,比如要調(diào)用打贏勾勾,能打贏嗎?來試一下,BS.test,不行,格格是一個(gè)未定義的函數(shù),因?yàn)樗鼪]有找到函數(shù),找到原因就是它還不是全局的輔助函數(shù),所以要把它必要把文件里面的函數(shù)定義為全區(qū)的,就涉及到自動(dòng)加載的問題。
就在composer jason里面有一個(gè)outload,默認(rèn)是ps24加載這些,比如name space什么的都相應(yīng)的,這個(gè)就自動(dòng)引導(dǎo)到這邊,a b大學(xué)APP的name space就自動(dòng)引導(dǎo)到APP文件夾上面,類似的,大家能看懂。
在下面添加一行,就是按配置的冒號逗號,配置的fire s也會(huì)自動(dòng)加載APP下面的help,ph重點(diǎn),它也會(huì)自動(dòng)加載outload,再加載完了就好了,刷新一下,原來不行,還差一步,要把它重新引導(dǎo)一下,就回到虛擬機(jī)里面,重新引導(dǎo)一下,引導(dǎo)完了,刷新一下,說明已經(jīng)是全局的輔助函數(shù)了,可以調(diào)用。
再考慮一個(gè)問題,這邊定了一個(gè)go,這么一個(gè)函數(shù),如果外部有一個(gè)庫,也叫哥哥,不就壞了嗎?如果導(dǎo)入就把導(dǎo)入外部庫的哥哥內(nèi)涵處給覆蓋掉了,就會(huì)造成很多程序運(yùn)行上的錯(cuò)誤,所以在上面要判斷一下,如果函數(shù)不存在的時(shí)候,才運(yùn)行,加載運(yùn)行,這里面的函數(shù)做判斷是比較嚴(yán)謹(jǐn)?shù)模@樣也不影響運(yùn)行,也是正常的運(yùn)行的。
這些歌就講到這里。
.引用相關(guān)頭文件
引入CSS:
<link href="Scripts/jquery-ui-1.8.1.custom.css" rel="stylesheet" type="text/css" />
<link href="Scripts/ui.jqgrid.css" rel="stylesheet" type="text/css" />
引入JS:
<script src="Scripts/jquery-1.5.1.js" type="text/javascript"></script>
<script src="Scripts/jquery-ui.min.js" type="text/javascript"></script>
<script src="Scripts/grid.locale-en.js" type="text/javascript"></script>
<script src="Scripts/jquery.jqGrid.min.js" type="text/javascript"></script>
因?yàn)閖qGrid3.6及以后的版本集成了jQuery UI,所以,此處需要導(dǎo)入U(xiǎn)I相關(guān)js和css。另外grid.locale-en.js這個(gè)語言文件必須在jquery.jqGrid.min.js之前加載,否則會(huì)出問題。
2.將jqgrid加入頁面中
根據(jù)jqGrid的文檔,要想生成一個(gè)jqGrid,最直接的方法就是:
$("#list").jqGrid(options);
其中l(wèi)ist是頁面上的一個(gè)table:<table id="list"></table>
下面是一個(gè)簡單的例子:
<script type="text/javascript">
$(document).ready(function () {
jQuery("#list").jqGrid({
url: 'Handler.ashx',
datatype: "json",
mtype: 'GET',
colNames: ['SalesReasonID', 'Name', 'ReasonType', 'ModifiedDate'],
colModel: [
{ name: 'SalesReasonID', index: 'SalesReasonID', width: 40, align: "left", editable: true },
{ name: 'Name', index: 'Name', width: 100, align: "center" },
{ name: 'ReasonType', index: 'ReasonType', width: 100, align: "center" },
{ name: 'ModifiedDate', index: 'ModifiedDate', width: 150, align: "center", search: false }
],
rowList: [10, 20, 30],
sortname: 'SalesReasonID',
viewrecords: true,
sortorder: "desc",
jsonReader: {
root: "griddata",
total: "totalpages",
page: "currpage",
records: "totalrecords",
repeatitems: false
},
pager: jQuery('#pager'),
rowNum: 5,
altclass: 'altRowsColour',
//width: 'auto',
width: '500',
height: 'auto',
caption: "DemoGrid"
}).navGrid('#pager', { add: true, edit: true, del: true,search:false,refresh:false }); ;
})
二、 jqgrid的重要選項(xiàng)
具體的options參考,可以訪問jqGrid文檔關(guān)于option的章節(jié)(http://www.trirand.com/jqgridwiki/doku.php?id=wiki:options)。其中有幾個(gè)是比較常用的,重點(diǎn)介紹一下:
2.1 prmNames選項(xiàng)
prmNames是jqGrid的一個(gè)重要選項(xiàng),用于設(shè)置jqGrid將要向Server傳遞的參數(shù)名稱。其默認(rèn)值為:
prmNames : {
page:"page", // 表示請求頁碼的參數(shù)名稱
rows:"rows", // 表示請求行數(shù)的參數(shù)名稱
sort: "sidx", // 表示用于排序的列名的參數(shù)名稱
order: "sord", // 表示采用的排序方式的參數(shù)名稱
search:"_search", // 表示是否是搜索請求的參數(shù)名稱
nd:"nd", // 表示已經(jīng)發(fā)送請求的次數(shù)的參數(shù)名稱
id:"id", // 表示當(dāng)在編輯數(shù)據(jù)模塊中發(fā)送數(shù)據(jù)時(shí),使用的id的名稱
oper:"oper", // operation參數(shù)名稱
editoper:"edit", // 當(dāng)在edit模式中提交數(shù)據(jù)時(shí),操作的名稱
addoper:"add", // 當(dāng)在add模式中提交數(shù)據(jù)時(shí),操作的名稱
deloper:"del", // 當(dāng)在delete模式中提交數(shù)據(jù)時(shí),操作的名稱
subgridid:"id", // 當(dāng)點(diǎn)擊以載入數(shù)據(jù)到子表時(shí),傳遞的數(shù)據(jù)名稱
npage: null,
totalrows:"totalrows" // 表示需從Server得到總共多少行數(shù)據(jù)的參數(shù)名稱,參見jqGrid選項(xiàng)中的rowTotal
}
2.2 jsonReader選項(xiàng)
jsonReader是jqGrid的一個(gè)重要選項(xiàng),用于設(shè)置如何解析從Server端發(fā)回來的json數(shù)據(jù),如果Server返回的是xml數(shù)據(jù),則對應(yīng)的使用xmlReader來解析。jsonReader的默認(rèn)值為:
jsonReader : {
root: "rows", // json中代表實(shí)際模型數(shù)據(jù)的入口
page: "page", // json中代表當(dāng)前頁碼的數(shù)據(jù)
total: "total", // json中代表頁碼總數(shù)的數(shù)據(jù)
records: "records", // json中代表數(shù)據(jù)行總數(shù)的數(shù)據(jù)
repeatitems: true, // 如果設(shè)為false,則jqGrid在解析json時(shí),會(huì)根據(jù)name來搜索對應(yīng)的數(shù)據(jù)元素(即可以json中元素可以不按順序);而所使用的name是來自于colModel中的name設(shè)定。
cell: "cell",
id: "id",
userdata: "userdata",
subgrid: {
root:"rows",
repeatitems: true,
cell:"cell"
}
}
假如有下面一個(gè)json字符串:
{"totalpages":"3","currpage":"1","totalrecords":"11","griddata":[{"SalesReasonID":"1","Name":"Price","ReasonType":"Other","ModifiedDate":"1998年6月1日"},{"SalesReasonID":"2","Name":"On Promotion","ReasonType":"Promotion","ModifiedDate":"1998年6月1日"},{"SalesReasonID":"3","Name":"Magazine Advertisement","ReasonType":"Marketing","ModifiedDate":"1998年6月1日"},{"SalesReasonID":"4","Name":"Television Advertisement","ReasonType":"Marketing","ModifiedDate":"1998年6月1日"},{"SalesReasonID":"5","Name":"Manufacturer","ReasonType":"Other","ModifiedDate":"1998年6月1日"}]}
其對應(yīng)的jsonReader為:jsonReader: {
root: "griddata",
total: "totalpages",
page: "currpage",
records: "totalrecords",
repeatitems: false
}
注:cell、id在repeatitems為true時(shí)可以用到,即每一個(gè)記錄是由一對id和cell組合而成,即可以適用另一種json結(jié)構(gòu)。援引文檔中的例子:
repeatitems為true時(shí):
jQuery("#gridid").jqGrid({
...
jsonReader : {
root:"invdata",
page: "currpage",
total: "totalpages",
records: "totalrecords"
},
...
});
json結(jié)構(gòu)為:
{
"totalpages": "xxx",
"currpage": "yyy",
"totalrecords": "zzz",
"invdata" : [
{"id" :"1", "cell" :["cell11", "cell12", "cell13"]}, // cell中不需要各列的name,只要值就OK了,但是需要保持對應(yīng)
{"id" :"2", "cell" :["cell21", "cell22", "cell23"]},
...
]
}
repeatitems為false時(shí):
jQuery("#gridid").jqGrid({
...
jsonReader : {
root:"invdata",
page: "currpage",
total: "totalpages",
records: "totalrecords",
repeatitems: false,
id: "0"
},
...
});
json結(jié)構(gòu)為:
{
"totalpages" : "xxx",
"currpage" : "yyy",
"totalrecords" : "zzz",
"invdata" : [
{"invid" : "1","invdate":"cell11", "amount" :"cell12", "tax" :"cell13", "total" :"1234", "note" :"somenote"}, // 數(shù)據(jù)中需要各列的name,但是可以不按列的順序
{"invid" : "2","invdate":"cell21", "amount" :"cell22", "tax" :"cell23", "total" :"2345", "note" :"some note"},
...
]
}
2.3 colModel的重要選項(xiàng)
colModel也有許多非常重要的選項(xiàng),在使用搜索、排序等方面都會(huì)用到。這里先只說說最基本的。
三、 注意事項(xiàng)
1. 動(dòng)態(tài)改變Add Form或者Edit Form中的select的內(nèi)容,如:改變下圖中的Comparator下拉中的內(nèi)容。
$("#list_d").navGrid('#pager_d',{add:true,edit:true,del:true,search:false,refresh:false},
{
checkOnSubmit:false, closeAfterEdit: true,recreateForm:true,
beforeInitData:function(formid){
initComparator();
},
beforeShowForm: function(formid){
$("#list_d").jqGrid('setColProp', 'Name', { editrules:{required:false},});
$('#tr_Name', formid).hide();
}
},//edit
{},//add
{}//del
)
beforeInitData, beforeShowForm在每次點(diǎn)擊編輯的時(shí)候都會(huì)執(zhí)行。initComparator的作用是通過ajax獲取數(shù)據(jù),然后利用$("#list_d").jqGrid('setColProp', 'Comparator', { editoptions: { value: valueString} });來設(shè)置Comparator下拉中的內(nèi)容。其中valueString的格式如下’ equal to: equal to; not equal to: not equal to’。鍵值之間用冒號隔開,2項(xiàng)之間用分號隔開。注意:把recreateForm設(shè)為true,否則'setColProp'只在第一次調(diào)用時(shí)有效。
2. var rowNum = parseInt($(this).getGridParam("records"), 10); 得到數(shù)據(jù)條數(shù)。
3. jQuery("#list_d").clearGridData();清空數(shù)據(jù)。
4. jQuery("#list").getCell(ids,"Key");獲取第ids行的key列。
5. $("#list").jqGrid('setSelection', "1");選中第一行。放在loadComplete:中在gird加載完成的時(shí)候自動(dòng)選中第一行。loadComplete:function(data){$("#list").jqGrid('setSelection', "1");
}
6. 對于像1中的可編輯的字段,可以設(shè)定rule,參見http://www.trirand.com/jqgridwiki/doku.php?id=wiki:common_rules#editrules
7. 修改Option,以URL為例
jQuery("#list_d").jqGrid('setGridParam',{url:"xxx.aspx",page:1}).trigger('reloadGrid');
*請認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。