如何在服务器上定时执行一个php脚本?

用Crontab:
下面介绍下 Crontab 的基本用法

第1列分钟1~59
第2列小时1~23(0表示子夜)
第3列日1~31
第4列月1~12
第5列星期0~6(0表示星期天)
第6列要运行的命令
下面是crontab的格式:
分 时 日 月 星期 要运行的命令
这里有crontab文件条目的一些例子:
30 21 * * * /usr/local/mysql/bin/mysql restart
上面的例子表示每晚的21:30重启mysql。
45 4 1,10,22 * * /usr/local/mysql/bin/mysql restart
上面的例子表示每月1、10、22日的4 : 45重启mysql。
10 1 * * 6,0 /usr/local/mysql/bin/mysql restart
上面的例子表示每周六、周日的1 : 10重启mysql。
0,30 18-23 * * * /usr/local/mysql/bin/mysql restart
上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启mysql。
0 23 * * 6 /usr/local/mysql/bin/mysql restart
上面的例子表示每星期六的11 : 00 pm重启mysql。
* */1 * * * /usr/local/mysql/bin/mysql restart
每一小时重启mysql
* 23-7/1 * * * /usr/local/mysql/bin/mysql restart
晚上11点到早上7点之间,每隔一小时重启mysql
0 11 4 * mon-wed /usr/local/mysql/bin/mysql restart
每月的4号与每周一到周三的11点重启mysql
0 4 1 jan * /usr/local/mysql/bin/mysql restart
一月一号的4点重启mysql
crontab -e
每天的 零点零分执行某个PHP 脚本
00 00 * * * /usr/local/php   /www/test.php

然后输入: 你的定时执行命令就可以了

文章链接:http://www.wangzhibo.com/index.php/archives/778.html

空空的屋子, 有点冷,有点孤单

现在一个人,在住的地方 , 屋子里有点冷, 更加的孤单

去年的这个时候媳妇正在这里照顾我 ,

今年的前几天 老娘在这里照顾我,

现在 只有我自己在漂着, 老娘跟媳妇都回家了, 孤单ing

我还在漂着, 好好的混, 早日出人头地, 早日挣足 自己的第一个1百万

如何让 flash 的底色 透明。

网站 上的FLASH 轮播图 是不透明的, 显示白色, 跟网站风格不搭配

解决办法 :

e中设置flash底色透明是在object中添加

firefox中,起作用的是embed,在其中加入属性
wmode=”transparent”

IE 火狐是不一样的
在 生成flash 的里面嵌入, 可以完美解决 flash 背景不透明问题

修改linux 系统时间 一步到位

复习了下linux 的修改系统时间的命令

首先修改时间:

直接输入 date 显示的是 服务器当前时间

#shell date 20110930 把当前日期修改为 2011-09-30 号

#shell date -s 17:00:00 把当前时间修改为 17:00:00

这样有点麻烦 : -s 可以一步到位

#shell date -s “20091112 18:30:50″

date 还有好多属性, 自己查手册去把

本文链接地址:http://www.wangzhibo.com/archives/752.html

curl 模拟post请求

我们经常会模拟一些请求, 比如模拟登录抓取数据,模拟提交等等。。
下面我给出一个 curl 的模拟提交方式

$datas = array();
$datas['clientname'] = "test08";
$datas['clientpasswd'] = "test08";
$datas['submit'] = "submit";
$url='http://wangzhibo.com/post.php';
$o="";
foreach ($datas as $k=>$v)
{
    $o.= "$k=".urlencode($v)."&";
}
$datas=substr($o,0,-1);
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_URL,$url);
//curl 参数还有很多, 例如 模拟来路请求。模拟请求IP .... 网上搜搜 ,一堆堆的
//为了支持cookie
curl_setopt($ch, CURLOPT_COOKIEJAR, '*.txt');
curl_setopt($ch, CURLOPT_POSTFIELDS, $datas);
 
$result = curl_exec($ch);

本文链接地址:http://www.wangzhibo.com/archives/747.html

展望未来,总结过去10年的程序员生涯,给程序员小弟弟小妹妹们的一些总结性忠告 .[转载]

展望未来,总结过去10年的程序员生涯,给程序员小弟弟小妹妹们的一些总结性忠告
走过的路,回忆起来是那么曲折,把自己的一些心得体会分享给程序员兄弟姐妹们,虽然时代在变化,但是很可能你也会走我已经做过的10年的路程,有些心得体会你可以借鉴一下,觉得说得有道理的你就接纳,觉得说得没道理的,你就抛弃,以下是我发自内心的,给大家的忠告,特别是针对那些小弟弟妹妹们。

