整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

PHP 如何生成 html 文件?

PHP 动态页面转换为静态 HTML 页面的主要意义在于提高网站的性能和可用性。下面是一些具体的好处:

  1. 提高网站性能:静态 HTML 页面可以直接从磁盘或缓存中加载,无需动态生成,因此可以显著减少服务器响应时间和页面加载时间,从而提高网站的性能和响应速度。
  2. 改善用户体验:由于静态 HTML 页面可以更快地加载,因此用户可以更快地浏览网站并获得所需的信息,从而提高用户体验和满意度。
  3. 降低服务器负载:静态 HTML 页面可以从缓存中加载,无需执行 PHP 代码和查询数据库,因此可以减少服务器负载,提高网站的稳定性和可用性。
  4. 提高搜索引擎优化:搜索引擎更喜欢快速加载和静态内容的网页。因此,将 PHP 动态页面转换为静态 HTML 页面可以提高网站的搜索引擎排名和流量。

然而,将 PHP 动态页面转换为静态 HTML 页面并不适用于所有类型的网站,特别是对于需要动态生成内容和实时更新的网站,如电子商务网站、新闻网站等,这种转换可能会导致信息更新不及时,从而影响网站的可用性和用户体验。因此,需要根据实际需求和情况来选择是否需要将 PHP 动态页面转换为静态 HTML 页面。

生成HTML文件

要生成 HTML 文件,可以使用 PHP 中的文件处理函数和输出函数来创建一个新的 HTML 文件并将其写入磁盘。下面是一个简单的示例:

<?php
// 创建一个新的 HTML 文件
$html = '<html><head><title>My HTML File</title></head><body><p>Hello, world!</p></body></html>';
$file = fopen('myhtmlfile.html', 'w');

// 将 HTML 内容写入文件
fwrite($file, $html);

// 关闭文件
fclose($file);

// 输出成功信息
echo 'HTML 文件已经生成!';
?>

在上面的示例中,首先创建了一个包含 HTML 代码的字符串变量 $html。然后使用 fopen()函数创建一个新的文件,并将其设置为写入模式 'w'。然后使用 fwrite() 函数将 HTML 内容写入文件。最后使用 fclose() 函数关闭文件。生成的文件名为 myhtmlfile.html,它将保存在与 PHP 脚本相同的目录中。

请注意,上述示例是一个简单的示例,用于说明如何生成 HTML 文件。在实际应用中,您可能需要更复杂的 HTML 代码,需要使用循环或条件语句生成动态内容,并使用样式表或 JavaScript 对 HTML 进行美化和交互。

动态转静态——HTML 缓存

将 PHP 动态页面进行 HTML 缓存可以显著提高网站性能,因为它可以减少服务器请求和页面加载时间。以下是一些用于将 PHP 动态页面进行 HTML 缓存的常见方法:

1.使用 PHP 自带的输出缓存机制 ob_start() 和 ob_get_contents() 函数。

<?php
// 启动输出缓存
ob_start();

// 输出动态内容
echo 'Hello, world!';

// 将输出内容保存到缓存文件
file_put_contents('cached_page.html', ob_get_contents());

// 清空输出缓存并关闭
ob_end_clean();
?>

在上述示例中,使用 ob_start() 函数启动 PHP 输出缓存,然后使用 echo 输出动态内容。然后,使用 ob_get_contents() 函数将输出内容保存到缓存文件中,并使用 file_put_contents() 函数写入缓存文件。最后,使用 ob_end_clean() 函数清空输出缓存并关闭。

2.使用第三方缓存库如 Memcached 或 Redis。

这些缓存库可以在服务器内存中存储缓存页面,并且能够通过一个唯一的键名来访问缓存页面,从而加快页面访问速度。具体实现可以参考对应的文档或者库的使用说明。

3.使用 HTTP 缓存头信息。

