Submitted by gouki on 2012, January 31, 10:04 AM
一个小小的脚本,10分钟写完,没用IDE,没有语法纠错,第一次的时候就在字符串COPY过来的时候因为双引号的问题导致了一点错误。偷笑一下。
该脚本仅为自用,为防止丢失,还是做个备份吧:
PHP代码
- <?php
- set_time_limit(0);
- error_reporting(E_ALL);
- header("Content-type:text/html;charset=utf-8");
- $templateDirname = dirname(__FILE__);
-
- $cssfilename = $templateDirname . "/css/style.css";
- $templateFilename = sprintf("template_%d.html",time());
-
- $templates = array();
- foreach(glob($templateDirname."/*") as $value){
- if(is_file($value) && in_array(strtolower(pathinfo($value,PATHINFO_EXTENSION)), array('html','htm')) && substr(basename($value),0,9) != "template_"){
- $filedata = file_get_contents($value);
- $startPos = strpos($filedata, "<body>") + 6;
- if($startPos == 6){
- continue;
- }
- $endPos = strpos($filedata, "</body>");
- $templates[]= substr($filedata, $startPos , ($endPos-$startPos));
- unset($filedata);
- }
- }
-
- $cssdata = file_get_contents($cssfilename);
-
-
- $templateData = "
- <div id=\"templates\">
- <style type=\"text/css\">
- %s
- </style>
- %s
- </div>
- ";
- $templateInfo = sprintf($templateData,$cssdata,join("\n",$templates));
- $ret = file_put_contents($templateFilename,$templateInfo);
- if($ret != false){
- echo "整合完成,文件名为:",$templateFilename ,"<br />";
- }
- exit;
偷懒了一下,备个份,没有过多的处理,比如自动指定目录啥的。想想也没那么麻烦,就这样解决吧。
PHP | 评论:0
| 阅读:16538
Submitted by gouki on 2012, January 17, 8:59 AM
号码小助手,会自动将号码分析成:AAAB,AABB,ABAB之类的方式。
调用方式:http://ixyz.sinaapp.com/api/phone?h=13912341234,13912123344,13912345678&type=json
默认返回值是json,可支持json,xml,text三种返回形式
号码最多一次传10个
PHPCODE:
esult = file_get_contents('http://ixyz.sinaapp.com/api/phone?h=13912341234,13912123344,13912345678&type=json');
返回值是:
json格式返回:
{"phones":{"13912341234":["ABCD","ABCDABCD"],"13912123344":["ABCD","ABCDABCD","AABB","ABCD","ABAB"],"13912345678":["ABCD","ABCDABCD","AABB","ABCD","ABAB","ABCD"]},"copyright":"Written by walkerlee, api support by gouki","error":"sorry,phone doesn't match"}
xml格式返回:
XML/HTML代码【xml返回的格式结果与json的有一点点不太一样】
- <?xml version='1.0' encoding='UTF-8'?>
- <root>
- <result>
- <phones>
- <phone number="13912341234">
- <ABCD>ABCD</ABCD>
- <ABCDABCD>ABCDABCD</ABCDABCD>
- </phone>
- <phone number="13912123344">
- <ABCD>ABCD</ABCD>
- <AABB>AABB</AABB>
- <ABAB>ABAB</ABAB>
- </phone>
- <phone number="13912345678">
- <ABCD>ABCD</ABCD>
- </phone>
- </phones>
- <copyright><![CDATA[Written by walkerlee, api support by gouki]]></copyright>
- </result>
- </root>
----------
目前支持的类型有:XML/HTML代码
- Array
- (
- [0] => AABB
- [1] => ABCD
- [2] => AAAB
- [3] => ABAB
- [4] => ABCABC
- [5] => ABCDABCD
- [6] => ABBB
- [7] => ABCCBA
- [8] => ABBA
- [9] => AAAA
- [10] => AAAAA
- [11] => AAAAAA
- [12] => AAAAAAA
- [13] => AAAAAAAA
- [14] => ABCDCBA
- [15] => ABCDDCBA
- [16] => ABCBA
- )
---------
以上类型可以根据需要随便加,如果你觉得有哪些规则不错,你可以告诉我(这个正则是自动生成的,因此只要告诉规则就OK了)
嗯,这个程序的核心函数是walkerlee写的,我只是稍稍的封装处理了一下
Tags: sae, php, yii4sae
PHP | 评论:0
| 阅读:15053
Submitted by gouki on 2012, January 6, 10:48 AM
纯笔记,在使用ActiveRecord的时候一点注意事项。
本来在处理缓存的时候想对一些数据做强制缓存的,但结果预想的目标和我不一样。
我的$cachekey = md5(serialize($model).$parameter);
然后在调用的时候发现$model对象中的一些信息都消失了。起初以为参数没有传递,但测试了一下之后发现全部正常,那问题出在哪里呢?
再一步步的调试,发现出在serialize后对象就变了。于是看了一下CActiveRecord的源码,果然发现了源码中有定义__sleep(),纠结啊。
看来以后要注意一下,不能随便把model给序列化了。
Tags: cactiverecord, __sleep, serialize
PHP | 评论:1
| 阅读:19180
Submitted by gouki on 2012, January 6, 9:17 AM
在项目中,难免会在项目中调用一个不存在的类(偶尔,偶尔,当这个类的类名是程序生成的时候,偶尔会出现这种情况啦),在new 这个类时,都会直接报fatal错误,然后程序就终止了,怎么办?怎么避免这种情况发生?
注:下面的例子其实是指有autoload的情况下所触发的。如果没有autoload,也就相当于不会触发一个include文件的操作。直接就报FATAL错误了。而如果有autoload,则是报include文件的错误,这个时候才能被捕获,多谢神仙的指正
于是看手册set_error_handler,调用一个callback,处理完后,在这个方法里重新生成一个空类就OK了。看了一下手册上的例子
PHP代码
- <?php
-
- function myErrorHandler($errno, $errstr, $errfile, $errline)
- {
- if (!(error_reporting() & $errno)) {
-
- return;
- }
-
- switch ($errno) {
- case E_USER_ERROR:
- echo "<b>My ERROR</b> [$errno] $errstr<br />\n";
- echo " Fatal error on line $errline in file $errfile";
- echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
- echo "Aborting...<br />\n";
- exit(1);
- break;
-
- case E_USER_WARNING:
- echo "<b>My WARNING</b> [$errno] $errstr<br />\n";
- break;
-
- case E_USER_NOTICE:
- echo "<b>My NOTICE</b> [$errno] $errstr<br />\n";
- break;
-
- default:
- echo "Unknown error type: [$errno] $errstr<br />\n";
- break;
- }
-
-
- return true;
- }
看了一下,结果,发现只有$errstr中才有类名出现,但还是文件名,难道我要用正则?又仔细看了一下手册,发现callback还有一个第五个参数
XML/HTML代码
- errcontext
- The fifth parameter is optional, errcontext, which is an array that points to the active symbol table at the point the error occurred. In other words, errcontext will contain an array of every variable that existed in the scope the error was triggered in. User error handler must not modify error context.
输入第五个参数,原来,这是一个数组,如果我是类的话,里面就有className这个下标数组,直接就是类名了
同时还有一个很重要的问题,如果callback return false的话,会自动调用原来的出错处理。这 其实是影响我们的操作的。
最终代码如下:
PHP代码
- set_error_handler(function($errno,$errstr,$errfile,$errline,$clsname){
- if(isset($clsname['className'])&&$errno == 2&&!class_exists($clsname['className'])){
- $clsname = $clsname['className'];
- eval("class ".$clsname ." { static public function model(){return null;} }");
- }
- return true;
- },7);
- $result = mmmm::model();
- restore_error_handler();
-
在最后一行恢复了原来的出错处理,不影响原先程序结构。
终于可以直接用了。
Tags: php, eval
PHP | 评论:2
| 阅读:18933
Submitted by gouki on 2011, December 31, 10:45 AM
其实我是真想自己写这一段内容的,只是后来找了找手册,居然不知道在哪一章了。
短路操作符,很容易让人误解是if条件中的 && 或者 ||,但实在不知道从何说起(至于是不是叫短路操作符,我也记不清了,先这么命名吧)
其实这个玩意大家都见过,只是大家都忽略了。想起很久很久以前,所有的参考书上有一段连接数据库的代码:
$conn = mysql_connect(localhost,root,123456) or die('could not connect db');
这段代码,就是一个很简单的例子。
如果能够连接上,就返回$conn,否则直接输出。。。。无非就是将||换成了 or,于是很多人就不认识了罢了。
然后,国内用的最多的这种代码的是某一个论坛,在他们的代码里大量充斥了这种操作符,很多人在第一次看他们的源码时都会比较郁闷。。。这个论坛叫phpwind。
好了,我不多说了,上原文吧:http://feihu.cd00.cn/itweb/index.php/php-duanlu-condition-function
什么是php短路操作,先看下面代码
($f) && f(); 或者
$condition && function();
这是什么用法
短路操作,什么意思呢
如果$f为真,就执行f()函数调用
如果$condition为真,就执行function()函数调用
if ($f) {
f();
}
另找了篇文章来详细说明之
mysql_query($sql) or die(’Execute failed!’);
!file_exists($cache_file) && @update_cache($id);
这两句很像是条件语句,但是准确的说,他们是利用了短路运算符的运算特点来实现的条件语句:
or、||、and、&& 都是短路运算符
&&(and)运算符检查第一个表达式是否返回“flase”,如果是“false”则结束语句并返回“false”,否则检查第二个表达式。
or(||)运算符检查第一个表达式是否返回“true”,如果是“true”则结束语句并返回“true”,否则检查第二个表达式。
该用法正是利用了短路运算符这种特性实现了条件的判断和执行
----------
再看这一篇:http://biancheng.dnbcw.info/perl/241992.html
和C类似,Perl提供 &&(逻辑 AND)和 ||(逻辑 OR)操作符。它们从左向右计算( && 比 || 的优先级稍稍高一点点),测试语句的真假。这些操作符被认为是短路操作符,因为它们是通过计算尽可能少的操作数来判断语句的真假。例如,如果一个 && 操作符的左操作数是假,那么它永远不会计算右操作数,因为操作符的结果就是假,不管右操作数的值是什么。
例子 |
名称 |
结果 |
$a && $b |
And |
如果$a为假则为$a,否则$b |
$a || $b |
Or |
如果$a为真则为$a,否则$b |
这样的短路不仅节约时间,而且还常常用于控制计算的流向。比如,一个经常出现的Perl程序的俗语是:
open(FILE, "somefile") || die "Can't open somefile: $!\n";
在这个例子里,Perl 首先计算 open 函数,如果值是真(somefile 被成功打开),die 函数的执行就不必要了,因此忽略。你可以这么读这句文本“打开文件,要不然就去死!”。
&& 和 || 操作符和 C 不同的是,它们不返回 0 或 1,而是返回最后计算的值。如果是 ||,这个特性好就好在你可以从一系列标量数值中选出第一个为真的值。所以,一个移植性相当好的寻找用户的家目录的方法可能是:
$home = $ENV{HOME}
|| $ENV{LOGDIR}
|| (getpwuid($<)) [7]
|| die "You're homeless!\n";
另一方面,因为左参数总是在标量环境里计算,所以你不能把 || 用于在两个集群之间选择其一进行赋值:
@a = @b || @c; # 这样可不对
@a = scalar(@b) || @c; # 上面那句实际上是这个意思,@a 里只有 @b 最后的元素
@a = @b ? @b : @c; # 这个是对的
Perl 还提供优先级比较低的 and 和 or 操作符,这样程序的可读性更好而且不会强迫你在列表操作符上使用圆括弧。它们也是短路的。
Tags: 短路操作
PHP | 评论:0
| 阅读:16358