01. 自己的户口档案、养老保险、医疗保险、住房公积金一定要保管好。
由于程序员行业每年跳槽一次,我不隐瞒大家,我至少换过5个以上的单位,这期间跳来跳去,甚至是城市都换过3个。还好户口没丢掉,其他都已经是乱了,好几个城市里,都有交过三金,甚至是一个程序的2个区里交的都有,那些东西,10年后,会变得很重要。你买房子若有公积金,可以取出来,贷款利率也会比较低一些,有孩子了,还需要上学,生病了还需要医疗保险。
特别是买房子时,你要商业贷款与公积金贷款的利率差别还是很大,有可能会有10万的差距。你平时都注意这些,会给你带来的损失会最小,例如每个月缴纳300元的公积金,公司也缴纳300元,你一个月能存下来600元,一年就是7200元,10年就是72000元。我以前都忽视了这些,到我需要买房子时,公积金里可能只有几千元,10年很快就过去了,结果我没能存下来多少公积金,医疗保险,养老金等更别提了,都已经稀里糊涂了,这些损失10年累加起来,是很庞大的数字,大家要注意,跳槽换工作时也要保护好自身的利益,现在房价很贵,你可能是跟我一样,大山里出来打拼的娃子,家里也没有丰厚的积蓄,只有靠自己拼搏,买房子是人生的一件大事,等你到了10年,才想到这个事情,已经晚了,特别是孩子要上学,上幼儿园等,需要户口啥的都要齐全。

02. 不要轻易换笔记本电脑,不要跟潮流,不要买过多的电子产品,不要过于频繁的更换手机。
这方面我的经验教训也是惨痛的。我大概前后购买过5-6个笔记本,以前的都是1万多元一台,最近买的是一台是1万多给女朋友的,自己买了一台是7500元左右,手机大概换过接近10个了,这些钱加起来也足够有10万以上了,你可能一不小心就购买了这些电子产品,但是时间长了,你一回过头来想想,你为什么赚得也不少,但是为什么还是那么穷,是因为你购买这些电子产品花费了过多的金钱了,平时笔记本啥的贵重物品要保护好,我一个同事不小心丢了2台笔记本电脑,接近2万的损失啊,你净赚2万,不是那么容易的,这个窟窿不是开玩笑的,我曾经也被人偷了一个崭新的笔记本,损失1.5万左右,更糟糕的是最新的代码也丢被偷了。

03. 这年代外语、学历、职称、驾驶证还是蛮重要的。
想找高薪,外资企业是正确的选择,在同样的打工里,外资企业的收入普遍是高的,我就想不明白,我们的赚钱能力怎么就比不过人家了,社会不断发展,将来可能去外国就像串门一样了,也说不定的,外语好将来的就业机会也会更多更广一些。
学历并不代表啥,但是学历也是敲门砖,例如有300个应聘者,那至少重点本科以下的,统统不看了,因为实在是来不及看了,你再厉害也被挡在机会的门外了,同样有时候你想改行什么的,职称也很重要,最起码评个中级职称,说不定还有机会能进入大学或者政府部门还是有可能性。
若有充裕的时间,应该把驾驶证考了,因为你越到后面越忙与工作家庭,没机会学车了也说不定的,平时也别光顾拼命工作,工作10年后你才发现,原来身边的人都至少硕士学历了,你被社会自动淘汰了,我现在就有这个感觉,虽然我带过很多硕士,他们的就业机会比我还好,经常能进入名牌企业,我也一直进不去。

04. 不要谈过多的女朋友,谈女朋友要看准,下手要稳准狠。
我谈过2个女朋友,平均每个女朋友身上的开支前后大概会有10万左右,还好我不用谈第3个女朋友了,若投资失误,那也是很残忍的,谈女朋友也会消耗很多时间精力、还会消耗很多金钱,实话的讲的确是这样的,人家女孩子也值钱啊,凭什么就那么轻易的跟你啊,我跟第一个朋友分手时,我的生活至少是倒退了3-4年,一切从零开始,一切从头开始,我劝大家谈女朋友是人生最大的一笔买卖,投资失误会有惨痛的后果,不仅仅是金钱上的损失,更会有精神、心灵上的沉重打击,大家要学会珍惜女朋友,要学会哄好女朋友,让老婆开心每一天,虽然鱼儿上钩了,不用再下鱼饵了,偶尔也别忘记放点米,这个鱼要是脱钩了,那不是开玩笑的。

05. 工作不要更换得太过于频繁,选好了行业方向最好别更换太频繁。
换工作,换行业方向,就像熊掰苞米一样的道理,有时候是丢了芝麻捡西瓜,有时候是丢了西瓜捡芝麻,这个道理我就不多讲了,大家都应该能明白的。

06. 要对身边的人好,要得到老板的信任、同事的认可及支持、珍惜良好的工作环境。
有个朋友的QQ名字很有意思,“只爱陌生人”,陌生人是很有意思,但是最关键时刻,还是需要靠非陌生人,你每天跟同事一起生活,要维系好身边的人。你的成功与失败,往往是你身边的30-40个人决定的。你就是世界首富,他身边也是那么不超过100个人的在左右着他的生活,当你工作10年了,没一个老板信任你,没几个要好的同事朋友,那你惨了,你在这个世界上已经是很孤单了,你的收入,其实大多是来自这些身边的朋友给你介绍的生意,不大会网上掉几个馅饼的。
现在你身边的人有可能在不久的将来,给你提供很多好机会。

07. 钱很重要,但是生活质量比钱还重要,工作是很重要,但是家人比工作还重要。
钱不是万能的,但是没钱是万万不能的。钱赚了,身体夸了,全送给医院了,钱赚了,身心疲惫了,人活着为了啥?不就为了开开心心生活嘛?工作重要,但是失去了家人的爱,失去了女朋友,失去了老婆孩子,那这个工作有啥用了?工作很容易就换了,家人是换不了的,老婆不是想换就换的,孩子不是想换就换的,连自己的家庭都不负责的人,怎么可能对公司负责呢?我一直是这个观念,来面试时觉得工作更重要的,我们一般不录取的,那太假了,或者太不懂事了。

