偷懒巧用PHP

来源:互联网 发布:万能淘宝店名怎么取 编辑:程序博客网 时间:2024/04/27 14:00

前一段时间,遇到这么个需求:用户想设定一个周期,比如3天或7天或15天,然后按照他设定的周期,某脚本去自动更新数据库里的某些数据。其他条件是,他有可能随时调整这个周期,但调整不会太频繁。

这个需求其实不难,解决办法也多多,比如你可以把他设定的周期写到一文本文件里,然后读写该文本,也可以存到数据库某个表里,然后读写数据库。

这两种方法都涉及到了一个问题:IO。不论是文件IO还是数据库IO,都是要有一定开销的。PV少时,无所谓,要是多了呢?

当然还有办法。

session,可以把它存到session中,会很快的。但有个前提,你不能重启apache服务器,不然就全完了。可谁能保证不重启服务器呢?

还可以用缓存。反正他不常改这个周期,我们就把它cache好了,如果cache过期或为空,再去文本或db中取,这也是个不错的办法。

可我很懒,我不爱装cache。我也很穷,我的机器没那么多内存。

于是我就想出来另外一个方法。

用户在提交设定的周期时,我将其写入另外一个文件,一个php文件,该文件其实就是定义了一个变量,且将其赋值为用户提交的周期,然后所有用到该周期的php文件,都让它们include这个php文件好了,这样,它们读取的就只是一个变量,那速度肯定是要快的了。

怎么样?听糊涂了没?听糊涂就对了。

我演示一下,其实你就明白了。

表单提交后的处理代码:

 

$days = isset($_REQUEST["days"])&&trim($_REQUEST["days"])?trim($_REQUEST["days"]):"1";//默认为1天

$fp = fopen("config.php", 'w');
$phpcode = "<?php/n";

$phpcode.= '$condition'."['days']={$days};/n";

$phpcode.= '?>';
fwrite($fp,$phpcode);
fclose($fp);

 

这样用户提交后,就自动生成了一个config.php,该php的内容是什么,不用我说了吧。

当你需要用到用户指的周期时,只需

include "config.php";

echo $condition['days'];

怎么样?是不是比读文本要快呢?

 

当然这种方式有极大的风险:如果用户更改的频率很高,那么你就得考虑文件加锁的问题,如果用户要存储的变量很多很长,你还要考虑文件写到一半时,浏览器端来了request怎么办。个人想想,可以先往个临时文件中写,写完了mv过来。还有就是用户提交的包括php的保留字符如双引号单引号之类的,记得一定要转义。

 

一句话,特殊情况特殊对待,这种特殊的需求加上我特殊的懒惰,才有了这种特殊的方法,较真的,请绕行。呵呵。