"飘云" 发布的文章

jeecms作为国内Java开源内容管理系统的龙头老大(感谢jeecms研发小组的辛苦劳作),技术架构也是比较成熟的,当然涉及到的技术也就相对多一些

看看jeecms内容管理系统使用了哪些技术

web开发当然离不开最基本的三大元素html、javascript和css,jeecms也不列外,用到的javascript库是jQuery
为了可以生成真正的静态html页面,使用了FreeMarker模板技术,这样方便我们自定义模板
MVC框架使用的SpringMVC,没有使用传统的Struts作为web开发的框架
开源版使用MySQL数据库,网上资料丰富,易于学习,数据库ORM框架使用的是Hibernate,数据库连接池是c3p0,同样也算是比较流行的框架
加入了验证码模块防止机器程序制造大量的垃圾,数据验证码使用的是java开源验证码jcaptcha,不过版本相对较老
WYSWYG(所见即所得)编辑器集成的是ckeditor,国外开源富文本编辑器
时间日期控件使用的是My97DatePicker,一款很不错的的国产日期控件
上传组件使用了swfupload和commons-fileupload
缓存使用Ehcache,定时器使用的是quartz,功能很强大的,都属于美国Terracotta公司的开源组件
jeecms用到的全文搜索组件是Apache的Lucene,还配合使用了java语言开发的轻量级的中文分词工具包IK Analyzer
还有一些其他的工具包,如log4j,dom4j,dwr, json,htmlparser….

jeecms整体项目结构图
20140619213903

jeecms项目结构:
src-1:java源代码的目录
r-2:web前端用到的资源,比如js, css和img
res-3:管理端用到的资源,比如js, css和img
thirdparty-4:这里放的是第三方的一些插件,比如上面提到的ckeditor,swfupload和My97DatePicker
u-5: v5版本演示用到的图片,可删,对系统没得影响
common-6:这里面的是一些公共页面,比如用于显示上传情况,信息提示
config-7:系统的关键配置文件都在这儿了,比如修改数据库连接就需要在这里改
error-8:放一些服务器端错误提示的页面,比如403错误、程序异常等
ftl-9:管理端用到的freemarker模板文件
ipseek-10:放的是IP库,用于分析IP归属地
jeecms_sys-11:管理端HTML模板文件
langauges-12:国际化语言配置文件
lib-13:所有依赖的包都放这儿
lucene-14:这个目录是lucene生成的一些所以文件
t-15:包含前端模板HTML文件

上面没有介绍到cache目录是缓存生成的文件,classes目录是编译后class文件的默认路径。实际运行中如果把class文件都打成了jar包放到lib目录下,那这个文件夹也可以删了

注:这些文件夹的名字是不可以乱改的,改了的话,对应的源代码有些地方也要改,后面会更新相应的介绍

最近想自己写一些标签,看了一下JEECMS,感觉有些标签还是很值得学习的。

1、图片新闻:可以实现类似于flash切换图片的那种效果

效果:
1334107074_5467

代码:

[@cms.ArtiList chnlId='' attr='3' count='6' sysContent='3-1' titLen='35' flashWidth='507' flashHeight='338'/]

其中sysContent='3-1'指的就是以flash方式显示图片新闻。

类似的内容样式还有:
1-1:普通标题列表
1-2:图文列表
2-1:标题列表翻滚
2-2:图文列表翻滚
3-1:焦点图
2、新闻列表:

代码:

[@cms.ArtiList chnlId='14' count='7' sysContent='1-1' titLen='36' lineHeight='3' dateFormat='4' datePosition='2' headMark='3' target='1'/]

具体参数太多了,还是拷贝一下吧:

属性名称 属性说明 默认值 可选值
chnlId 栏目ID,栏目页中可不设置,系统会自动获取当前栏目ID 当前栏目ID 空:显示全站文章列表; 栏目ID:指定栏目文章
attr 文章属性ID 1:普通   2:图文3:焦点   4:头条

5:滚动
sysContent 列表显示方式 1-1 1-1:普通标题列表1-2:图文列表

2-1:标题列表翻滚

2-2:图文列表翻滚

3-1:焦点图
orderBy 排序方式 0 0:发布时间降序;1:发布时间升序;

2:固顶降序;

3:置顶降序;

4:日点击降序;

5:周点击降序;

6:月点击降序;

7:季点击降序;

8:年点击降序;

9:总点击降序
recommend 是否推荐 0 0:所有文章1:推荐文章
titLen 标题长度 20 自定义
target 链接打开目标 0 0:原窗口打开1:新窗口打开
headMark 文章标题图标 0 0:无图标1:黑色小圆点

2:红色小圆点

3:蓝色单箭头

4:蓝色双箭头

自定义图标:填写图标路
lineHeight 文章列表每行的行高 自定义
bottomLine 每行标题下是否带下划分隔线 0 0:无分隔线1:默认分隔线

自定义样式:css中定义的样式名称
ctgForm 文章类别形式 0 0:不显示文章类别1:显示栏目类别

2:显示站点名称
ctgClass 文章类别的css-class 自定义css样式的class名
dateFormat 文章发布日期显示格式 0 0:不显示日期1:”年-月-日 时-分-秒” 格式

2:”年-月-日” 格式

3:”月-日 时-分” 格式

4:”月-日” 格式
datePosition 日期排列位置 1 1:紧跟标题之后2:右对齐

3:左对齐
isPage 是否显示分页 0 0:否;1:是
count 每页列表显示数量 20 自定义
cssStyle 连接的样式 自定义
仅当sysContent='1-2'(图文列表)时,以下标签属性才有效
picWidth 按百分比显示图片宽度 25(即每个图片占总宽度的25%,每行可放四张图片) 自定义
picHeight 每行图片显示高度 110 自定义
仅当sysContent='3-×'(焦点图)时,以下标签属性才有效
flashWidth 焦点图宽度 296(px) 自定义
flashHeight 焦点图总高度 200(px) 自定义
textHeight 焦点图文本高度 20(px) 自定义
仅当sysContent='2-×'(特效显示)时,以下标签属性才有效
rollDisplayHeight 显示区高度 28 自定义
rollLineHeight 行高 28 自定义
rollCols 列数(一行中包含几列) 1 自定义
rollSpeed 滚动速度,值越小越快,最小为1 1 自定义
isSleep 是否停顿 1 0:不停顿;1:停顿
rollSleepTime 停顿时间,值越大停顿越久 50 自定义
rollCount 一次滚动的行数 1 自定义
rollSpan 一次滚动的像素 1 自定义
其它高级标签属性(用于用户个性设置)
searchKey 在标题、tags和描述中搜索指定关键字的文章列表,用于搜索页模板 自定义关键字
style 标签内部样式,如果指定sysContent或userContent,则该项无效 1 1:普通列表
sysTpl 指定系统模板 1 自定义
sysContent 系统内容样式 0 自定义
userContent 用户内容样式,当sysContent=1时有效 自定义
sysPage 系统分页样式 0 自定义
userPage 用户分页样式,当sysPage=1时有效 自定义
upSolution 指定其它模板方案样式 自定义
upWebRes 指定其它站点样式 自定义
pageClass 分页栏css样式的class名称 自定义
pageStyle 分页栏css自定义style样式 自定义

3、显示栏目名称:

[@cms.ChnlList hasContent='1' inner='1';c]
<div class="news_list_m"><a href="${c.url}">${c.name}</a></div>
[/@cms.ChnlList]