08. 工作累了,也别太贪玩,有时候还是需要多想想如何才能赚钱。
时间一晃就过去了,工作累了是可以适当放松,但是别太贪玩,10年很容易就过去了,10年后你要买房子,要娶老婆,要买车子,要生娃娃,身体也会变得脆弱一些,需要良好的生活习惯,也经不起通宵了,通宵一次,你要低迷好几天才能缓过劲儿来,跟20刚出头完全不一样了,用钱的地方多了去了,父母也会变得更老一些,可能也需要你的照顾,整个家子都指望你赚钱,别到了这个时候,你才意识到赚钱是那么的重要,更何况现在城市的房价,动不动就是100万,加上按揭的利息,你很可能需要支付150万。还可能需要装修,买车子。可能你身上的压力是200万。别觉得谈钱就俗,你要学会赚钱,要有个需要赚钱的良好意识,当然你出身富裕家庭,就不用考虑这些因素了。

09. 每天一点点进步,每月一点点积累,要敬业要爱业,我们给别人提供的也是服务。
总有一天,你也会有累的时候,你也会有老的时候,这时候,你要靠啥呢?就要靠你平时的积累,你10年的积累,可以打倒很多竞争对手,他们再厉害,再怎么样,也很难抵得过你10年的积累,特别是后面5-10年的积累,成果会很明显,前面的1-5年,算是做软件的入门吧,除非你有高人指点,那可能2-3年就可以修成正果,软件在将来还是会值钱的,以为生活会越来越智能化,越来越数字化,软件的需求还是很有前途,最起码未来的10-20年里不用太担心失业问题了。

10. 对程序员来讲,开发思想、架构、代码就是财富,别老丢弃你的劳动成果,要学会保护你的劳动成果。
我大概7-8年前的代码都在手上,经常改进来改进去,维护来维护去,在一定的程度上,让我生活轻松了不少,因为我不用什么都从头来过,我只要痛苦一次,以后就要反复重复利用,软件的价值在于重复利用,而不是每个东西,都从头开发,那永远也是辛苦的程序员,这个生活质量就别提了,不管自己的代码丑还是拿不出手,要学会精心维护,每天改进一点点,每个月一个小进步,每年一个大进步,多年的积累是宝贵的,这个早晚也会给你带来丰厚的收益。

11. 当程序员要防止原地踏步,不是工作年限长了,经验就丰富了,能力就强了,年纪越大工作越难找。
我有一个朋友跟我开玩笑,工作5年的人,可能能力差距会很大,为什么呢?因为第一年他们干的事情都是一样的,都写程序了,2个人可能由于价值观不一样,5年后差距会很大,甚至是大到无法追赶的程度,为啥?因为还有机会的因素在里面,有的人干了5年,还是在原地踏步,天天只会写那些添加、删除、修改的代码。那你得注意了,需要不断的提高自己,才是硬道理。例如你会SQLServer,那要试着学习Oracle, 你是做C/S的,那得需要提高到B/S的,你是做单机软件的,那得需要提高到网络软件,你只关注自己的工作的,需要学会管理,关心他人的工作。你是当程序员的,要试着提高当项目经理、部门经理,公司的总监等等,人有野心有目标才会不断进步,最俗的为了多赚钱,提高工作职位工作岗位,工作单位,也是可以理解的。
年纪越大工作越难找,例如3-4千的工作是随便找找,玩一样,但是你30过后,最起码要找月薪上1万的工作,这样的工作是机会也少,一般小公司也给不起,还得找个好公司才可以,好公司又不是天天招聘人,天天缺好的工作岗位,说不好听点儿,小公司的老板才赚多少啊?他来钱也很不容易的,小池塘就不好容得下大鲨鱼了。

12.当创业的收入比打工还少时,那就别创业,要找比自己能力强的人创业,你不会吃亏。
创业的收入,比打工还少,那就是瞎扯蛋,恶搞。创业的真正意思并不是要你去吃苦没钱赚,那是忽悠无知的人的。当你创业时的收入,比打工还多,那你可以考虑创业,没有工资什么的,股份啥的,都是瞎扯蛋。
不要跟自己能力还弱的人一起创业,那损失最大的,很可能就是你,要创业,也要找比自己强的人一起创业,最起码赚不到钱,还能学到不少。不会有过多的损失。别热血一沸腾就创业了,创业了,也别烧自己的钱,家人的钱,那是很不抗烧的,没几下几十万就烧干了。
其实打工,也是创业的开始,每个月都能拿到钱,还可以学到知识,什么公司的股份都是空话,没几个小公司能成功,开起来了也走不了3年就分家了,都忽悠小孩子玩的,除非真的有科技含量或者是客户资源的,否则股份是一文钱不值的,就算创业每个月也按时拿工资才是硬道理。

13. 未来的生活节奏会更快,生活压力会更大,竞争会更激烈,社会服务体系会更完善。
在未来,我们享受良好的服务的同时,也会为别人提供更良好的服务,需要在技能上还是服务质量上的要求会更高更严格。平时要注意提高自己,不要被时代淘汰掉,我从小的朋友,一波又一波被社会无情的淘汰了,很小的时候,我出生在大草原与大山的交界处,我小时候的玩伴,还在大山里,我跟着家人杀出来了,我小学、中学、大学、工作上的、这10年,我一直很坚强的拼搏下来,很不容易的在杭州立住脚了,说实话,参加工作后的十年,也是不断拼搏,不断提高的十年。

