<body>
{time()}
{php}<?php
//php必须和标签在同一行
echo date('Y-m-d H:i:s');
?>{/php}
系统 我是搜索页<br>
博客网址:{$host}<br>
博客标题:{$name}<br>
博客副标题:{$subname}<br>
主题名称:{$theme}<br>
样式名称:{$style}<br>
版权说明:{$copyright}<br>
Z-BlogPHP 版本号:{$version}<br>
Z-BlogPHP 版本信息:{$zblogphp}<br>
Z-BlogPHP 链接(长):{$zblogphphtml}<br>
Z-BlogPHP 链接(短):{$zblogphpabbrhtml}<br>
网站语言:{$language}<br>
页面头部变量:{$header}<br>
页面尾部变量:{$footer}<br>
页面类型:{$type}<br>
当前页面页码:{$page}<br>
社会化评论区:{$socialcomment}<br>
cookie的路径:{$cookiespath}<br>
网站目录物理路径:{$path}<br>
<br>
<br>
module-by-name 模块的一些信息<br>
导航栏:<br>
内部ID:{$modules["navbar"].ID}<br>
模块名称:{$modules["navbar"].Name}<br>
文件名:{$modules["navbar"].FileName}<br>
模块内容:{$modules["navbar"].Content}<br>
htmlID:{$modules["navbar"].HtmlID}<br>
模块类型:{$modules["navbar"].Type}<br>
ul类型模块显示的最大列数:{$modules["navbar"].MaxLi}<br>
模块属性 system=系统模块,theme=主题模块,plugin=插件模块:{$modules["navbar"].Source}<br>
是否隐藏标题:{$modules["navbar"].IsHideTitle}<br>
<br>
{if $pagebar}
分页<br>
分页长度:{$pagebar.PageBarCount}<br>
每页显示文章数量:{$pagebar.PageCount}<br>
总页码数:{$pagebar.PageAll}<br>
当前页码:{$pagebar.PageNow}<br>
起始页码:{$pagebar.PageFirst}<br>
页尾页码:{$pagebar.PageLast}<br>
上一页ID:{$pagebar.PagePrevious}<br>
下一页ID:{$pagebar.PageNext}<br>
上一页Url:{$pagebar.prevbutton}<br>
下一页Url:{$pagebar.nextbutton}<br>
{/if}
{if $type == 'author'}
<br>
用户页? author user article.Author<br>
用户页面链接:{$author.Url}<br>
用户名:{$author.Name}<br>
用户别名:{$author.Alias}<br>
用户静态名:{$author.StaticName}<br>
用户级别:{$author.Level}<br>
用户级别名:{$author.LevelName}<br>
用户邮箱:{$author.Email}<br>
用户主页:{$author.HomePage}<br>
用户摘要:{$author.Intro}<br>
用户头像:{$author.Avatar}<br>
用户股发表文章数量:{$author.Articles}<br>
用户创建页面数:{$author.Pages}<br>
用户发表评论数:{$author.Comments}<br>
用户上传文件数:{$author.Uploads}<br>
{/if}
{if $type == 'tag'}
<br>
标签页?:<br>
标签名:{$tag.Name}<br>
标签链接:{$tag.Url}<br>
标签下文章数:{$tag.Count}<br>
{/if}
{if $type == 'category'}
<br>
分类页? category article.Category<br>
分类ID:{$category.ID}<br>
分类名称:{$category.Name}<br>
分类别名:{$category.Alias}<br>
分类链接:{$category.Url}<br>
分类文章数量:{$category.Count}<br>
分类摘要:{$category.Intro}<br>
分类序号:{$category.Order}<br>
分类层级:{$category.Level}<br>
分类的顶级ID:{$category.RootID}<br>
分类的上级ID:{$category.ParentID}<br>
分类的上一级类实例:{$category.Parent}<br>
分类所用模板:{$category.Template}<br>
分类下文章所用模板:{$category.LogTemplate}<br>
分类扩展数据:{$category}<br>
子分类实例数组:{if $category.SubCategorys == null} 子分类为空{/if}<br>
{/if}
<br>
模块 module-content<br>
导航栏:{module:navbar}<br>
日历:{module:calendar}<br>
控制面板:{module:controlpanel}<br>
网站分类:{module:catalog}<br>
搜索:{module:searchpanel}<br>
最新留言:{module:comments}<br>
文章归档:{module:archives}<br>
站点信息:{module:statistics}<br>
网站收藏:{module:favorite}<br>
友情链接:{module:link}<br>
图标汇集:{module:misc}<br>
作者列表:{module:authors}<br>
最近发表:{module:previous}<br>
标签列表:{module:tags}<br>
文章页<br> 搜索结果页 列表 分类列表页
文章ID:{$article.ID}<br>
文章标题:{$article.Title}<br>
文章别名:{$article.Alias}<br>
文章别名或标题:{$article.AliasFirst}<br>
文章链接:{$article.Url}<br>
文章是否置顶:{$article.IsTop}<br>
文章置顶类型:{$article.TopType}<br>
文章摘要:{$article.Intro}<br>
文章正文:{$article.Content}<br>
文章第一张图片:{if $article->AllImages}{$article.AllImages[0]}{/if}<br>
文章图片计数:{$article.ImageCount}<br>
文章第一张图片的缩略图:{if $article->AllImages}{$article.Thumbs(640, 360, 1, false)[0]}{/if}<br>
文章状态(数字):{$article.Status}<br>
文章状态(名):{$article.StatusName}<br>
是否禁止评论:{$article.IsLock}<br>
文章评论数:{$article.CommNums}<br>
文章浏览数:{$article.ViewNums}<br>
文章发布时间:{$article.Time("PostTime","Y-m-d H:i:s")}<br>
文章创建时间:{$article.Time("CreateTime","Y-m-d H:i:s")}<br>
文章更新时间:{$article.Time("UpdateTime","Y-m-d H:i:s")}<br>
文章分类数据:{$article.Category}<br>
文章作者数据:$article {"ID":"15","CateID":"1","AuthorID":"1","Tag":"","Status":"0","Type":"0","Alias":"","IsTop":"0","IsLock":false,"Title": Intro Content<br>
文章标签数组:<br>
第一个标签对象:{$article.FirstTag}<br>
文章标签计数:{$article.TagsCount}<br>
逗号分隔的文章标签:{$article.TagsName}<br>
文章类型:{$article.Type}<br>
文章类型:{$article.TypeName} ARTICLE 为普通文章,PAGE 为普通页面。<br>
<br>
{foreach $comments as $key => $comment}
{foreach $comment.Comments as $comment}
有子评论
{/foreach}
评论<br>
评论ID:{$comment.ID}<br>
评论楼号:{$comment.FloorID}<br>
评论层级:{$comment.Level}<br>
评论父ID:{$comment.ParentID}<br>
评论根ID:{$comment.RootID}<br>
评论所属文章/页面ID:{$comment.LogID}<br>
评论作者:{$comment.Author.Name}<br>
评论作者网址:{$comment.Author.HomePage}<br>
评论作者邮箱:{$comment.Author.Email}<br>
评论作者头像地址:{$comment.Author.Avatar}<br>
评论所属文章的链接:{$comment.Post.Url}<br>
评论所属文章的标题:{$comment.Post.Title}<br>
评论正文:{$comment.Content}<br>
评论者IP:{$comment.IP}<br>
评论者客户端信息:{$comment.Agent}<br>
评论发布时间:{$comment}<br>
{/foreach}
$backtrace = debug_backtrace();
// 移除当前函数调用的层级
echo "调用栈信息:\n";
foreach ($backtrace as $level => $call) {
$className = (isset($call['class'])) ? $call['class'] : '';
$methodName = $call['function'];
$fileName = $call['file'];
$lineNumber = $call['line'];
echo "层级 {$level}:\n";
echo " 类名:{$className}\n";
echo " 方法名:{$methodName}\n";
echo " 文件名:{$fileName}\n";
echo " 行号:{$lineNumber}\n";
echo "<br>";
}
看门狗是一种能够在程序正常执行出现异常时自动重置程序的功能
在需要长期执行的代码中代码总是不可避免的因为某些原因导致执行异常,如果不能从异常中恢复正常执行过程可能会导致项目的停止。所以为程序代码添加上看门狗功能是很有用的。
在51单片机中,头文件并没有定义这个寄存器地址,不过查看单片机手册可以发现是有这个功能的(在STM32单片机中可以直接使用),看门狗的寄存器地址是 0xe1,在代码中直接定义即可
sfr WDT_CONTR = 0xe1;
这个寄存器使用0-5位共6位可以设置
其中
第6位是看门狗是否开启位,为1打开看门狗
第5位是看门狗清零位,设置为1表示重新计数,硬件会自动将此位清零
第4位是看门狗执行环境,设置为1表示在空闲模式计数,0为在空闲模式不计数
第1-3位是看门狗的定时器预分配值,也就是看门狗重置的时长,超过这个时间没有重置看门狗的寄存器就会直接导致程序被重置
以下是12M晶振下的溢出时间
000 = 2分频 = 65.5毫秒
001 = 4分频 = 131毫秒
010 = 8分频 = 262.1毫秒
011 = 16分频 = 524.2毫秒
100 = 32分频 = 1.0485秒
101 = 64分频 = 2.0971秒
110 = 128分频 = 4.1943秒
111 = 256分频 = 8.3886秒
计算公式 = (12 X 预分频 X 32768)/12000000
所以这里设置为 0x111110 = 0x3e;
表示开启看门狗,设置为重新计数,设置为在空闲模式计数,预分频110=大概4秒溢出时间
代码如下:
#include <reg52.h>
//看门狗的寄存器地址
sfr WDT_CONTR = 0xe1;
//LED灯展示效果
#define LED P2
unsigned char P32_STATUS = 1; //外部中断1的状态
sbit K1 = P1^4;
sbit K2 = P1^5;
sbit K3 = P1^6;
sbit K4 = P1^7;
sbit K5 = P3^5;
void delay10ms(unsigned int);
void main(void){
unsigned char num = 0;
WDT_CONTR = 0x3e;
IT0 = 1;
EX0 = 1; //允许中断
IT1 = 1;
EX1 = 1; //允许中断
EA = 1; //开启总中断
//开机闪烁
P2 = 0xff;
delay10ms(100);
P2 = 0xaa;
delay10ms(100);
P2 = 0x55;
delay10ms(100);
while(1){
//如果看门狗没有起效,将在这里死循环
P2 = num;
num++;
delay10ms(10);
WDT_CONTR = 0x3e;//重置看门狗计数值,防止程序被重置
}
}
void delay10ms(unsigned int c)
{
unsigned char a,b;
for(;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
使用普通IO口来模拟串口通信,串口通信中使用两根信号线来进行发送和接收,RXD获取数据TXD发送数据,两个设备的RXD和TXD要交叉连接
然后发送频需要根据波特率来设置,比如9600的波特率在11.0592Mhz晶振的单片机中的发送延时就是104us
也就是发送1比特为需要的高电平时间,这个延时需要比较精确否则就有可能通信失败
USART串口协议如下,开始是空闲信号线高电平变为低电平且保存104us(以9600波特率为例)为开始信号,之后依次发送每一位比特的高低电平,发送是以低电平开始发送,直到发送完8字节,然后如果没有奇偶校验等的话就是结束信号,将电平保存高电平大于104us即为结束信号
接收和发送情况是一样的,接收的数据是从低字节到高字节顺序获取每一位
怎么判断接收完成?因为结束标志完毕之后如果继续发送数据,电平会被拉低,所以只需要获取到结束标志之后循环判断一定的时间(大于104us,比如取110us),如果在次判断是低电平说明数据还有需要继续接收,否则就是接收完毕。
代码比较简单,一般去读串口数据都是取延时中值的结果,(比如104us的一半时间52us,电平为低时延时52us,之后间隔104us)这样比较准确,也可以使用中断的方式来获取。
关于缓存数组,因为串口数据的发送时间间隔很短,没有多余的时间用于对数据的处理,所以一般都是先将数据放入到一个缓存中,待数据接收完毕之后再处理,否则可能会导致不能及时获取数据导致数据丢失。
代码如下,经过测试可以完成发送和接收:
#include <reg52.h>
#include <intrins.h>
sbit RXD2 = P2^2;
sbit TXD2 = P2^3;
unsigned char str[21] = "http://192.168.0.112/";
unsigned char buffer[50] = {0}; //接收缓存
int getbuffernum,putbuffernum,num;
void delay(void);
void delay2(void);
void Delay10ms(unsigned int c);
void putdata(unsigned char str);
void getdata(void);
void main(){
unsigned char i;
while(1){
getbuffernum = 0;
//读取串口数据
if(RXD2 == 0){
int maxnum = 1000;
while(maxnum--){
if(RXD2 == 0){
getdata();
maxnum = 1000;
}
};
}else{
if(buffer[0] != 0){
for(i=0;i<49;i++){
if(buffer[i] != 0){
putdata(buffer[i]);
buffer[i] = 0;
}else{
break;
}
}
getbuffernum = 0;
putdata(0x0d);
putdata(0x0a);
}
num = 0;
}
}
}
void getdata(){
unsigned int i;
unsigned char str = 0x0;
if(RXD2 == 0){//起始信号
num = 0;
delay2();
if(RXD2 == 0){
//接收数据
for(i=0;i<8;i++){
str >>= 1;
delay();
if(RXD2 == 1){
str |= 0x80;
}
}
}
delay();
buffer[getbuffernum] = str;
getbuffernum++;
}else{
num++;
}
}
void putdata(unsigned char str){
TXD2 = 0;
delay();
TXD2 = str & 0x1;
delay();
str >>= 1;
TXD2 = str & 0x1;
delay();
str >>= 1;
TXD2 = str & 0x1;
delay();
str >>= 1;
TXD2 = str & 0x1;
delay();
str >>= 1;
TXD2 = str & 0x1;
delay();
str >>= 1;
TXD2 = str & 0x1;
delay();
str >>= 1;
TXD2 = str & 0x1;
delay();
str >>= 1;
TXD2 = str & 0x1;
delay();
TXD2 = 1;
delay();
}
//104us 9600波特率是通过计算得出来的 num为7 表示 104us 误差 0.05us
void delay(){
//i=134 2400 (415us)通过 i=67 4800 (208us)通过 i=32 9600 (104us)通过
unsigned char i;
for(i=0;i<134;i++){}
}
void delay2(){
unsigned char i;
for(i=0;i<67;i++){}
}
////误差 0us
void Delay10ms(unsigned int c){
unsigned char a,b;
for(;c>0;c--){
for(b=38;b>0;b--){
for(a=130;a>0;a--){
}
}
}
}
$dom = new DOMDocument();
// 加载 HTML 字符串
// 注意:这里我们使用 loadHTML 而不是 load,因为 loadHTML 是用来加载 HTML 字符串的
libxml_use_internal_errors(true); // 忽略警告,如 "Tag html invalid"
$dom->loadHTML('<?xml encoding="UTF-8">' . $html); // 添加 XML 声明以修复可能的编码问题
//$dom->loadHTML($html);
$dom->formatOutput = true; // 使输出的 HTML 格式化
libxml_clear_errors(); // 清除错误
// 输出整个 DOM 树(可选)
// 递归函数来遍历DOM树并打印节点信息
function printNodeInfo($node, $indent = '') {
// 打印节点名称和属性值
//echo $indent . $node->nodeName . "\n";
if ($node->hasAttributes()){
foreach ($node->attributes as $attr) {
// echo $indent . ' ' . 'Attribute: ' . $attr->name . ' = ' . $attr->value . "\n";
//尝试修改当前数据内容
if($attr->name == 'name' and $attr->value == '搜索框'){
$node->setAttribute('placeholder', '哈哈哈');
// 获取父节点
$parentNode = $node->parentNode;
$parentNode->setAttribute('action', '新的父节点属性值');
}
}
}
// 如果节点有子节点,递归遍历它们
if ($node->hasChildNodes()) {
foreach ($node->childNodes as $childNode) {
if ($childNode->nodeType === XML_ELEMENT_NODE) {
printNodeInfo($childNode, $indent . ' '); // 增加缩进以表示层级关系
}
}
}
}
//从根节点开始打印
printNodeInfo($dom->documentElement);
$html = $dom->saveHTML();
文件结构
screenshot.png [必需]缩略图 300*240像素, 横向;
theme.xml [必需]自述文件;
style/*.css [必需]
main.php 应用内置管理页
include.php 应用嵌入页
include/ 主题自带模块 {module:abc} 这个暂时用不到,在主题中直接调用也会出错
script/ js文件
template/ 主题文件6个文件
index.php 首页及列表页
single.php 文章页(单页)
search.php 搜索结果页,不存在时使用index.php
header.php 公共头部文件
footer.php 公共尾部文件
404.php 建议设置
搜索页和单页和首页布局差不多,只是内容的布局和加载的模块不一样
如果请求使用 method:'POST', 请求的话,微信小程序使用
请求参数默认在 Request Payload 中,这时在php后端通过 $_POST 获取数据时获取不到的
这是可以通过在小程序中添加
header: { 'content-type': 'application/x-www-form-urlencoded'},
接受到数据,也可以直接在php后端中使用
$data = file_get_contents("php://input");
直接获取到数据,可以看出能成功获取到 json 数据,然后通过 json_decode 得到数组形式的请求内容