这是一种在浏览器和服务器之间缓存页面的机制,通过设置响应头信息来控制页面缓存。可以通过设置 Expires、Cache-Control、Last-Modified 和 ETag 等响应头信息来控制页面的缓存,从而减少对服务器的请求。具体实现可以参考 HTTP 协议规范或者使用对应的 PHP 框架提供的缓存机制。

无论使用哪种方法,都需要谨慎考虑缓存时间和更新机制,以确保缓存页面在需要时被及时更新,并避免缓存过期或出现脏数据等问题。

家好,这一章就是讲关于创建帮助函数的问题。思考这样一个问题,可能有一些公共的函数需要在全局调用,这个地方也要调,那个地方也要调,这样的函数应该怎么创建?涉及到今天创建帮助函数文件。

首先习惯性的是在APP下面创建一个,这里面就是放全局运用的函数。这边一个小细节,从学APP基础都是这样的。为什么现在很多人后面下面的不写?这样写有一个前提条件,就是php文件必须要是纯php文件,不能插html这种超文不连接或者是html、css、gs这种混在一起写的,这样写不行,就是文件必须要是纯php文件。

为什么不这样写?这样写有坏处,比如有人不规范,很多空格,实际代码就写了几行,留了很多空格。实际在计算机服务器端运算的时候会把这些空格也并入运算的,虽然没有什么任何结果,但也会运算,这样就会导致脚本运行变慢,性能变差。

这样不加小问号,不加结尾标签,到最后一个冒号结束的时候整个这段就运行结束了,这样反而运行效率更高。所以在纯文本的APP文件里面,现在比较好的写法就是后面不写B,就是标签关闭的符号不写,就直接这样写。

小问题给大家唠叨一下,假设在这边命名了一个函数,返回一个叫hello word,就是返回一个字符串。现在比如想在外部漏油里面调用,比如要调用打赢勾勾,能打赢吗?来试一下,BS.test,不行,格格是一个未定义的函数,因为它没有找到函数,找到原因就是它还不是全局的辅助函数,所以要把它必要把文件里面的函数定义为全区的,就涉及到自动加载的问题。

就在composer jason里面有一个outload,默认是ps24加载这些,比如name space什么的都相应的,这个就自动引导到这边,a b大学APP的name space就自动引导到APP文件夹上面,类似的,大家能看懂。

在下面添加一行,就是按配置的冒号逗号,配置的fire s也会自动加载APP下面的help,ph重点,它也会自动加载outload,再加载完了就好了,刷新一下,原来不行,还差一步,要把它重新引导一下,就回到虚拟机里面,重新引导一下,引导完了,刷新一下,说明已经是全局的辅助函数了,可以调用。

再考虑一个问题,这边定了一个go,这么一个函数,如果外部有一个库,也叫哥哥,不就坏了吗?如果导入就把导入外部库的哥哥内涵处给覆盖掉了,就会造成很多程序运行上的错误,所以在上面要判断一下,如果函数不存在的时候,才运行,加载运行,这里面的函数做判断是比较严谨的,这样也不影响运行,也是正常的运行的。

这些歌就讲到这里。

.引用相关头文件

引入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>

因为jqGrid3.6及以后的版本集成了jQuery UI,所以,此处需要导入UI相关js和css。另外grid.locale-en.js这个语言文件必须在jquery.jqGrid.min.js之前加载,否则会出问题。

2.将jqgrid加入页面中

根据jqGrid的文档,要想生成一个jqGrid,最直接的方法就是:

$("#list").jqGrid(options);

其中list是页面上的一个table:<table id="list"></table>

下面是一个简单的例子:

<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的重要选项