http://www.verycd.com/topics/2837883/

ecshop 自动内联(内链)小插件

ecshop没有内联前

大家都说新浪,搜狐,做的好,那么有多少seoer潜心去研究过它们的网站,对他们的优化手段有知多少,不管怎样这些网站对大家的感觉就是很强大,文章是看完一篇想看第二篇,那么到底这些网站靠的是什么样的手段才提高了网站的PV,提高了用户的粘性?四个字:内部链接。
可是ECSHOP 本事的 文章系统并不是很完善,我特此写了一个小插件, 让ECSHOP 也可以玩 内联
效果演示.
我会自动把 新浪,百度,网易 这几个词自动替换成 相应的链接

我在文件里面定义的链接

百度,http://www.baidu.com
谷歌,http://www.google.com
新浪,http://www.sina.com.cn
网易,http://www.163.com

ecshop加上了内链(内链)

发布后看效果

看到效果了把 。 自动内联搞定 。。。
链接你想定义多少都OK ,都可以自动实现
下面我来说下修改方法:
第一:在你的根目录下放一个txt 文件(编码要和你的)
格式是这样的:(保证一行一个,用逗号分割)
百度,http://www.baidu.com
谷歌,http://www.google.com
新浪,http://www.sina.com.cn
网易,http://www.163.com

第二,修改article.php
我把代码贴处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/*------------------------------------------------------ */
//-- PROCESSOR
/*------------------------------------------------------ */
 
$cache_id = sprintf('%X', crc32($_REQUEST['id'] . '-' . $_CFG['lang']));
 