4、实现图片滚动效果(类似跑马灯):

这个还真是费了些周折,本来JEECMS文档中说支持这种滚动效果,可试了半天就是不“滚动”,我试的代码:

[@cms.ArtiList chnlId='' attr='3' sysContent='2-2']

后来没办法,自己写了一个:

<div id="expert" style="width: 507px; height: 130px; color: #ffffff; overflow: hidden">
<table border="0" cellpadding="0" align="left" cellspace="0">
<tbody>
<tr>
<td align="center"><img alt="" width="170" height="130" src="${root}/fwjn/article/img/tu7.jpg" /></td>
<td align="center">
<div id="demo" style="width: 337px; height: 80px; color: #ffffff; overflow: hidden;valign:center">
<table border="0" cellpadding="0" align="left" cellspace="0">
<tbody>
<tr>
<td id="demo1" valign="center">
<table border="0" cellspacing="0" cellpadding="5">
<tbody>
<tr align="center">
[@cms.ArtiList chnlId='21' attr='5' orderBy='9' inner='1';ca]
[#if ca.imgUrl?length lte 10 ]
[#else]
<td width="60"> <a target="_blank" href="${ca.url}"> <img alt="${ca.title}" width="60" height="80" src="${ca.imgUrl}"/> </a> </td>
[/#if]
[/@cms.ArtiList]
</tr>
</tbody>
</table>
</td>
<td id="demo2" valign="center"></td>
</tr>
</tbody>
</table>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<p><SCRIPT>
var speed=30
demo2.innerHTML=demo1.innerHTML
function Marquee(){
if(demo2.offsetWidth-demo.scrollLeft<=0)
demo.scrollLeft-=demo1.offsetWidth
else{
demo.scrollLeft++
}
}
var MyMar=setInterval(Marquee,speed)
demo.onmouseover=function() {clearInterval(MyMar)}
demo.onmouseout=function() {MyMar=setInterval(Marquee,speed)}
</SCRIPT></p>

一、Xampps Tomcat模块使用中需要jdk支持的安装方法:

由于jdk的包真心大 180MB, 也无法压缩, 所以不可能集成在xampps环境包中, 需要后期自行连网下载.
(当然, 我是希望大家预先下载安装好.)

以下是使用过程中的截图, 基本上述说了整个流程.(注:以下截图来之Xampps官网)

01
假如你的系统中没有安装jdk组件, 控制面板会提示, 并且引向官网下载地址.下载地址见下!

02
请选择第一个java图标即可,

03

1: 选择同意协议.
2: 选择自己环境包的位数, 如32位, 64位, 是xampps的位数. 不是系统的.

04
安装即可, 基本上, 一路下一步...

05
安装过程中...

06
安装jdk后, 再回来点击图标, 功能就可以正常了.

07
模块也启动成功..

08
在核心功能中>版本信息中会有jdk版本的一些信息, 仅供参考...

二、Xampps Tomcat模块使用中完美整合mod_jk.so的安装方法:

对于Apache+Tomcat+jsp+php的整合,针对不同的Tomcat和apache的版本,稍微有些区别。

1、所需软件
JDK:jdk-8u66-windows-x64.exe
JRE:jre-8u66-windows-x64.exe

jdk的版本关系倒不是很大,不影响Apache和Tomcat的整合,配置环境变量时注意一些就行了.
下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html

mod_jk.so
apache版本对整合影响不是太大,需要注意的是整合Tomcat时加载模块(modules)时 mod_jk.so 文件的版本。 apche的版本必须与mod_jk-**.so的版本相同.主要就是不同版本使得配置麻烦,而且还没用

下载地址:
http://www.apachelounge.com/download/
http://tomcat.apache.org/download-connectors.cgi

2、mod_jk.so安装方法:
解压:mod_jk-1.2.41-win64.zip
将:mod_jk.so
复制到:
D:\xampps\apache\modules 目录

3. 环境配置

(1) 在D:\xampps\apache\conf 目录下新建文件:workers.properties, 编辑 workers.properties

workers.tomcat_home=D:\xampps\tomcat #让mod_jk模块知道Tomcat的位置
workers.java_home=D:\Java\jdk #让mod_jk模块知道jre的位置
ps=\
worker.list=ajp13 #模块版本
worker.ajp13.port=8009 #工作端口,若没占用则不用修改
worker.ajp13.host=localhost #本机,若上面的Apache主机不为localhost,作相应修改
worker.ajp13.type=ajp13 #类型
worker.ajp13.lbfactor=1 #代理数,不用修改

(2) 在D:\xampps\apache\conf目录,修改http.conf
在文件末尾加上:

LoadModule jk_module modules/mod_jk.so
JkWorkersFile "conf/workers.properties"
JkLogFile "D:/xampps/tomcat/logs/mod_jk.log"
JkLogLevel info
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkRequestLogFormat "%w %V %T"
JkMount /servlet/* ajp13
JkMount /*.jsp ajp13
JkMount /*.do ajp13
JkMount /*.jsp ajp13
JkMount /*.do ajp13
JkMount /*.jhtml ajp13
JkMount /*.jspx ajp13
JkMount /dbfile.svl ajp13

到此配置文件修改完毕,然后通过Xampps控制面板,重新启动apache和tomcat服务就可以了!

1. 一般的文件上传,除非文件很小.就像一个5M的文件,很可能要超过一分钟才能上传完.
但在php中,默认的该页最久执行时间为 30 秒.就是说超过30秒,该脚本就停止执行.
这就导致出现 无法打开网页的情况.这时我们可以修改 max_execution_time
在php.ini里查找:
max_execution_time

默认是30秒.改为:
max_execution_time = 0
0表示没有限制

2. 修改 post_max_size 设定 POST 数据所允许的最大大小。此设定也影响到文件上传。
php默认的post_max_size 为2M.如果 POST 数据尺寸大于 post_max_size $_POST 和 $_FILES superglobals 便会为空.
查找:
post_max_size

修改为:
post_max_size = 150M

3. 很多人都会改了第二步.但上传文件时最大仍然为 8M.
为什么呢.我们还要改一个参数upload_max_filesize 表示所上传的文件的最大大小。
查找:
upload_max_filesize

默认为8M,修改为:
upload_max_filesize = 100M

另外要说明的是,post_max_size 大于 upload_max_filesize 为佳.

Windows 10有四个基本版本:Windows 10 家庭版, Windows 10 专业版, Windows 10 企业版, 和Windows 10 教育版(这是Windows家族的新成员)。以下表格列出了这四个版本功能上的详细区别。

Windows 10 家庭版– 供家庭用户使用
Windows 10 专业版– 供小型企业使用 在Windows 10家庭版基础上增加了域账号加入、bitlocker、企业商店等功能
Windows 10 企业版– 供中大型企业使用 在Windows 10专业版基础上增加了DirectAccess,AppLocker等高级企业功能
Windows 10 教育版– 供学校使用 (学校职员, 管理人员, 老师和学生). 其功能几乎和Windows 10企业版一模一样

核心体验:

熟悉的环境 家庭版 专业版 企业版 教育版
开始菜单定制 x x x x
Windows Defender和 Windows 防火墙 x x x x
Windows快速启动 x x x x
TPM支持 x x x x
节电模式 x x x x
Windows 更新 x x x x

小娜

对话功能 x x x x
建议功能 x x x x
提醒功能 x x x x
搜索功能 x x x x
“Hey小娜激活功能 x x x x

Windows Hello3

指纹识别 x x x x
面部识别 x x x x
企业级安全认证 x x x x

多线程工作

虚拟桌面 x x x x
Snap assist (up to 4 apps on one screen) x x x x
Snap apps across screens on different monitors x x x x

Continuum4

PC切入平板电脑模式 x x x x

全新Microsoft Edge浏览器

阅读模式 x x x x
内置ink功能 x x x x
集成小娜 x x x x

商务体验

已有功能 Home Pro Enterprise Education
设备加密 x x x x
域加入 x x x
组策略管理 x x x
Bitlocker2 x x x
企业模式的浏览器 (EMIE) x x x
Assigned Access 8.1 x x x
远程桌面 x x x
客户端Hyper-V x x x
DirectAccess x x
Windows To Go Creator x x
AppLocker x x
BranchCache x x
Start Screen Control with Group Policy x x

管理和部署

Side-loading of line of business apps x x x x
Mobile device management x 8 x x x
Ability to join Azure Active Directory, with single sign-on to cloud-hosted apps7 x x x
Business Store for Windows 108 x x x
Granular UX Control x x
Easy Upgrade from Pro to Enterprise Edition x x
Easy Upgrade from Home to Education Edition x x
安全
Microsoft Passport x x x x
Enterprise Data Protection8 x x x
Credential Guard9 x x
Device Guard9 x x

Windows 服务

Windows 更新服务 x x x x
Windows Update for Business x x x
Current Branch for Business x x x
Long Term Servicing Branch x

1、柏拉图说:
若爱,请深爱;若弃,请彻底。不要暧昧,伤人伤己。

2、柏拉图说:
人生最遗憾的,莫过于,轻易的放弃了不该放弃的,固执的坚持了不该坚持的。

3、柏拉图说:
既然爱,为什么不说出口,有些东西失去了,不会再回来。

4、柏拉图说:
有些失去是注定的,有些缘分是永远不会有结果的。爱一个人不一定会拥有,若是拥有了一个人就一定要好好的爱她。

5、柏拉图说:
我们的生活有太多的无奈,我们无法改变,也无力去改变,更糟的是,我们失去了改变的想法。

6、柏拉图说:
人生不止,寂寞不已。寂寞人生爱无休,寂寞是爱永远的主题。

7、柏拉图说:
时间会慢慢沉淀,有些人会在你的心底慢慢模糊,学会放手,你的幸福需要自己成全。

8、柏拉图说:
人生短短几十年,不要给自己留下什么遗憾。想笑就笑,想哭就哭,该爱的时候就去爱,无谓压抑自己。人生的苦闷有二:一是欲望没有被满足,二是它被满足了。

9、柏拉图说:
走在一起是缘分,一直在走是幸福。

10、柏拉图说:
我以为小鸟飞不过沧海,是因为小鸟没有飞过沧海的勇气。十年之后我发现,不是小鸟飞不过沧海,而是沧海的那一头,早已没有了等待。

近日使用“git add”出现如下错误:

$ git add .
warning: You ran 'git add' with neither '-A (--all)' or '--ignore-removal',
whose behaviour will change in Git 2.0 with respect to paths you removed.
Paths like 'inc/jquery2.1.1/jquery.min.js' that are
removed from your working tree are ignored with this version of Git.

* 'git add --ignore-removal <pathspec>', which is the current default,
ignores paths you removed from your working tree.

* 'git add --all <pathspec>' will let you also record the removals.

Run 'git status' to check the paths you removed from your working tree.

使用“git status”查看状态:

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

modified: app/js/app.js
new file: app/tpl/admin.html
new file: app/tpl/home.html
new file: inc/jquery.2.1.1/jquery.min.js
modified: index.html

Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

deleted: inc/jquery2.1.1/jquery.min.js

解决方法很简单:
$ git add -A #或 git add -all

warning: Your console font probably doesn't support Unicode. If you experience strange characters in the output, consider switching to a TrueType font such as Lucida Console!

解决办法:
$ git config --global core.autocrlf true

warning: push.default is unset; its implicit value is changing in Git 2.0 from 'matching' to 'simple'.

To squelch this message and maintain the current behavior after the default changes, use: git config --global push.default matching

To squelch this message and adopt the new behavior now, use: git config --global push.default simple

错误信息:warning: LF will be replaced by CRLF in XXXXXXXXXXXXXX.
解决办法:
$ git config --global core.autocrlf false

事实上这并不会影响你push的结果,最终push还会成功,因为这只是一个”warning“

你可以按照他说的那样运行:git config --global push.default matching 或者 git config --global push.default simple命令,以后再push就不会有警告了。
下面说一下push.default matching和push.default simple的区别:

push.default设置maching的意思是:git push 会把你本地所有分支push到名称相对应的远程主机上。这意味着可能你会在不经意间push一些你原本没打算push的分支。push.default设置成simple的意思是:git push仅仅把当前所在分支push到从当初git pull pull下来的那个对应分支上,另外,这个过程也会同时检查各个分支的名称是否相对应。

需求:
有一台windows服务器上跑着mysql的一些应用,现在需要将mysql的数据每天备份,并通过ftp上传到指定的存储服务器上
要是在linux上,shell 脚本很容易就搞定了,在windows上习惯了点鼠标,哪里来的脚本,一时还真不知道该怎么弄.baidu,google得知可以通过批处理或者vbs脚本实现.
批处理是比较简单的,毕竟dos的常用命令还是知道的

我的服务器为Win2008,项目的数据库引擎采用的是MyIsam,数量大并不大,运营到现在3个月,数据库大小160M。为了防止出现意外,数据库每天都需要备份,当然,如果每天手工备份,那就要把人烦死。所以我就写了下面的批处理文件,通过Win2008系统的计划任务,在凌晨2点开始执行批处理,备份数据库。批处理中我采用了两种方法,一种是通过mysqldump命令备份,并通过gzip压缩数据。另一种是备份物理文件,通过调用rar命令压缩数据。至今,这个数据库备份批处理文件运行近1个月,目前看来效果符合预期。

解决思路:
使用批处理文件,实现备份和上传的功能
将批处理文件加到计划任务中实现每日定时执行脚本
完整的批处理文件如下 文件名dbbk.bat

@echo off
:: this batch is to backup the db files on windows to linux server
:: created by yahoon
:: 2008.4.9

::backup the mysql db
mysqldump -uroot –pxxxx demo>c:\demo %date:~0,10%.sql

::pause
:: wait press any key to continue
:: ready to delete

::form the ftp command file
echo open 服务器ip>c:\ftpdemo.txt
echo ftp用户名>>c:\ftpdemo.txt
echo ftp密码>>c:\ftpdemo.txt
echo put c:\ demo %date:~0,10%.sql >>c:\ftpdemo.txt
echo bye>>c:\ftpdemo.txt

::transfer the file to server via ftp
ftp -i -s:c:\ftpdemo.txt

::pause

::clean the tmp files
del c:\ftpdemo.txt
del c:\ demo %date:~0,10%.sql

说明:
1. 双冒号::后面的内容为注释,不会执行
2. 两处pause语句是调试的时候用的,运行pause的结果是屏幕上显示”按任意键继续”,脚本等着用户按键才会往下执行
3. demo %date:~0,10%.sql 是备份的文件名,最后的结果是demo20080409.sql ,其中%date:~0,10%表示的是date命令输出的字符串中从第0个开始的10个字符.这点很重要,因为我在英文的OS上,执行这个脚本在备份的时候报文件名错误.这是因为当你执行date命令的时候结果是
Tue 04/08/2008
要达到demo20080409.sql这样的效果文件名就要这么写demo%date:~10,4%%date:~4,2%%date:~7,2%.sql
最后提一下写的过程中解决的一个问题
由于脚本的思路是做备份,然后通过ftp上传
所以最开始写的时候没有::form the ftp command file 这一段.而是写好一个ftpdemo.txt放在那
这就出现了一个问题,由于生成的sql文件名每天都变,这样ftp命令也得改.写死的ftpdemo.txt文件肯定就实现不了.
想出了个笨主意是批处理文件里面生成的sql文件就定义死文件名为demo.sql,这样ftpdemo.txt文件也可以写死.然后等上传以后,再通过linux的脚本通过crontab来每天改名.

下面先看一下备份mySQL数据库的批处理代码:

    @ECHO OFF  
    set path=%SystemRoot%\system32;D:\PHP\MySql\MySQL Server 5.1\bin;C:\Program Files\WinRAR  
    set mktime=%date:~0,10%  
      
    ::设置数据库名称(两个数据库,则下面的for中的tokens值为1,2。如果有三个数据库,则tokens值为:1,2,3。数据库依次为%%a,%%b,%%c....按英文字母顺序排列)  
    ::这里备份三个数据库:DB_A、DB_B、DB_C,数据库间用半角逗号分隔  
    SET dbname=DB_A,DB_B,DB_C  
      
    ::数据库管理员权限及密码  
    SET dbuser=root  
    SET dbpasswd=123456  
      
    ::mySQL所在目录  
    SET mysqldir=D:\PHP\MySql\MySQL Server 5.1  
      
    ::备份gz文件所在目录  
    SET gz_backupdir=D:\mySQL_data_bak\sql_gz_bak  
    if not exist %gz_backupdir% md %gz_backupdir%  
      
    ::备份file文件所在目录  
    SET file_backupdir=D:\mySQL_data_bak\file_bak  
    if not exist %file_backupdir% md %file_backupdir%  
      
    ::::停止WWW网页WEB服务::::或者停止Apache2 命令:net stop Apache2  
    net stop w3svc  
      
    ::::延时15秒  
    ping -n 15 127.0.1>nul  
      
    ::::开始备份mySQL数据库::::  
    @ECHO Beginning backup of %dbname%...  
    for /f "tokens=1,2,3 delims=," %%a in ("%dbname%") do (  
      if not exist %gz_backupdir%\%%a md %gz_backupdir%\%%a  
      if not exist %gz_backupdir%\%%b md %gz_backupdir%\%%b  
      if not exist %gz_backupdir%\%%c md %gz_backupdir%\%%c  
      "%mysqldir%\bin\mysqldump" -u %dbuser% -p%dbpasswd% --default-character-set=utf8 --opt %%a | gzip > %gz_backupdir%\%%a\%mktime%.sql.gz  
      "%mysqldir%\bin\mysqldump" -u %dbuser% -p%dbpasswd% --default-character-set=utf8 --opt %%b | gzip > %gz_backupdir%\%%b\%mktime%.sql.gz  
      "%mysqldir%\bin\mysqldump" -u %dbuser% -p%dbpasswd% --default-character-set=utf8 --opt %%c | gzip > %gz_backupdir%\%%c\%mktime%.sql.gz  
    )  
      
    ::停止mySQL服务,以便拷备文件  
    net stop MySQL  
      
    ::延时10秒  
    ping -n 10 127.0.1>nul  
      
    ::开始将要备份的文件打包到仓库  
    d:  
    cd "%mysqldir%\data"  
    for /f "tokens=1,2,3 delims=," %%a in ("%dbname%") do (  
      if not exist %file_backupdir%\%%a md %file_backupdir%\%%a  
      if not exist %file_backupdir%\%%b md %file_backupdir%\%%b  
      if not exist %file_backupdir%\%%c md %file_backupdir%\%%c  
      @rar a %file_backupdir%\%%a\%mktime%.rar %%a  
      @rar a %file_backupdir%\%%b\%mktime%.rar %%b  
      @rar a %file_backupdir%\%%c\%mktime%.rar %%c  
    )  
      
    ::::启动MySQL::::  
    net start MySQL  
      
    ::::启动IIS::::如果WEB服务器是Apache,则去掉下面一行,使用: net start Apache2  
    net start w3svc  
      
    exit

对于上面的内容,做以下几点补充说明

1、由于采用两种方式备份,为了不混淆,所以以mysqldump方式备份的,由于通过gzip压缩,所以后缀名为.gz,这种文件我保存在D:\mySQL_data_bak目录下的sql_gz_bak目录下。以物理备份文件方式的,由于通过rar压缩,后缀名为.rar,这种文件我保存在D:\mySQL_data_bak目录下的file_bak目录下。备份的文件名是变量mktime决定的,mktime=%date:~0,10%,意思是把当前时间从位置0开始,截取10个字符,那么%data%为:2012-08-31 星期五 取得的结果就为:2012-08-31

2、设置备份数据库名称。上面的例子中备份了三个数据库。分别为DB_A、DB_B、DB_C,这个根据你实际情况备份你需要的数据库了。这里要注意的是,由于这在里统一配置要配备的数据库,那么在下面要通过批处理的for命令来遍历,依次读取需要备份的数据库名称。所以,如果你备份的数据库恰好不是3个,那么你要改动上面的代码。

备份一个数据库的情况:

    省略...  
    SET dbname=DB_A  
    省略...  
    ::::开始备份mySQL数据库::::  
    @ECHO Beginning backup of %dbname%...  
    for /f "tokens=1 delims=," %%a in ("%dbname%") do (  
      if not exist %gz_backupdir%\%%a md %gz_backupdir%\%%a  
      "%mysqldir%\bin\mysqldump" -u %dbuser% -p%dbpasswd% --default-character-set=utf8 --opt %%a | gzip > %gz_backupdir%\%%a\%mktime%.sql.gz  
    )  
    省略...  
    for /f "tokens=1 delims=," %%a in ("%dbname%") do (  
      if not exist %file_backupdir%\%%a md %file_backupdir%\%%a  
      @rar a %file_backupdir%\%%a\%mktime%.rar %%a  
    )  
    省略...

备份两个数据库的情况:

    省略...  
    SET dbname=DB_A,DB_B  
    省略...  
    ::::开始备份mySQL数据库::::  
    @ECHO Beginning backup of %dbname%...  
    for /f "tokens=1,2 delims=," %%a in ("%dbname%") do (  
      if not exist %gz_backupdir%\%%a md %gz_backupdir%\%%a  
      if not exist %gz_backupdir%\%%b md %gz_backupdir%\%%b  
      "%mysqldir%\bin\mysqldump" -u %dbuser% -p%dbpasswd% --default-character-set=utf8 --opt %%a | gzip > %gz_backupdir%\%%a\%mktime%.sql.gz  
      "%mysqldir%\bin\mysqldump" -u %dbuser% -p%dbpasswd% --default-character-set=utf8 --opt %%b | gzip > %gz_backupdir%\%%b\%mktime%.sql.gz  
    )  
    省略...  
    for /f "tokens=1,2 delims=," %%a in ("%dbname%") do (  
      if not exist %file_backupdir%\%%a md %file_backupdir%\%%a  
      if not exist %file_backupdir%\%%b md %file_backupdir%\%%b  
      @rar a %file_backupdir%\%%a\%mktime%.rar %%a  
      @rar a %file_backupdir%\%%b\%mktime%.rar %%b  
    )  
    省略...

3、在备份数据库前停止WEB服务,是为了确保备份数据库的一致性。
4、其它参数配置,根据实际情况改动。
5、通过gzip压缩,需要将gzip.exe放到mySQL目录下的bin目录中。

还原数据库

由于备份时采用两种方式备份数据库,所以还原数据库时,应用两种方法分开还原。所以还原数据库的批处理命令为两个批处理文件。

通过SQL文件(GZ)还原.bat

    @ECHO OFF  
    ::更改数据库名称  
    SET dbname=DB_A  
      
    ::更改欲还原的数据库备份文件  
    SET filename=xxxx-xx-xx.sql.gz  
      
    set path=%SystemRoot%\system32;D:\PHP\MySql\MySQL Server 5.1\bin  
      
    ::::停止WWW网页WEB服务::::或者停止Apache2 命令:net stop Apache2  
    net stop w3svc  
      
    ::::延时15秒  
    ping -n 15 127.0.1>nul  
      
    ::数据库管理员权限及密码  
    SET dbuser=root  
    SET dbpasswd=123456  
      
    ::要还原的gzip文件路径  
    SET filename=D:\mySQL_data_bak\sql_gz_bak\%dbname%\%filename%  
      
    @ECHO Beginning restore of %dbname%...  
    gunzip < %filename% | mysql -u %dbuser% -p%dbpasswd% %dbname%  
      
    ::::启动IIS::::如果WEB服务器是Apache,则去掉下面一行,使用: net start Apache2  
    net start w3svc

通过备份文件(RAR)还原.bat

    @ECHO OFF  
    set path=%SystemRoot%\system32;D:\PHP\MySql\MySQL Server 5.1\bin;C:\Program Files\WinRAR  
    set mktime=%date:~0,10%  
      
    ::设置数据库名称  
    SET dbname=DB_A  
      
    ::设置欲还原的压缩文件包文件名  
    SET filename=xxxx-xx-xx.rar  
      
    ::mySQL所在目录  
    SET mysqldir=D:\PHP\MySql\MySQL Server 5.1  
      
    ::备份的file文件所在目录  
    SET file_backupdir=D:\mySQL_data_bak\file_bak\%dbname%  
      
    if not exist "%mysqldir%\data\%dbname%" md "%mysqldir%\data\%dbname%"  
      
    ::::停止WWW网页WEB服务::::或者停止Apache2 命令:net stop Apache2  
    net stop w3svc  
      
    ::::延时15秒  
    ping -n 15 127.0.1>nul  
      
    ::停止mySQL服务,以便拷备文件  
    net stop MySQL  
      
    ::延时10秒  
    ping -n 10 127.0.1>nul  
      
    ::开始将要备份的文件打包到仓库  
    cd /d "%mysqldir%\data"  
    :: e表示解压 -o+ 表示替换原有文件  
    rar e -o+ %file_backupdir%\%filename% "%mysqldir%\data\%dbname%"  
      
    ::::启动MySQL::::  
    net start MySQL  
      
    ::::启动IIS::::如果WEB服务器是Apache,则去掉下面一行,使用: net start Apache2  
    net start w3svc  
    exit  

 

@echo on 

REM------------------------backup bugdb which is InnoDB-----------------------------   
del C:/backup/website/bugdb_*.sql   
cd F:/usr/wamp/mysql/bin   
set year=%date:~0,4%   
set month=%date:~5,2%   
set day=%date:~8,2%   
set filename=piaoyun_%year%%month%%day%.sql   
mysqldump.exe piaoyun -uroot -p123456 > F:/backup/piaoyun.cc/%filename%   
@echo off

mysqldump命令用法

MySQL数据库的备份工具有很多,不过这里介绍的是一个小巧好用的mysqldump工具,位于数据库目录下bin/mysqldump.exe.这几天用phpMyAdmin备份数据库的时候出现乱码,反复在本地跟远程的Dreamhost空间上测试了数据库,但是还是导出数据库会出现乱码,应该是phpMyAdmin出现的问题,数据库本身没有问题.扯远咯,呵呵.我Google到的关于mysqldump工具的相关用法.
如果主机主机支持 Shell 的话,可以 SSH 登陆主机,执行如下的命令实现备份与恢复,适合在Dreamhost,Bluehost等空间上.

导出数据库:
mysqldump -h HOSTNAME -uUSERNAME -p DBNAME > exported_db.sql

导入数据库:
mysql -h HOSTNAME -uUSERNAME -p DBNAME < exported_db.sql

HOSTNAME 是数据库主机名,USERNAME 和 DBNAME 分别是登陆 ID 和数据库名,导出的数据库存放在 exported_db.sql 文件里。 巧克力工厂(Beta5):Wordpress 超大数据库的导入.

使用mysqldump:
(mysqldump命令位于mysql/bin/目录中) //要专到mysql/bin/目录中才能使用,直接cmd运行命令窗口使用不了,专到数据库所在的mysql/bin/目录中使用.

基本用法是: shell> mysqldump [OPTIONS] database [tables]

如果你不给定任何表,整个数据库将被导出。

通过执行mysqldump –help,你能得到你mysqldump的版本支持的选项表。

注意,如果你运行mysqldump没有–quick或–opt选项,mysqldump将在导出结果前装载整个结果集到内存中,如果你正在导出一个大的数据库,这将可能是一个问题。

几个常用用例:

1.导出整个数据库
mysqldump -u 用户名 -p 数据库名 > 导出的文件名
mysqldump -u root -p dataname >dataname.sql
这个时候会提示要你输入root用户名的密码,输入密码后dataname数据库就成功备份在mysql/bin/目录中.

2.导出一个表
mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名
mysqldump -u root -p dataname users> dataname_users.sql

3.导出一个数据库结构
mysqldump -u wcnc -p -d –add-drop-table smgp_apps_wcnc >d:/wcnc_db.sql
-d 没有数据 –add-drop-table 在每个create语句之前增加一个drop table

4.导入数据库
常用source 命令
进入mysql数据库控制台,
如mysql -u root -p

mysql>use 数据库

然后使用source命令,后面参数为脚本文件(如这里用到的.sql)
mysql>source d:/wcnc_db.sql

mysqldump支持下列选项:
–add-locks
在每个表导出之前增加LOCK TABLES并且之后UNLOCK TABLE。(为了使得更快地插入到MySQL)。

–add-drop-table
在每个create语句之前增加一个drop table。

–allow-keywords
允许创建是关键词的列名字。这由表名前缀于每个列名做到。

-c, –complete-insert
使用完整的insert语句(用列名字)。

-C, –compress
如果客户和服务器均支持压缩,压缩两者间所有的信息。

–delayed
用INSERT DELAYED命令插入行。

-e, –extended-insert
使用全新多行INSERT语法。(给出更紧缩并且更快的插入语句)

-#, –debug[=option_string]
跟踪程序的使用(为了调试)。

–help
显示一条帮助消息并且退出。

–fields-terminated-by=…

–fields-enclosed-by=…

–fields-optionally-enclosed-by=…

–fields-escaped-by=…

–fields-terminated-by=…

这些选择与-T选择一起使用,并且有相应的LOAD DATA INFILE子句相同的含义。
LOAD DATA INFILE语法。

-F, –flush-logs
在开始导出前,洗掉在MySQL服务器中的日志文件。

-f, –force,
即使我们在一个表导出期间得到一个SQL错误,继续。

-h, –host=..
从命名的主机上的MySQL服务器导出数据。缺省主机是localhost。

-l, –lock-tables.
为开始导出锁定所有表。

-t, –no-create-info
不写入表创建信息(CREATE TABLE语句)

-d, –no-data
不写入表的任何行信息。如果你只想得到一个表的结构的导出,这是很有用的!

–opt
同–quick –add-drop-table –add-locks –extended-insert –lock-tables。
应该给你为读入一个MySQL服务器的尽可能最快的导出。

-pyour_pass, –password[=your_pass]
与服务器连接时使用的口令。如果你不指定“=your_pass”部分,mysqldump需要来自终端的口令。

-P port_num, –port=port_num
与一台主机连接时使用的TCP/IP端口号。(这用于连接到localhost以外的主机,因为它使用 Unix套接字。)

-q, –quick
不缓冲查询,直接导出至stdout;使用mysql_use_result()做它。

-S /path/to/socket, –socket=/path/to/socket
与localhost连接时(它是缺省主机)使用的套接字文件。

-T, –tab=path-to-some-directory
对于每个给定的表,创建一个table_name.sql文件,它包含SQL CREATE 命令,和一个table_name.txt文件,它包含数据。注意:这只有在mysqldump运行在mysqld守护进程运行的同一台机器上的时候才工作。.txt文件的格式根据–fields-xxx和 –lines–xxx选项来定。

-u user_name, –user=user_name
与服务器连接时,MySQL使用的用户名。缺省值是你的Unix登录名。

-O var=option, –set-variable var=option
设置一个变量的值。可能的变量被列在下面。

-v, –verbose
冗长模式。打印出程序所做的更多的信息。

-V, –version
打印版本信息并且退出。

-w, –where=’where-condition’
只导出被选择了的记录;注意引号是强制的!
“–where=user=’jimf’” “-wuserid>1″ “-wuserid<1″

最常见的mysqldump使用可能制作整个数据库的一个备份:
mysqldump –opt database > backup-file.sql

但是它对用来自于一个数据库的信息充实另外一个MySQL数据库也是有用的:
mysqldump –opt database | mysql –host=remote-host -C database
由于mysqldump导出的是完整的SQL语句,所以用mysql客户程序很容易就能把数据导入了:

shell> mysqladmin create target_db_name
shell> mysql target_db_name < backup-file.sql
就是
shell> mysql 库名 < 文件名

使用GoAgent的人都知道,要用GoGotest经常搜索新的Google IP替换才能使用,XX-Net的出现结束了这个历史。

XX-Net是一个集成了GoAgent和GoGotest的封包软件(作者主页),能自动根据当前网络状况搜索最新Google IP,并且替换到GoAgent里面,可以说是GAE最高效利用方式了。(国人也是被逼的没办法才会把GAE用作这个用途…)

版本将每周更新到百度网盘,如果发现使用中有任何突发情况,可以到本站检查是否有新版本发布。

下载链接:
百度网盘:http://pan.baidu.com/s/1mg5XmYG 密码:eg8o
360云盘:http://yunpan.cn/cdXEEmHSJxgpJ  访问密码:5e24
官网地址:https://github.com/XX-net/XX-Net(1.13.6 之前的用户,请重新部署服务端)

版本:https://github.com/XX-net/XX-Net/releases

主要特性

大量改良过的GoAgent 稳定快速
Web界面,傻瓜易用
内置了公共 appid, 方便新手
自动导入证书,减少大量手动工作
可设置开机启动
支持自动升级,保留辛苦找到的ip资源

平台支持情况

Windows XP (需要 tcpip.sys 补丁, 比如用 tcp-z)
Win7/8/10
Ubuntu (不显示系统托盘)
Debian (debian 8 php_proxy无法工作)
Mac OS X(10.7; 10.8; 10.9; 10.10)

链接

问题报告: https://github.com/XX-net/XX-Net/issues
讨论群: https://groups.google.com/forum/#!forum/xx-net
Email: xxnet.dev at gmail.com

 

 

 

使用方法:

Windows下, 双击 start.lnk/start.vbs
启动弹出浏览器: 访问 http://localhost:8085/
托盘图标:点击可弹出Web管理界面, 右键可显示常用功能菜单。
Win7/8/10:提示请求管理员权限, 安装CA证书。请点击同意。
推荐用Chrome浏览器, 安装SwichySharp, 可在swichysharp目录下找到插件和配置文件
Firefox 需手动导入证书 data/gae_proxy/CA.crt 启动后生成

Linux下, 执行 start.sh
自动导入证书,需安装 libnss3-tools 包
没有安装PyGtk的,需要先安装gtk:sudo apt-get install python-gtk2
第一次启动, 请用sudo ./start.sh, 以安装CA证书
配置http代理 localhost 8087, 勾选全部协议使用这个代理。 推荐Chrome + SwitchyOmega

Mac下,双击 start.command
会自动导入证书,如果还有提示非安全连接,请手动导入data/gae_proxy/CA.crt证书
命令行启动方式:./start.sh 推荐Chrome + SwitchyOmega

服务端
协议采用3.3的版本,请重新部署服务端,服务端兼容3.1.x/3.2.x的客户端
虽然系统内置了公共appid, 还是建议部署自己的appid,公共appid限制看视频

附图

GoAgent状态页面:
XX-Net1

GoAgent 配置页面:
XX-Net2

GoAgent 部署服务端页面:
XX-Net3

GoAgent 查看日志页面:
XX-Net4

相关连接:
GoAgent常见的使用问题汇总解答【2014年9月16日更新】

 

Apache附带的ab工具(本机使用的PHP环境是WAMP集成环境,ab工具位于D:\wamp\bin\apache\Apache2.2.21\bin)非常容易使用,ab可以直接在Web服务器本地发起测试请求,这至关重要,因为有些时候我们需要测试的仅仅是服务器的处理性能,并不想掺杂着网络传输时间的影响。ab进行一切测试的本质都是基于HTTP的,所以可以说ab对于Web服务器软件的黑盒性能测试,获得的一切数据和计算结果,都是可以通过HTTP来解释的。

测试本机是否正确安装ab工具,在cmd想将当前目录定位到bin,输入 .\ab –V 命令,如果安装正确,则会将其版本信息打印出来。

D:\wamp\bin\apache\Apache2.2.21\bin> .\ab -V
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech
Licensed to The Apache Software Foundation, <a href="http://www.apache.org/">http://www.apache.org/</a>

好了,一切就绪,下面提供一个压力测试的实例:

输入命令 PS D:\wamp\bin\apache\Apache2.2.21\bin> .\ab -n1000 -c10 http://localhost/index.php

This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests

Server Software: Apache/2.2.21
Server Hostname: localhost
Server Port: 80

Document Path: /index.php
Document Length: 211 bytes

Concurrency Level: 10
Time taken for tests: 0.496 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Non-2xx responses: 1000
Total transferred: 400000 bytes
HTML transferred: 211000 bytes
Requests per second: 2015.93 [#/sec] (mean)
Time per request: 4.960 [ms] (mean)
Time per request: 0.496 [ms] (mean, across all concurrent requests)
Transfer rate: 787.47 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.4 0 1
Processing: 2 5 1.1 4 12
Waiting: 2 4 1.1 4 12
Total: 2 5 1.1 5 12

Percentage of the requests served within a certain time (ms)
50% 5
66% 5
75% 5
80% 6
90% 6
95% 7
98% 8
99% 9
100% 12 (longest request)

下面开始解析这条命令语句:启动ab,并出入三个参数(PS D:\wamp\bin\apache\Apache2.2.21\bin> .\ab -n1000 -c10 http://localhost/index.php )

-n1000 表示请求总数为1000

-c10 表示并发用户数为10

http://localhost/index.php 表示这写请求的目标URL

测试结果也一目了然,测试出的吞吐率为:Requests per second: 2015.93 [#/sec] (mean) 初次之外还有其他一些信息。

Server Software 表示被测试的Web服务器软件名称

Server Hostname 表示请求的URL主机名

Server Port 表示被测试的Web服务器软件的监听端口

Document Path 表示请求的URL中的根绝对路径,通过该文件的后缀名,我们一般可以了解该请求的类型

Document Length 表示HTTP响应数据的正文长度

Concurrency Level 表示并发用户数,这是我们设置的参数之一

Time taken for tests 表示所有这些请求被处理完成所花费的总时间

Complete requests 表示总请求数量,这是我们设置的参数之一

Failed requests 表示失败的请求数量,这里的失败是指请求在连接服务器、发送数据等环节发生异常,以及无响应后超时的情况。如果接收到的HTTP响应数据的头信息中含有2XX以外的状态码,则会在测试结果中显示另一个名为 “Non-2xx responses”的统计项,用于统计这部分请求数,这些请求并不算在失败的请求中。

Total transferred 表示所有请求的响应数据长度总和,包括每个HTTP响应数据的头信息和正文数据的长度。注意这里不包括HTTP请求数据的长度,仅仅为web服务器流向用户PC的应用层数据总长度。

HTML transferred 表示所有请求的响应数据中正文数据的总和,也就是减去了Total transferred中HTTP响应数据中的头信息的长度。

Requests per second 吞吐率,计算公式:Complete requests / Time taken for tests

Time per request 用户平均请求等待时间,计算公式:Time token for tests/(Complete requests/Concurrency Level)

Time per requet(across all concurrent request) 服务器平均请求等待时间,计算公式:Time taken for tests/Complete requests,正好是吞吐率的倒数。也可以这么统计:Time per request/Concurrency Level

Transfer rate 表示这些请求在单位时间内从服务器获取的数据长度,计算公式:Total trnasferred/ Time taken for tests,这个统计很好的说明服务器的处理能力达到极限时,其出口宽带的需求量。

Percentage of requests served within a certain time(ms) 这部分数据用于描述每个请求处理时间的分布情况,比如以上测试,80%的请求处理时间都不超过6ms,这个处理时间是指前面的Time per request,即对于单个用户而言,平均每个请求的处理时间。

Windows 7 在通过注册表修改桌面路径后,发现在桌面创建快捷方式时,会出现两个相同的快捷方式图标。

删除其中一个,另一个也同时被删除。

一、因为,在手工修改注册表时,修改了两个地方:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Desktop 的值;
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Desktop 的值。

二、这两个位置,(请注意,根键是不同的,其余一样)第一个是当前登录用户的桌面位置,第二个是所有用户的桌面位置。

三、问题就出现在这里。

当在桌面创建新文件(快捷方式)时,系统会在这两个地方同时生成两个一样的文件(快捷方式)。

四、修复方法很简单:将第二个键值还原为Windows7 默认的值就可以了。

只需要修改:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Desktop 这个注册表的值就可以了。

在网上找了些WINDOWS执行PHP的计划任务的方法,有一个写得很全,可惜在我这竟然没通过。最后不得不综合各门派的方法,才能在我这运行成功
1、写一个PHP程序,命名为test.php,内容如下所示:

代码如下:

<?
$fp = fopen("test.txt", "a+");
fwrite($fp, date("Y-m-d H:i:s") . " PiaoYun.CC成功了!\n");
fclose($fp);
?>

程序大胆地写,什么include\require尽管用,都没问题

2、新建Bat文件,命名为test.bat,内容如下所示:
代码如下:

D:\php\php.exe -q D:\piaoyuncc\piaoyun.php
//相应目录自己改上

3、建立WINDOWS计划任务:
开始–>控制面板–>任务计划–>添加任务计划
浏览文件夹选择上面的bat文件
设置时间和密码(登陆WINDOWS的)
保存即可了。

4、over! 可以右键计划任务点“运行”试试

在windows 2008服务器上面使用任务计划运行PHP来生成phpcms v9的sitemaps的方法:
代码如下:

cd e:\wwwroot\piaoyun.cc\   //切换到网站程序所在的目录
D:\php\php.exe -q e:\wwwroot\piaoyun.cc\sitesmaps.php

上面代码中的sitesmaps.php的源代码请点击下面的地址查看:
PHPCMS V9 全站Sitemaps生成[服务器端版]

需求:
通过服务器的定时任务自动更新网站全站的所有文章,并生成sitemaps

以下代码为sitemaps crontab for phpcms v9,以下代码保存到phpcms 根目录下,配置cronTab定时生成即可

代码:

<?php
/**
 *  sitemap.php PHPCMS V9 sitemaps入口
 *
 * @copyright           (C) 2015-2018 piaoyun.cc
 * @license             http://piaoyun.cc
 * @lastmodify          2015-05-06
 */
if(PHP_SAPI != 'cli')
{
    header('location: sitemaps.xml');
    exit;
}
define('SITEMAP_SIZE', 10000);  //sitemaps中最大输出数量
define('MODEL_SIZE', 3000);     //每个模型中最大输出数量
$model_arr = array(1=>'资讯', 2=>'图片', 3=>'下载'); //定义需要生成sitemaps的模型
 
define('PHPCMS_PATH', dirname(__FILE__).DIRECTORY_SEPARATOR);
include PHPCMS_PATH.'/phpcms/base.php';
 
$param = pc_base::load_sys_class('param');
 
$model_arr = empty($model_arr) ? getcache('model','commons') : $model_arr;
 
$map = array();
foreach ($model_arr as $modelid => $model)
{
    $tablename = $model['tablename'];
     
    $db = pc_base::load_model('content_model');
    $db->set_model($modelid);
     
    if($db->count() && count($map) < SITEMAP_SIZE)
    {
        $order = 'id desc';
        $arc = $db->select(array('status'=>99), 'url,updatetime', MODEL_SIZE, $order);
        $map = array_merge($map, $arc);
    }
}
 
/* 遍历生成 */
$html = '<?xml version="1.0" encoding="utf-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
 
foreach ($map as $row)
{
    if(empty($row) || empty($row['url'])) continue;
     
    $date = date("Y-m-d", $row['updatetime']);
    $url = str_replace(array('&', '\'', '"', '>', '<'), array('&amp;', '&apos;', '&quot;', '&gt;', '&lt;'), $row['url']);
    $html .= "
<url>
        <loc>{$url}</loc>
        <lastmod>{$date}</lastmod>
        <changefreq>daily</changefreq>
        <priority>0.8</priority>
</url>";
}
 
$html .= '</urlset>';
file_put_contents('./sitemaps.xml', $html);
?>

我们运行在apache的虚拟主机,有时候为了安全,需要为每个网站以不同的用户运行,这样当虚拟主机中的一个网站被入侵时,而不会影响到其它的虚拟主机。我们这里使用apache2-mpm-itk补丁来实现这种功能。

1、下载apache2和itk

到apache2-mpm-itk网站下载最新版的补丁:http://mpm-itk.sesse.net/

wget http://apache.ziply.com//httpd/httpd-2.2.21.tar.gz
tar xzvf httpd-2.2.21.tar.gz
wget http://mpm-itk.sesse.net/apache2.2-mpm-itk-2.2.17-01.patch

2、为apache2打上mpm-itk补丁

cd httpd-2.2.21
patch -p1 < ../apache2.2-mpm-itk-2.2.17-01.patch
autoconf

3、编译apache2

编译apache2时,带上编译选项--with-mpm=itk,如:

./configure --with-mpm=itk
make
make install

4、配置apache2

<VirtualHost *:80>
ServerName piaoyun.cc
...

<IfModule mpm_itk_module>
AssignUserId siteuser sitegroup
</IfModule>
</VirtualHost>

sitesuer是指apache以siteuser用户运行
sitegroup是指apache以sitegroup用户组运行

本人一直很讨厌PDF链接直接在浏览器中打开。如果PDF文件很大,打开会很慢,要卡很长时间。不如直接下载来的妥当。但最近发现不知何故,PDF又自动在Firefox中打开了。以前禁止PDF在浏览器中打开都是在Adobe Acrobat的首选项里设置的,去掉“因特网”选项卡中的3个选项前面的勾。如下图:
disable-firefox-view-pdf-1

然而今天发现Acrobat里面的设置没有改变,但PDF仍然在Firefox中打开。最后发现,原来是Firefox升级到19.0后,内置了PDF阅读器,并默认打开的缘故。那好,下面是如何关掉它!

在Firefox地址栏中输入 about:config 然后在里面搜索 pdfjs 然后双击 pdfjs.disabled 使其值由 false 变为 true。如下图:
disable-firefox-view-pdf-2

至此,PDF已经不会在Firefox中打开了,但点击PDF链接时可能会自动下载到某个目录。下面需要到 Firefox - 工具 - 选项 - 应用程序 中将adobe acrobat文档后面的选项改为 “总是询问”,如下图,即可提示下载。
disable-firefox-view-pdf-3

OK,现在问题搞定。如果你想恢复让PDF在Firefox浏览器中打开呢,那么点击这里的Firefox官方帮助用火狐打开PDF文件按说明操作即可。

{loop subcat(0,0,0,$siteid) $r}
{php $num++}
<div class="w356 left display {if $num%2==0}marginleft10{/if}">
<div class="title left bold"><span class="right"><a href="{$r[url]}" class="bai">更多>></a></span>{$r[catname]}</div>
<ul class="clear left display">
{pc:content action="lists" catid="$r[catid]" num="5" order="id DESC" return="info"}
{loop $info $v}
<li>·<a href="{$v['url']}" target="_blank" title="{$v['title']}"{title_style($v[style])}>{str_cut($v['title'],100)}</a></li>
{/loop}
{/pc}
</ul>
</div>
{/loop}

上面这段代码是循环所有栏目的,

{loop subcat(0,0,0,$siteid) $r}
{php $num++}

看到这个没.这是循环所有栏目,没有过滤。在下面加上下面的代码即可只显示自己要的栏目。

{php if($r['catid']==1 || $r['catid']==2 || $r['catid']==3) continue;}

类似这样.要别的栏目就把id加到这里,格式如 $r['catid']==id 数字

|| 两竖线表示 或者 的意思。

PS:如果要现在某些栏目不出现,可以这样:

{php if($r['catid']==15) break;}

这样的话,栏目ID为15的不会显示在首页。

Sourceforge是一些开源软件经常用到的网站,然而国内的网站一直不稳定,如今是可以访问,但是一直无法下载,今天发现了一种新方法那就是 http://www.mirrorservice.org/ 这个网站,这个网站提供了众多网站的镜像,可以通过web或者ftp等方式来访问,看了下,里面的站点相当多。
059

例如我要下载Sourceforge上的WampServer,那么就进入http://www.mirrorservice.org/sites/downloads.sourceforge.net/w/wa/wampserver/ 即可下载最新版本的FreeRTOS,如下图。
060

列表比较多的时候可以直接使用浏览器的查找功能,下载速度还不错。

在用foreach的时候,经常会有这样的Warning: Invalid argument supplied for foreach() in XXXxxx.php on line 172

foreach仅能用于数组,当试图将其用于其它数据类型或者一个未初始化的变量时会产生错误。 所以当foreach 里面的数组变量假为空并且不定义为数组的时候,就会产生以上报错的情况。

有两种办法解决:
第一是在赋值数组的时候先定义array:

$aa =array();
foreach($aa as $key=>$value){}

第二种方法:

foreach((array) $aa as $key=>$value)

先上效果图:
20130527045719659

在这里的“1、2、3……8”就是所谓的标题前面的排行数字。

大家先想想应该怎么做呢?

假想一:

用背景图,具体用图片的方式,事先做好带有“1、2、3……8”的背景图,作为整个List的背景。
点评:可以实现,但是缺乏灵活性,而且图片会大,不够精简。

假想二:

把不同图标做成不同的小图标,然后手动写每一行li的class或者id,这样实现“1、2、3……8”。
点评:可以实现,但是不便于大量调用,不适合写在模板里边。

下面分享两个具体的Phpcms V9文章调用标题前面显示排行序号调用代码:

调用代码一:

{pc:content action="hits" catid="$catid" num="8" order="monthviews DESC" cache="3600"}
{loop $data $k $v}
<li><strong class="num2">{$n}</strong><a title="{$v[title]} - {number_format($v[monthviews])}" href="{$v[url]}">{str_cut($v[title],36,'...')}</a></li>
{/loop}
{/pc}

调用代码二:

{pc:content action="lists" catid="$catid" order="id DESC" num="10"}
{php $j=1;}
{loop $data $v}
<li>{php echo $j}<a href="{$v[url]}">{str_cut($v['title'],44,'')}</a></li>
{$j++}
{/loop}
{/pc}

调用代码三:

{php $i=0;}
{loop $data $n $r}
{php $i++;}
<dl class="f_{$i}">
<dt><a href="{userlink}" target="_blank">{username}</a></dt>
<dd>
<a href="{userlink}" alt="{username}" target="_blank"><img src="{photo}" alt="好友数:{friendnum}" width="40" height="40" /></a>
<STRONG> </STRONG> 
<div>人气:{viewnum}</div>
</dd>
</dl>
{/loop}

调用代码四:

{pc:content action="hits" catid="$catid" num="7" order="monthviews DESC" cache="3600" return="orderlist"}
{loop $orderlist $v}
{php if($n<=3){$s='t';}else{$s='';}}
{php if($n<=9){$m=0;}else{$m='';}}
<li><s class="{$s}">{$m}{$n}</s><a href="{$v[url]}"{title_style($v[style])} title="{$v[title]}">{str_cut($v['title'],50)}</a></li>
{/loop}
{/pc}

采用{$n}或者{$j++}的方式,让调用的数据前面的数字递增。

具体CSS方面的匹配,大家尝试下!相信不会难到大家!