具体的options参考,可以访问jqGrid文档关于option的章节(http://www.trirand.com/jqgridwiki/doku.php?id=wiki:options)。其中有几个是比较常用的,重点介绍一下:

  • url :jqGrid控件通过这个参数得到需要显示的数据,具体的返回值可以使XML也可以是Json。
  • datatype :这个参数用于设定将要得到的数据类型。类型包括:json 、xml、xmlstring、local、javascript、function。
  • mtype : 定义使用哪种方法发起请求,GET或者POST。
  • height :Grid的高度,可以接受数字、%值、auto,默认值为150。
  • width :Grid的宽度,如果未设置,则宽度应为所有列宽的之和;如果设置了宽度,则每列的宽度将会根据shrinkToFit选项的设置,进行设置。
  • shrinkToFit :此选项用于根据width计算每列宽度的算法。默认值为true。如果shrinkToFit为true且设置了width值,则每列宽度会根据width成比例缩放;如果shrinkToFit为false且设置了width值,则每列的宽度不会成比例缩放,而是保持原有设置,而Grid将会有水平滚动条。
  • autowidth :默认值为false。如果设为true,则Grid的宽度会根据父容器的宽度自动重算。重算仅发生在Grid初始化的阶段;如果当父容器尺寸变化了,同时也需要变化Grid的尺寸的话,则需要在自己的代码中调用setGridWidth方法来完成。
  • pager :定义页码控制条Page Bar,在上面的例子中是用一个div(<div id=”pager”></div>)来放置的。
  • sortname :指定默认的排序列,可以是列名也可以是数字。此参数会在被传递到Server端。
  • viewrecords :设置是否在Pager Bar显示所有记录的总数。
  • caption :设置Grid表格的标题,如果未设置,则标题区域不显示。
  • rowNum :用于设置Grid中一次显示的行数,默认值为20。正是这个选项将参数rows(prmNames中设置的)通过url选项设置的链接传递到Server。注意如果Server返回的数据行数超过了rowNum的设定,则Grid也只显示rowNum设定的行数。
  • rowList :一个数组,用于设置Grid可以接受的rowNum值。例如[10,20,30]。
  • colNames :字符串数组,用于指定各列的题头文本,与列的顺序是对应的。
  • colModel :最重要的数组之一,用于设定各列的参数。(稍后详述)
  • prmNames :这是一个数组,用于设置jqGrid将要向Server传递的参数名称。(稍后详述)
  • jsonReader :这又是一个数组,用来设定如何解析从Server端发回来的json数据。(稍后详述)

2.1 prmNames选项

prmNames是jqGrid的一个重要选项,用于设置jqGrid将要向Server传递的参数名称。其默认值为:

prmNames : {

page:"page", // 表示请求页码的参数名称

rows:"rows", // 表示请求行数的参数名称

sort: "sidx", // 表示用于排序的列名的参数名称

order: "sord", // 表示采用的排序方式的参数名称

search:"_search", // 表示是否是搜索请求的参数名称

nd:"nd", // 表示已经发送请求的次数的参数名称

id:"id", // 表示当在编辑数据模块中发送数据时,使用的id的名称

oper:"oper", // operation参数名称

editoper:"edit", // 当在edit模式中提交数据时,操作的名称

addoper:"add", // 当在add模式中提交数据时,操作的名称

deloper:"del", // 当在delete模式中提交数据时,操作的名称

subgridid:"id", // 当点击以载入数据到子表时,传递的数据名称

npage: null,

totalrows:"totalrows" // 表示需从Server得到总共多少行数据的参数名称,参见jqGrid选项中的rowTotal

}

2.2 jsonReader选项

jsonReader是jqGrid的一个重要选项,用于设置如何解析从Server端发回来的json数据,如果Server返回的是xml数据,则对应的使用xmlReader来解析。jsonReader的默认值为:

jsonReader : {

root: "rows", // json中代表实际模型数据的入口

page: "page", // json中代表当前页码的数据

total: "total", // json中代表页码总数的数据

records: "records", // json中代表数据行总数的数据

repeatitems: true, // 如果设为false,则jqGrid在解析json时,会根据name来搜索对应的数据元素(即可以json中元素可以不按顺序);而所使用的name是来自于colModel中的name设定。

cell: "cell",

id: "id",

userdata: "userdata",

subgrid: {

root:"rows",

repeatitems: true,

cell:"cell"

}

}

假如有下面一个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日"}]}

其对应的jsonReader为:jsonReader: {

root: "griddata",

total: "totalpages",

page: "currpage",

records: "totalrecords",

repeatitems: false

}

注:cell、id在repeatitems为true时可以用到,即每一个记录是由一对id和cell组合而成,即可以适用另一种json结构。援引文档中的例子:

repeatitems为true时:

jQuery("#gridid").jqGrid({

...

jsonReader : {

root:"invdata",

page: "currpage",

total: "totalpages",

records: "totalrecords"

},

...

});

json结构为:

{

"totalpages": "xxx",

"currpage": "yyy",

"totalrecords": "zzz",

"invdata" : [

{"id" :"1", "cell" :["cell11", "cell12", "cell13"]}, // cell中不需要各列的name,只要值就OK了,但是需要保持对应

{"id" :"2", "cell" :["cell21", "cell22", "cell23"]},

...

]

}

repeatitems为false时:

jQuery("#gridid").jqGrid({

...

jsonReader : {

root:"invdata",

page: "currpage",

total: "totalpages",

records: "totalrecords",

repeatitems: false,

id: "0"

},

...

});

json结构为:

{

"totalpages" : "xxx",

"currpage" : "yyy",

"totalrecords" : "zzz",

"invdata" : [

{"invid" : "1","invdate":"cell11", "amount" :"cell12", "tax" :"cell13", "total" :"1234", "note" :"somenote"}, // 数据中需要各列的name,但是可以不按列的顺序

{"invid" : "2","invdate":"cell21", "amount" :"cell22", "tax" :"cell23", "total" :"2345", "note" :"some note"},

...

]

}

2.3 colModel的重要选项

colModel也有许多非常重要的选项,在使用搜索、排序等方面都会用到。这里先只说说最基本的。

  • name :为Grid中的每个列设置唯一的名称,这是一个必需选项,其中保留字包括subgrid、cb、rn。
  • index :设置排序时所使用的索引名称,这个index名称会作为sidx参数(prmNames中设置的)传递到Server。
  • label :当jqGrid的colNames选项数组为空时,为各列指定题头。如果colNames和此项都为空时,则name选项值会成为题头。
  • width :设置列的宽度,目前只能接受以px为单位的数值,默认为150。
  • sortable :设置该列是否可以排序,默认为true。
  • search :设置该列是否可以被列为搜索条件,默认为true。
  • resizable :设置列是否可以变更尺寸,默认为true。
  • hidden :设置此列初始化时是否为隐藏状态,默认为false。
  • formatter :预设类型或用来格式化该列的自定义函数名。常用预设格式有:integer、date、currency、number等(具体参见文档 )。

三、 注意事项

1. 动态改变Add Form或者Edit Form中的select的内容,如:改变下图中的Comparator下拉中的内容。

$("#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在每次点击编辑的时候都会执行。initComparator的作用是通过ajax获取数据,然后利用$("#list_d").jqGrid('setColProp', 'Comparator', { editoptions: { value: valueString} });来设置Comparator下拉中的内容。其中valueString的格式如下’ equal to: equal to; not equal to: not equal to’。键值之间用冒号隔开,2项之间用分号隔开。注意:把recreateForm设为true,否则'setColProp'只在第一次调用时有效。

2. var rowNum = parseInt($(this).getGridParam("records"), 10); 得到数据条数。

3. jQuery("#list_d").clearGridData();清空数据。

4. jQuery("#list").getCell(ids,"Key");获取第ids行的key列。

5. $("#list").jqGrid('setSelection', "1");选中第一行。放在loadComplete:中在gird加载完成的时候自动选中第一行。loadComplete:function(data){$("#list").jqGrid('setSelection', "1");

}

6. 对于像1中的可编辑的字段,可以设定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');