if (!$smarty->is_cached('article.dwt', $cache_id))
{
    /* 文章详情 */
    $article = get_article_info($article_id);
    //下面是加入的代码(大概就是读取里面的内容,然后循环替换)
    $text = file('./tarfly.txt');
    $count = count($text);
    for($i=0;$i<$count;$i++) {
        $re = explode(',',$text[$i]);
        $to = "$re[0]";
        $article['content'] = str_replace($re[0],$to ,$article['content']);
    }
     //上面是加入的代码

这种方法可能在效率上来说比较低, 但是 做法还是比较方便的,
还有另外一直方法, 就是在后台添加文章的时候 去自动生成内联
如果你没用测试OK ,可以联系我 , 关于我 里面有我的联系方式
文章如转载,请注明:转载自:王志博-PHP[http://www.wangzhibo.com/]
本文链接地址:http://www.wangzhibo.com/archives/705.html

php格式化时间(全)

写代码碰到一个 格式化时间问题 ,要把时间戳格式化成 (2011年8月11日) 这样的, 查了下手册,顺便复习下时间函数 ,
写法:

1
2
$date = date('Y年n月d日',time());
echo $date;

string date(string $format, int $timestamp);

格式字串可以识别以下 format 参数的字符串
format 字符 说明 返回值例子
日 — —
d 月 份中的第几天,有前导零的 2 位数字 01 到 31
D 星 期中的第几天,文本表示,3 个字母 Mon 到 Sun
j 月 份中的第几天,没有前导零 1 到 31
l(“L” 的小写字母) 星期几,完整的文本格式 Sunday 到 Saturday
N ISO-8601 格式数字表示的星期中的第几天(PHP 5.1.0 新加) 1(表示星期一)到 7(表 示星期天)
S 每月天数后面的英文后缀,2 个字符 st,nd,rd 或者 th。可以和 j 一起用
w 星 期中的第几天,数字表示 0(表示星期天)到 6(表示星期六)
z 年 份中的第几天 0 到 366
星期 — —
W ISO-8601 格式年份中的第几周,每周从星期一开始(PHP 4.1.0 新加的) 例如:42(当年的第 42 周)
月 — —
F 月 份,完整的文本格式,例如 January 或者 March January 到 December
m 数 字表示的月份,有前导零 01 到 12
M 三 个字母缩写表示的月份 Jan 到 Dec
n 数 字表示的月份,没有前导零 1 到 12
t 给 定月份所应有的天数 28 到 31
年 — —
L 是 否为闰年 如果是闰年为 1,否则为 0
o ISO-8601 格式年份数字。这和 Y 的值相同,只除了如果 ISO 的星期数(W)属于前一年或下一年,则用那一年。(PHP 5.1.0 新加) Examples: 1999 or 2003
Y 4 位数字完整表示的年份 例如:1999 或 2003
y 2 位数字表示的年份 例如:99 或 03
时间 — —
a 小 写的上午和下午值 am 或 pm
A 大 写的上午和下午值 AM 或 PM
B Swatch Internet 标准时 000 到 999
g 小 时,12 小时格式,没有前导零 1 到 12
G 小 时,24 小时格式,没有前导零 0 到 23
h 小 时,12 小时格式,有前导零 01 到 12
H 小 时,24 小时格式,有前导零 00 到 23
i 有 前导零的分钟数 00 到 59>
s 秒 数,有前导零 00 到 59>
时区 — —
e 时 区标识(PHP 5.1.0 新加) 例如:UTC,GMT,Atlantic/Azores
I 是 否为夏令时 如果是夏令时为 1,否则为 0
O 与 格林威治时间相差的小时数 例如:+0200
P 与 格林威治时间(GMT)的差别,小时和分钟之间有冒号分隔(PHP 5.1.3 新加) 例如:+02:00
T 本 机所在的时区 例如:EST,MDT(【译者注】在 Windows 下为完整文本格式,例如“Eastern Standard Time”,中文版会显示“中国标准时间”)。
Z 时 差偏移量的秒数。UTC 西边的时区偏移量总是负的,UTC 东边的时区偏移量总是正的。 -43200 到 43200
完整的日期/时间 — —
c ISO 8601 格式的日期(PHP 5 新加) 2004-02-12T15:19:21+00:00
r RFC 822 格式的日期 例如:Thu, 21 Dec 2000 16:01:07 +0200
U 从 Unix 纪元(January 1 1970 00:00:00 GMT)开始至今的秒数 参见 time()

文章如转载,请注明:转载自:王志博-PHP[http://www.wangzhibo.com/]
本文链接地址:http://www.wangzhibo.com/?p=582

每天八分钟,练出腹肌

确实只要八分钟,确实能练出来六块腹肌,只要你能坚持三个月。
跟着视频做就可以了,一共八组动作,每组30个,每两组休息30秒。要确保在八分钟做完,动作一定要符合标准,仔细看视频。

推荐一个收腹运动机 ,效果很好的

ad收腹运动机正品收腹机 腹部健身器材家用减肥机仰卧起坐健腹器
312.0元 

凤凰网抠出来的原生态JS无缝滚动

凤凰网抠出来的原生态JS无缝滚动 ,非常好用 , 简单配置

?View Code JAVASCRIPT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
/*
*图片文字滚动扩展包
*版本:v1.2
*编码:utf-8版本
*作者:cici
*email:chengds@ifeng.com
*日期:2009-4-15
*/
 
/*
container:滚动的容器ID
btnPrevious:上一步按钮的ID
btnNext:下一步按钮的ID
*/
function ifeng_Scroll(container,btnPrevious,btnNext)
{
	////////////////对外接口/////////////////////////
	this.IsAutoScroll = true; //是否自动滚动
	this.IsSmoothScroll= true;//是否平滑连续滚动 平滑滚动:true 间隔滚动:false
	this.PauseTime = 1000;//间隔滚动时每次滚动间隔的时间。单位:毫秒。建议值:100--3000 适用于间隔滚动。
	this.Direction = "N"; //滚动方向.向东:E,向北:N
	this.ControllerType = "click";//上一个和下一个按钮事件的触发方式:click为点击触发滚动 否则就是 鼠标按住按钮触发滚动。支持click 和mousedown两种模式
	this.BackCall = null;//回调函数 滚动到末尾时执行
	this.Step = 1;//步长 可以理解为速度1--10
	////////////////对外接口/////////////////////////
 
	this.Speed = 10;
	this.container = container;
 
    this.NextButton = this.$(btnNext);
    this.PreviousButton = this.$(btnPrevious);
    this.ScrollElement = this.$(container);
 
	this.UlElement = this.$(container).getElementsByTagName('ul')[0];//ul元素
	this.UlElement.innerHTML+=this.UlElement.innerHTML;
 
	this.UlSpace ;//ul的实际宽度
	this.LiSpace;
}
ifeng_Scroll.prototype = {
	lastpos:0,
	curPos:0,
	curTimeoutId:null,
	curIntervalScrollTimeoutId:null,
	ScrollElementPos:0,
	$:function(element)
	{
		return document.getElementById(element);
	},
	Init:function()
	{
		this.UlSpace = this.Direction=="E"?this.UlElement.offsetWidth:this.UlElement.offsetHeight;//ul的实际宽度
		this.LiSpace = parseInt(this.UlSpace/this.UlElement.getElementsByTagName('li').length);
		this.UlSpace = this.LiSpace*this.UlElement.getElementsByTagName('li').length;
		this.Direction=="E"?this.$(this.container).style.width=this.UlSpace+"px":this.$(this.container).style.height=this.UlSpace+"px";
 
		//设置基础样式
		this.ScrollElement.style.overflow="visible";
		this.ScrollElement.parentNode.style.overflow="hidden";
		this.Direction=="E"?this.ScrollElement.style.width="10000px":this.ScrollElement.style.height="10000px";
		this.UlElement.style.float="left";
 
		this.ScrollType=this.Direction=="E"?"left":"top";
		this.Bind(this,this.PreviousButton,this.ControllerType,"Pre");
		this.Bind(this,this.NextButton,this.ControllerType,"Next");
 
		this.ScrollElement.onmouseover = this.GetFunction(this,"MouseOver");
		this.ScrollElement.onmouseout = this.GetFunction(this,"MouseOut");
	},
	Reset:function()
	{
		this.Pause();
		this.ScrollElement.style[this.ScrollType] = '0px';
	},
	Bind:function(_this,el,type,param)
	{
		if(el)
		{
			if(type=="click"){
				el.onclick = this.GetFunction(this,param);
			}
			else
			{
				el.onmousedown = this.GetFunction(this,"MouseDown",param);
				el.onmouseup = this.GetFunction(this,"MouseUp");
			}
			el.onmouseover = this.GetFunction(this,"MouseOver");
			el.onmouseout = this.GetFunction(this,"MouseOut");
		}
	},
	Start:function()
	{
		if(!this.IsAutoScroll) return;
		if(this.IsSmoothScroll)
		{
			this.SmoothScroll();
		}
		else
		{
			this.IntervalScroll();
		}
	},
	Pause:function()
	{
		clearTimeout(this.curTimeoutId);
		clearTimeout(this.curIntervalScrollTimeoutId);
	},
	MouseOver:function()
	{
		clearTimeout(this.mouseoutTimeoutId);
		this.mouseoverTimeoutId = setTimeout(this.GetFunction(this,"Pause"),10);
	},
	MouseOut:function()
	{
		clearTimeout(this.mouseoverTimeoutId);
		this.mouseoutTimeoutId = setTimeout(this.GetFunction(this,"Start"),10);
	},
	MouseDown:function(direction)
	{
		var _step;
		var _to;
		if(direction=="Pre")
		{
			_step = this.Step*2;
			curPos = parseInt(this.ScrollElement.style[this.ScrollType]);
			if(!curPos) curPos=0;
			if(curPos==0)
			{
				this.ScrollElement.style[this.ScrollType] = -this.UlSpace/2 + "px";
				this.curPos=-this.UlSpace/2;
			}
			_to = 0;
		}
		else
		{
			_step = -this.Step*2;
			_to = -this.UlSpace/2;
		}
		moveParams = {from:this.curPos, to:_to, step: _step,controller:"MouseDown:" + direction,callback:this.GetFunction(this,"ScrollFinish")};
		this.RunScroll(moveParams);
	},
	MouseUp:function()
	{
		clearTimeout(this.curTimeoutId);
	},
	Pre:function()
	{
		var curPos = parseInt(this.ScrollElement.style[this.ScrollType]);
		if(!curPos) curPos=0;
		var _to ;
		if(curPos==0)
		{
			this.ScrollElement.style[this.ScrollType] = -this.UlSpace/2 + "px";
			this.curPos=-this.UlSpace/2;
			_to = -this.UlSpace/2 + this.LiSpace;
		}
		else
		{
			_to = this.curPos%this.LiSpace==0?this.curPos + this.LiSpace:parseInt(this.curPos/this.LiSpace)*this.LiSpace;
		}
		moveParams = {from:this.curPos, to:_to, step: this.Step*2,controller:"Previous",callback:this.GetFunction(this,"ScrollFinish")};
		this.RunScroll(moveParams);
	},
	Next:function()
	{
		_to = this.curPos%this.LiSpace==0?this.curPos - this.LiSpace:(parseInt(this.curPos/this.LiSpace)-1)*this.LiSpace;
		moveParams = {from:this.curPos, to:_to, step: -this.Step*2,controller:"Next",callback:this.GetFunction(this,"ScrollFinish")};
		this.RunScroll(moveParams);
	},
	IntervalScroll:function()
	{
		var _to = parseInt(this.curPos/this.LiSpace)*this.LiSpace-this.LiSpace;
		var moveParams = {from:this.curPos, to:_to, step: -this.Step,controller:"IntervalScroll",callback:this.GetFunction(this,"ScrollFinish")};
		this.RunScroll(moveParams);
	},
	SmoothScroll:function()
	{
		var _to = -this.UlSpace/2;
		var moveParams = {from:this.curPos, to:_to, step: -this.Step,controller:"SmoothScroll",callback:this.GetFunction(this,"ScrollFinish")};
		this.RunScroll(moveParams);
	},
	RunScroll:function(params)
	{
		this.Scroll(params);
	},
	Scroll:function(param)
	{
		var step = Math.abs(param.to - this.curPos)<Math.abs(param.step)?param.to - this.curPos:param.step;
		this.ScrollElement.style[this.ScrollType] =(param.from+step)+"px";
		this.curPos = parseInt(this.ScrollElement.style[this.ScrollType]);
		clearTimeout(this.curTimeoutId);
		if(this.curPos!=param.to)
		{
			var moveParams = {from:this.curPos, to:param.to, step: param.step,controller:param.controller,callback:param.callback};
			this.curTimeoutId = setTimeout(this.GetFunction(this,"Scroll",moveParams),this.Speed);
		}
		else
		{
			if(param.callback) param.callback();
			if(param.controller=="SmoothScroll")
			{	this.SmoothScroll();}
			else if	(param.controller=="IntervalScroll")
			{
				if(this.curIntervalScrollTimeoutId) clearTimeout(this.curIntervalScrollTimeoutId);
				this.curIntervalScrollTimeoutId = setTimeout(this.GetFunction(this,"IntervalScroll"),this.PauseTime);
			}
			else if(param.controller.indexOf("MouseDown")!=-1)
			{
				derection = param.controller.split(':')[1];
				this.MouseDown(derection);
			}
		}
	},
	ScrollFinish:function()
	{
		if(this.curPos<=-this.UlSpace/2)
		{
			this.ScrollElement.style[this.ScrollType] = "0px";
		}
		else if(this.curPos>=0)
		{
			this.ScrollElement.style[this.ScrollType] = -this.UlSpace/2 + "px";
		}
		this.curPos = parseInt(this.ScrollElement.style[this.ScrollType]);
		if(this.BackCall)this.BackCall();
	},
	GetFunction:function(variable,method,param)
	{
		return function()
		{
			variable[method](param);
		}
	}
}
  // 引用上面的JS
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

文章如转载,请注明:转载自:王志博-PHP[http://www.wangzhibo.com/]
本文链接地址:http://www.wangzhibo.com/?p=575

二尺宽的小肩膀抗不了多少事

这二尺宽的小肩膀抗不了多少事,谁都不是救世主,所以别瞎往自己身上揽事儿;
做人也好,工作也好,感情也好,不要自以为是,有了点成绩就不知道自己是谁,目中无人,摆不清自己的位置,做人还是脚踏实地的好;
别老拿事业作为婚姻的借口,等你的人不会一直等你,如果她一直等着,只能说明你赚了;在感情的倦怠期小心第三者
跳楼这招,只能用一次,还有,有的窗户纸千万不能捅

很喜欢这几句话, 很喜欢很喜欢

不同域名访问显示不同模板,数据统一,高效管理

近日一个朋友有这么一个 需求, 他想 要这样一个网站, 网站内容是相同的程序, 相同的数据, 但是需要绑定不同的域名。
访问 www.a.com 访问的是 红色模板
www.b.com 访问的是 绿色模板 而且后台可以设置 不同的title ,关键字等内容(这样容易欺骗搜索引擎,)
我是用ecshop 给他实现这个功能的

需要操作的地方大概有这么几个地方.
因为ecshop 是smarty 的模板引擎, 主要去修改 他的编译目录, 和缓存目录就可以实现这个效果了
第一:
init.php

1
2
3
4
5
6
7
8
//扩展显示的4 行模板判断代码
if($_SERVER['HTTP_HOST'] == 'www.a.com') {
        $_CFG['template'] = 'default';
    }else{
        $_CFG['template'] = '360';
 }
 
$smarty->template_dir   = ROOT_PATH . 'themes/' . $_CFG['template'];// 设置当前网站到底用的是那一个模板(所以在这之前通过逻辑操作,让不同的页面调用不同的模板)

第二: 设置编译文件存放的目录
cls_template.php
函数 make_compiled (大概225) 里面有一句

1
2
3
4
$name = $this->compile_dir .'/'. basename($filename) . '.php'; // 编译文件存放的目录
要扩展成这样, 不同的模板存放补同的编译目录,扩展如下
global $_CFG;  // 通过全局变量调用当前域名访问的模板
$name = $this->compile_dir . '/' .$_CFG['template'].'/'. basename($filename) . '.php';

第三, 如何开启静态缓存的话需要扩展的地方
函数 fetch 大概190行的
cls_template.php

1
2
3
4
$hash_dir = $this->cache_dir .'/' . substr(md5($cachename), 0, 1); //静态文件存放的目录
扩展为
global $_CFG;
$hash_dir = $this->cache_dir . '/'.$_CFG['template'].'/' . substr(md5($cachename), 0, 1);

这样就OK 了, 一点都不破坏ecshop 原来的机制,
其实还有一直比较2B 的方法, 只通过通过修改一个变量就可以搞定,这里就不说了,有兴趣的朋友自己研究去把

文章如转载,请注明:转载自:王志博-PHP[http://www.wangzhibo.com/]
本文链接地址:http://www.wangzhibo.com/?p=640

Powered by 志博 23:30

高效的php 导出 xls,csv 的方法

经常会碰到需要从数据库中导出数据到Excel文件,用一些开源的类库,比如PHPExcel,确实比较容易实现,但对大量数据的支持很不好,很容易到达PHP内存使用上限。这里的方法是利用fputcsv写CSV文件的方法,直接向浏览器输出Excel文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?php
// 输出Excel文件头,可把user.csv换成你要的文件名
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="user.csv"');
header('Cache-Control: max-age=0');
include './Mysql.class.php';//mysql 用你自己的操作类就可以
$db = new mysql();
// 从数据库中获取数据,为了节省内存,不要把数据一次性读到内存,从句柄中一行一行读即可
$sql = 'select id,user_login from wp_users';
$stmt = $db->getAll($sql);
 
// 打开PHP文件句柄,php://output 表示直接输出到浏览器
$fp = fopen('php://output', 'a');
 
// 输出Excel列名信息
$head = array("id", "姓名");
foreach ($head as $i => $v) {
    // CSV的Excel支持GBK编码,一定要转换,否则乱码
    $head[$i] = iconv('utf-8', 'gbk', $v);
}
 
// 将数据通过fputcsv写到文件句柄
fputcsv($fp, $head);
 
// 计数器
$cnt = 0;
// 每隔$limit行,刷新一下输出buffer,不要太大,也不要太小
$limit = 100000;
 
// 逐行取出数据,不浪费内存
$count = count($stmt);
for($t=0;$t<$count;$t++) {
 
    $cnt ++;
    if ($limit == $cnt) { //刷新一下输出buffer,防止由于数据过多造成问题
        ob_flush();
        flush();
        $cnt = 0;
    }
    $row = $stmt[$t];
    foreach ($row as $i => $v) {
        $row[$i] = iconv('utf-8', 'gbk', $v);
    }
    fputcsv($fp, $row);
}

文章如转载,请注明:转载自:王志博-PHP[http://www.wangzhibo.com/]
本文链接地址:http://www.wangzhibo.com/?p=582

如何禁止搜索引擎收录,robots.txt 的使用

公司网站的后台可以被搜索引擎收录, 查了个文章,学习了下 robots.txt 的使用方法
禁止搜索引擎收录的方法大概有3种。
方法一:服务器禁止访问。

这需要服务器配备有cPanel这样的后台管理软件,设定某个搜索引擎所在的IP段禁止访问。如要封锁Google的蜘蛛,先通过域名对应IP查询 得www.google.com的IP地址,如74.125.19.99,再通过IP WHOIS查询查到IP段 74.125.0.0 – 74.125.255.255 的所有人均是Google公司,把这个IP段填入IP黑名单中。(具体的方法根据不同的管理软件有所不同,可能是 74.125.0.0-74.125.255.255或74.125.*.*)

这个方法比较好的地方在于直接禁止搜索引擎的访问,除了HTTP请求头,几乎不耗费流量,一般情况下这点流量也不会计算在你的消耗的流量当中。这是 禁止搜索引擎收录的最好方法。但麻烦在于你不可能得到Google的所有IP段,这个就得靠收集了。

方法二:robots.txt禁止

robots.txt(小写)是放置在网站根目录下的搜索引擎权限控制文件。搜索引擎一般遵守robots.txt协议。通过编辑 robots.txt协议,可以禁止某些搜索引擎的访问、禁止某个文件、文件夹被搜索引擎收录,适合用于保护私有文件。搜索引擎通过读取 robots.txt,判断自己是否在被禁止搜索引擎之列,如果被禁止,一般不会对该网站进行抓取,除了百度这变态 。

robots.txt的简单用法:

1.禁止百度收录(想和淘宝一样抵制百度就这么做 )

User-agent: *
Disallow:

User-agent: baiduspider
Disallow: /

首先是User-agent,每个搜索引擎都有自己的User-agent,比如Google的为 Googlebot,百度的为 baiduspider ,可能区分大小写,其他相对应的应该到搜索引擎的帮助页面去查询一下。 * 是一个通配符,通配所有的搜索引擎,Disallow: 项目表示禁止访问的位置,第一个Disallow:后面为空,表示没有禁止访问的项目,也就是允许所有的搜索引擎收录。但如果要添加例外,还可以添加一行 User-agent: baiduspider,表示下面的规则仅适合百度蜘蛛,百度蜘蛛的规则是Disallow: / ,也就意味着禁止收录该域名下所有的网页。

在特殊情况下,我们可能希望部分不被所有的搜索引擎收录,比如Wordpress的wp-admin/目录是后台管理的目录,wp-content /是存放主题、插件的目录,这个不需要被搜索引擎收录,可以编辑robots.txt为

User-agent: *
Disallow: /wp-admin/
Disallow: /wp-content/

2.仅允许百度以及Google收录(推荐)

User-agent: Googlebot
Disallow:

User-agent: baiduspider
Disallow:

User-agent: *
Disallow:/

使用robots.txt需要注意的是,并非所有的搜索引擎都遵守该协议,而且就算遵守该协议不代表蜘蛛不对网站进行抓取,可能是抓取后不发布出来 而已,流量是要样要耗费的。

方法三:脚本判断,禁 止

这里写一下PHP的方法,其他ASP等方法也是类似的。
检测来访的访客的User-agent(UA),如果是搜索引擎的蜘蛛则立即禁止访问,提示出错信息。

if ( preg_match ( " /(google|baidu)/i " , $_SERVER [ ' HTTP_USER_AGENT ' ])){
    header ( ' HTTP/1.1 403 Forbidden ' ) ;
    exit ;
}

该代码当来访的访客的UA中包含google或baidu字样即返回403禁止信息并退出脚本。

//禁止UA中含有bot /crawl/spider字样的用户
//但允许百度和Google

if ( preg_match ( " /(bot|crawl|spider)/i " , $_SERVER [ ' HTTP_USER_AGENT ' ]) && ! preg_match ( " /(google|baidu)/i " , $_SERVER [ ' HTTP_USER_AGENT ' ])){
    header ( ' HTTP/1.1 403 Forbidden ' ) ;
    exit ;
}

用脚本的方法禁止搜索引擎的访问比较方便快捷,特别是WordPress这样的程序,只要加一个插件即可(过些天做一个发布出来)。用这个方法对服 务器流量的消耗也不大,可以接受。

规则大概明白了, 到时规则自己写就OK 。。。
文章如转载,请注明:转载自:王志博-PHP[http://www.wangzhibo.com/]
本文链接地址:http://www.wangzhibo.com/?p=575

如何在服务端获得客户端信息.

比如你用得到服务器和客户端的设置信息,但是这个信息会因为客户端的不同而不同,如果想要保存phpinfo()函数的输出怎么办呢?在没有缓冲区控制之前,可以说一点办法也没有,但是有了缓冲区的控制,我们可以轻松的解决:

<?php
ob_start(); //打开缓冲区
phpinfo(); //使用phpinfo函数
$info=ob_get_contents(); //得到缓冲区的内容并且赋值给$info
$file=fopen(\'info.txt\',\'w\'); //打开文件info.txt
fwrite($file,$info); //写入信息到info.txt
fclose($file); //关闭文件info.txt
?>

用以上的方法,就可以把不同用户的phpinfo信息保存下来,这在以前恐怕没有办法办到!其实上面就是将一些“过程”转化为“函数”的方法!

文章如转载,请注明:转载自:王志博-PHP[http://www.wangzhibo.com/]
本文链接地址:http://www.wangzhibo.com/?p=573