处理大数据的时候可以采用分段加载的方法
test.php
limit一下数据
然后在执行一段后添加以下代码
1 | echo '<meta http-equiv="refresh" content="5; url=http://www.coolaj.cn/test.php?begin=xx">' ; |
处理大数据的时候可以采用分段加载的方法
test.php
limit一下数据
然后在执行一段后添加以下代码
1 | echo '<meta http-equiv="refresh" content="5; url=http://www.coolaj.cn/test.php?begin=xx">' ; |
1 /etc/crontab文件
在/etc目录下有一个crontab文件,这里存放有系统运行的一些调度程序。每个用户可以建立自己的调度crontab。
如:
[root@dave ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
2 /etc/cron.deny和/etc/cron.allow文件
/etc/cron.deny表示不能使用crontab命令的用户
/etc/cron.allow表示能使用crontab的用户。
如果两个文件同时存在,那么/etc/cron.allow优先。
如果两个文件都不存在,那么只有超级用户可以安排作业。
每个用户都会生成一个自己的crontab文件。这些文件在/var/spool/cron目录下:
如:
[root@dave ~]# cd /var/spool/cron
[root@dave cron]# ls
oracle root
我们直接查看这个文件,里面的内容和对应用户显示的crontab -l一致。
[root@dave cron]# cat oracle
00 6 * * * /u02/scripts/del_st_archive.sh >/u02/scripts/del_st_arch.log 2>&1
[root@dave cron]# cat root
0 12 * * * /root/bin/sync-clock.sh
[root@dave cron]#
Crontab使用说明
1 Crontab语法
usage: crontab [-u user] file
crontab [-u user] [ -e | -l | -r ]
(default operation is replace, per 1003.2)
-e (edit user’s crontab)
-l (list user’s crontab)
-r (delete user’s crontab)
-i (prompt before deleting user’s crontab)
-s (selinux context)
其中,file是命令文件的名字。如果在命令行中指定了这个文件,那么执行crontab命令,则将这个文件拷贝到crontabs目录下;如果在命令行中没有制定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将他们也存放在crontab目录下。
帮助:
[root@dave ~]# man crontab
CRONTAB(1) CRONTAB(1)
NAME
crontab – maintain crontab files for individual users (ISC Cron V4.1)
SYNOPSIS
crontab [-u user] file
crontab [-u user] [-l | -r | -e] [-i] [-s]
2 Crontab格式说明
我们可以用crontab -e添加要执行的命令。命令执行的结果,无论是标准输出还是错误输出,都将以邮件形式发给用户。
添加的命令必须以如下格式:
* * * * * /command path
前五个字段可以取整数值,指定何时开始工作,第六个域是字符串,即命令字段,其中包括了crontab调度执行的命令。各个字段之间用spaces和tabs分割。
前5个字段分别表示:
分钟:0-59
小时:1-23
日期:1-31
月份:1-12
星期:0-6(0表示周日)
还可以用一些特殊符号:
*:表示任何时刻
,: 表示分割
-:表示一个段,如第二端里:1-5,就表示1到5点
/n :表示每个n的单位执行一次,如第二段里,*/1,就表示每隔1个小时执行一次命令。也可以写成1-23/1.
一些示例:
00 8,12,16 * * * /data/app/scripts/monitor/df.sh
30 2 * * * /data/app/scripts/hotbackup/hot_database_backup.sh
10 8,12,16 * * * /data/app/scripts/monitor/check_ind_unusable.sh
10 8,12,16 * * * /data/app/scripts/monitor/check_maxfilesize.sh
10 8,12,16 * * * /data/app/scripts/monitor/check_objectsize.sh
43 21 * * * 21:43执行
15 05 * * * 05:15执行
0 17 * * * 17:00执行
0 17 * * 1每周一的17:00执行
0,10 17 * * 0,2,3每周日,周二,周三的17:00和17:10执行
0-10 17 1 * *毎月1日从17:00到7:10毎隔1分钟执行
0 0 1,15 * 1毎月1日和15日和一日的0:00执行
42 4 1 * * 毎月1日的4:42分执行
0 21 * * 1-6 周一到周六21:00执行
0,10,20,30,40,50 * * * * 每隔10分执行
*/10 * * * * 每隔10分执行
* 1 * * * 从1:0到1:59每隔1分钟执行
0 1 * * * 1:00执行
0 */1 * * * 毎时0分每隔1小时执行
0 * * * * 毎时0分每隔1小时执行
2 8-20/3 * * * 8:02,11:02,14:02,17:02,20:02执行
30 5 1,15 * * 1日和15日的5:30执行
3 &后台执行命令
当在前台运行某个作业时,终端被该作业占据;而在后台运行作业时,它不会占据终端。可以使用&命令把作业放到后台执行。
如:30 2 * * * /data/app/scripts/hotbackup/hot_database_backup.sh &
在后台运行作业时要当心:需要用户交互的命令不要放在后台执行,因为这样你的机器就会在那里傻等。
不过,作业在后台运行一样会将结果输出到屏幕上,干扰你的工作。如果放在后台运行的作业会产生大量的输出,最好使用下面的方法把它的输出重定向到某个文件中:
如:command >out.file 2>&1 &
在这个例子中,2>&1表示所有的标准输出和错误输出都将被重定向到一个叫做out.file的文件中。
4 2>&1含义
先看一个例子:
0 2 * * * /u01/test.sh >/dev/null 2>&1 &
这句话的意思就是在后台执行这条命令,并将错误输出2重定向到标准输出1,然后将标准输出1全部放到/dev/null文件,也就是清空。
在这里有有几个数字的意思:
0表示键盘输入
1表示标准输出
2表示错误输出.
我们也可以这样写:
0 2 * * * /u01/test.sh >/u01/out.file & –这里没写,默认是1
0 2 * * * /u01/test.sh 1>/u01/out.file &
0 2 * * * /u01/test.sh 2>/u01/out.file &
0 2 * * * /u01/test.sh 2>/u01/out.file 2>&1 &
将tesh.sh命令输出重定向到out.file,即输出内容不打印到屏幕上,而是输出到out.file文件中。
2>&1是将错误输出重定向到标准输出。然后将标准输入重定向到文件out.file。
&1表示的是文件描述1,表示标准输出,如果这里少了&就成了数字1,就表示重定向到文件1。
&:后台执行
测试:
ls 2>1:不会报没有2文件的错误,但会输出一个空的文件1;
ls xxx 2>1:没有xxx这个文件的错误输出到了1中;
ls xxx 2>&1:不会生成1这个文件了,不过错误跑到标准输出了;
ls xxx >out.txt 2>&1 == ls xxx 1>out.txt 2>&1; 因为重定向符号>默认是1,这句就把错误输出和标准输出都传到out.txt文件中。
5 2>&1写在后面的原因
格式:command > file 2>&1 == command 1> file 2>&1
首先是command > file将标准输出重定向到file中,2>&1是标准错误拷贝了标准输出,也就是同样被重定向到file中,最终结果就是标准输出和错误都被重定向到file中。
如果改成:command 2>&1 >file
2>&1标准错误拷贝了标准输出的行为,但此时标准输出还是在终端。>file后输出才被重定向到file,但标准错误仍然保持在终端。
//—————————————————————–
1、[root@www opt]# vim /etc/crontab
在crontab文件中加入下面的内容:
0 3 * * * root sh /usr/local/sh/update_yuce.sh
2、update_yuce.sh文件的内容为:
#!/bin/bash
/usr/local/php/bin/php /usr/local/www/spider/update_yuce.php >> /usr/local/sh/update_yuce.log
其中/usr/local/php/bin/php表示php引擎所在的目录,
/usr/local/www/spider/update_yuce.php表示PHP文件所在的位置
/usr/local/sh/update_yuce.log为日志文件
以上即可实现定时执行某个PHP文件,也可用下面的类似方法:
[root@www opt]# vim /etc/crontab
在crontab文件中加入下面的内容:
0 3 * * * cd /usr/local/www/spider /usr/local/bin/php ./update_yuce.php
crontab 的补充说明
根用户以外的用户可以使用 crontab 工具来配置 cron 任务。所有用户定义的 crontab 都被保存在 /var/spool/cron 目录中,并使用创建它们的用户身份来执行。要以某用户身份创建一个 crontab 项目,登录为该用户,然后键入 crontab -e 命令,使用由 VISUAL 或 EDITOR 环境变量指定的编辑器来编辑该用户的 crontab。该文件使用的格式和 /etc/crontab 相同。当对 crontab 所做的改变被保存后,该 crontab 文件就会根据该用户名被保存,并写入文件 /var/spool/cron/username 中。
cron 守护进程每分钟都检查 /etc/crontab 文件、etc/cron.d/ 目录、以及 /var/spool/cron 目录中的改变。如果发现了改变,它们就会被载入内存。这样,当某个 crontab 文件改变后就不必重新启动守护进程了。
控制对 cron 的使用
/etc/cron.allow 和 /etc/cron.deny 文件被用来限制对 cron 的使用。这两个使用控制文件的格式都是每行一个用户。两个文件都不允许空格。如果使用控制文件被修改了,cron 守护进程(crond)不必被重启。使用控制文件在每次用户添加或删除一项 cron 任务时都会被读取。
无论使用控制文件中的规定如何,根用户都总是可以使用 cron。
如果 cron.allow 文件存在,只有其中列出的用户才被允许使用 cron,并且 cron.deny 文件会被忽略。
如果 cron.allow 文件不存在,所有在 cron.deny 中列出的用户都被禁止使用 cron。
启动和停止服务
//————————————————————————————-
*/1 * * * * root sh /usr/local/www/test/bat/task.sh
task.sh文件
#!/bin/bash
wget –spider http://www.xxx.com/event/bmcevent
date >> /usr/local/www/test/bat/crontab.log #记录执行时间
服务器安装php环境
下载 android-sdk-windows 下载JDK
1.打开zip支持 c:/windows/php.ini ,打开 exec
2.apk 支持
mime添加 .apk application/vnd.android.package-archive
3.安装javaSDK(要和android的编辑版本一致)
4.编辑IIS绑定权限(www:www) ,目录没有权限会导致生成失败
5.配置两个虚拟主机
A:down.coolaj.cn 用于下载
B:make.cookaj.cn 用于制作签名
6. down的index.php
01 | <?php |
02 | /* |
03 | * Created on 2012-5-21 |
04 | * coolaj.cn |
05 | */ |
06 |
07 | // var_dump($id); |
08 |
09 | function cocode() { |
10 |
11 | foreach ( $_GET as $k => $v ){ |
12 | $id = $k ; |
13 | break ; |
14 | } |
15 | if ( $_GET [ 'u' ]){ |
16 | $id = $_GET [ 'u' ]; |
17 | } |
18 | if ( is_numeric ( $id )){ |
19 | return $id ; |
20 | } elseif ( $id && preg_match( '/^U/' , $id )) { |
21 | $id = base64_decode ( substr ( $id ,1). '=' )>>2; |
22 | return $id ; |
23 | } |
24 | } |
25 |
26 | $id = cocode(); |
27 |
28 | if ( file_exists ( 'bbshenqi' . $id . ".apk" ) || empty ( $id )){ |
29 | if ( empty ( $id )){ |
30 | header( 'Location: http://www.coolaj.cn/bbshenqi.apk' ); |
31 | exit ; |
32 | } |
33 | header( 'Location: http://down.coolaj.cn/bbshenqi' . $id . '.apk' ); |
34 | } else { |
35 | $cc = file_get_contents ( "http://make.coolaj.cn/makeapk.php?apkname=" . $id . '&r=简单加密' ); |
36 | if ( $cc == 'ok' ){ |
37 | if ( file_exists ( 'bbshenqi' . $id . ".apk" )){ |
38 | echo '<meta http-equiv="content-type" content="text/html; charset=gbk" />' ; |
39 | echo '<a href="http://down.coolaj.cn/bbshenqi' . $id . '.apk">生成失败,点击重试</a>' ; |
40 | exit ; |
41 | } |
42 | header( 'Location: http://down.coolaj.cn/bbshenqi' . $id . '.apk' ); |
43 | } |
44 | } |
45 |
46 | ?> |
01 | <SCRIPT LANGUAGE= "JavaScript" > |
02 | <!-- |
03 | var maxtime = 60*60 //一个小时,按秒计算,自己调整! |
04 | function CountDown(){ |
05 | if (maxtime>=0){ |
06 | minutes = Math.floor(maxtime/60); |
07 | while (minutes>=60){ |
08 | minutes = Math.floor(minutes-60); |
09 | } |
10 | seconds = Math.floor(maxtime%60); |
11 | hour = Math.floor(maxtime/3600); |
12 | msg = "<span id='RemainD'>" +hour+ "</span>小时<span>" +minutes+ "</span>分钟<span>" +seconds+ "</span>秒" ; |
13 | document.all[ "timer" ].innerHTML=msg; |
14 | if (maxtime == 5*60) alert( '注意,还有5分钟!' ); |
15 | --maxtime; |
16 | } |
17 | else { |
18 | clearInterval(timer); |
19 | alert( "时间到,结束!" ); |
20 | } |
21 | } |
22 | timer = setInterval( "CountDown()" ,1000); |
23 | //--> |
24 | </SCRIPT> |
25 | <div id= "timer" style= "color:red" ></div> |
01 | static function make_yqm( $length = 5){ |
02 | // 密码字符集,可任意添加你需要的字符 |
03 | $chars = array ( 'a' , 'b' , 'c' , 'd' , 'e' , 'f' , 'g' , 'h' , 'i' , 'j' , 'k' , 'l' , 'm' , 'n' , 'o' , 'p' , 'q' , 'r' , 's' , 't' , 'u' , 'v' , 'w' , 'x' , 'y' , 'z' , 'A' , 'B' , 'C' , 'D' , 'E' , 'F' , 'G' , 'H' , 'I' , 'J' , 'K' , 'L' , 'M' , 'N' , 'O' , 'P' , 'Q' , 'R' , 'S' , 'T' , 'U' , 'V' , 'W' , 'X' , 'Y' , 'Z' , '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' , '!' , '@' , '#' , '$' , '%' , '^' , '&' , '*' , '(' , ')' , '-' , '_' , '[' , ']' , '{' , '}' , '<' , '>' , '~' , '`' , '+' , '=' , ',' , '.' , ';' , ':' , '/' , '?' ); |
04 |
05 | // 在 $chars 中随机取 $length 个数组元素键名 |
06 | $keys = array_rand ( $chars , $length ); |
07 | $password = '' ; |
08 | for ( $i =0; $i < $length ; $i ++){ |
09 | // 将 $length 个数组元素连接成字符串 |
10 | $password .= $chars [ $keys [ $i ]]; |
11 | } |
12 | return $password ; |
13 | } |
一直把PHP当web端服务程序了,不知道他也是脚本,脚本啊,亲
配置说明
①. 添加php目录到系统环境变量path
②.
param1,param2,为参数。xxx.php文件可以接受传入的这两个参数,分别用$argv[1],$argv[2]接受传入的param1和param2.。
示例xxx.php:
1 | <?php |
2 | for ( $i = $argv [1]; $i <= $argv [2]; $i ++) |
3 | { |
4 | echo $i . "\n" ; |
5 | } |
6 | ?> |
在命令行下运行:php xxx.php 1 10
则输出:1 2 3 4 5 6 7 8 9 10
您可以设置cookie,管理数字签名和重定向用户,而且它提供了极好的连通性到其它数据库(还有ODBC),集成各种外部库来做用PDF文档解析 XML的任何事情。那你还知道可以用php的强大功能做点别的东西吗?在以独立的cgi方式运行时,需要一个php可执行程序,他有很多PHP命令行参数 的,有些可以用作很好玩的用途,下面是全部的PHP命令行参数,其中[]表示可有可无的,<>表是一定要的。
用法 php [-q] [-h] [-s] [-v] [-i] [-f ] | { [args…]} -q 安静模式。不输出HTTP头。
-s 将php程序文件用转化为彩色格式的HTML(比如保留字用绿色,函数和变量为蓝色,注释为黄色而字串则是红色等等。
-f 读入并解释指明的文件。
-c 在中读入php.ini文件
-a 交互式运行
-d foo[=bar] 定义ini中的输入项 foo 的值为 bar
-e 输出额外信息以便调试和性能分析
-z 调入Zend扩展文件
-i php的相关信息
-h help本身。
1.用php -q 文件名.php 方式把php程序当shell程序来用,
2.用 -s把自己的php程序html化。这样是不是很省心?
3.利用PHP命令行参数的odbc功能可以在shell命令中对数据库进行操作。
③一个读取数据并插入到数据库的例子
01 | <?php |
02 | $Host = "localhost" ; |
03 | $Database = "test" ; |
04 | $DbaUser = "root" ; |
05 | $DbaPassword = "" ; |
06 | $db = mysql_pconnect( $Host , $DbaUser , $DbaPassword ); |
07 | mysql_set_charset( 'utf8' , $db ); |
08 | if (! $db ){ |
09 | echo "我擦,数据库崩溃了~" ; |
10 | exit ; |
11 | } |
12 | mysql_select_db( $Database , $db ); |
13 | /*while($res = mysql_fetch_array($result)){var_dump($res);}*/ |
14 | $handle = @ fopen ( "F:/wamp/www/bb/ok_all0525.txt" , "r" ); |
15 | if ( $handle ) { |
16 | while (! feof ( $handle )) { |
17 | $str = fgets ( $handle , 4096); |
18 | $arr = explode ( "," , $str ); |
19 | $qq = explode ( "@" , $arr [0]); |
20 | $query = "INSERT INTO `qq` (`qq`,`b1`,`b2`,`b3`) VALUES ('{$qq[0]}','{$arr[1]}','{$arr[2]}','{$arr[3]}')" ; |
21 | $result = mysql_query( $query ); |
22 | var_dump( $qq [0]. $result ); |
23 | } |
24 | echo 'ok' ; |
25 | } |
26 |
27 | mysql_close( $db ); |
28 | ?> |
1.将waf.php传到要包含的文件的目录
2.在页面中加入防护,有两种做法,根据情况二选一即可:
a).在所需要防护的页面加入代码
require_once(‘waf.php’);
就可以做到页面防注入、跨站
如果想整站防注,就在网站的一个公用文件中,如数据库链接文件config.inc.php中!
添加require_once(‘waf.php’);来调用本代码
常用php系统添加文件
PHPCMS V9 \phpcms\base.php
PHPWIND8.7 \data\sql_config.php
DEDECMS5.7 \data\common.inc.php
DiscuzX2 \config\config_global.php
Wordpress \wp-config.php
Metinfo \include\head.php
b).在每个文件最前加上代码
在php.ini中找到:
Automatically add files before or after any PHP document.
auto_prepend_file = waf.php路径;
代码如下:
01 | <?php |
02 | /*云体检通用漏洞防护补丁v1.0 |
03 | 更新时间:2013-04-25 |
04 | 功能说明:防护XSS,SQL,代码执行,文件包含等多种高危漏洞 |
05 | */ |
06 | $url_arr = array ( |
07 | 'xss' => "\=\+\/v(8|9|\+|\/)|%0acontent\-(id|location|type|transfer\-encoding)" , |
08 | ); |
09 | $args_arr = array ( |
10 | 'xss' => "[\'\"\;\*\<\>]+.*\b(on)[a-zA-Z]{3,15}[\s\r\n\v\f]*\=|\b(expression)\(|<script[\s\\\\\/]*.*>|(<!\[cdata\[)|\b(eval|alert|prompt|msgbox)\s*\(|url\((\#|data|javascript)" , |
11 | 'sql' => "([^{\s]{1}.+(select|update|insert((\/\*[\S\s]*?\*\/)|(\s)|(\+))+into).+?(from|set)((\/\*[\S\s]*?\*\/)|(\s)|(\+))+)|[^{\s]{1}.+(create|delete|drop|truncate|rename|desc)((\/\*[\S\s]*?\*\/)|(\s)|(\+))+(table|from|database)((\/\*[\S\s]*?\*\/)|(\s)|(\+))|(into((\/\*[\S\s]*?\*\/)|\s|\+)+(dump|out)file\b)|\bsleep\((\s*)(\d*)(\s*)\)|benchmark\(([^\,]*)\,([^\,]*)\)|\b(declare|set|select)\b.*@|union\b.*(select|all)\b|(select|update|insert|create|delete|drop|grant|truncate|rename|exec|desc|from|table|database|set|where)\b.*((charset|ascii|bin|char|uncompress|concat|concat_ws|conv|export_set|hex|instr|left|load_file|locate|mid|sub|substring|oct|reverse|right|unhex)\(|(master\.\.sysdatabases|msysaccessobjects|msysqueries|sysmodules|mysql\.db|sys\.database_name|information_schema\.|sysobjects|sp_makewebtask|xp_cmdshell|sp_oamethod|sp_addextendedproc|sp_oacreate|xp_regread|sys\.dbms_export_extension))" , |
12 | 'other' => "(..)[^&]*((%2500)|(%00))+[^0-9a-fA-F]|((%2500)|(%00))+[\'\"\.]+" |
13 | ); |
14 | $referer = empty ( $_SERVER [ 'HTTP_REFERER' ]) ? array () : array ( $_SERVER [ 'HTTP_REFERER' ]); |
15 | $query_string = empty ( $_SERVER [ "QUERY_STRING" ]) ? array () : array ( $_SERVER [ "QUERY_STRING" ]); |
16 |
17 | check_data( $query_string , $url_arr ); |
18 | check_data( $_GET , $args_arr ); |
19 | check_data( $_POST , $args_arr ); |
20 | check_data( $_COOKIE , $args_arr ); |
21 | check_data( $referer , $args_arr ); |
22 | function W_log( $log ) |
23 | { |
24 | $logpath = $_SERVER [ "DOCUMENT_ROOT" ]. "/log.txt" ; |
25 | $log_f = fopen ( $logpath , "a+" ); |
26 | fputs ( $log_f , $log . "\r\n" ); |
27 | fclose( $log_f ); |
28 | } |
29 | function check_data( $arr , $v ) { |
30 | foreach ( $arr as $key => $value ) |
31 | { |
32 | if (! is_array ( $key )) |
33 | { check( $key , $v );} |
34 | else |
35 | { check_data( $key , $v );} |
36 |
37 | if (! is_array ( $value )) |
38 | { check( $value , $v );} |
39 | else |
40 | { check_data( $value , $v );} |
41 | } |
42 | } |
43 | function check( $str , $v ) |
44 | { |
45 | foreach ( $v as $key => $value ) |
46 | { |
47 | if (preg_match( "/" . $value . "/is" , $str )==1||preg_match( "/" . $value . "/is" ,urlencode( $str ))==1) |
48 | { |
49 | //W_log("<br>IP: ".$_SERVER["REMOTE_ADDR"]."<br>时间: ".strftime("%Y-%m-%d %H:%M:%S")."<br>页面:".$_SERVER["PHP_SELF"]."<br>提交方式: ".$_SERVER["REQUEST_METHOD"]."<br>提交数据: ".$str); |
50 | print "您的提交带有不合法参数,谢谢合作" ; |
51 | exit (); |
52 | } |
53 | } |
54 | } |
55 | ?> |
php的 curl 和 SSL (open_ssl)这两个模块开启
01 | <?php |
02 | //服务器二次验证代码 |
03 | function getReceiptData( $receipt , $isSandbox = false) |
04 | { |
05 | if ( $isSandbox ) { |
06 | $endpoint = 'https://sandbox.itunes.apple.com/verifyReceipt' ; |
07 | } |
08 | else { |
09 | $endpoint = 'https://buy.itunes.apple.com/verifyReceipt' ; |
10 | } |
11 |
12 | $postData = json_encode( |
13 | array ( 'receipt-data' => $receipt ) |
14 | ); |
15 |
16 | $ch = curl_init( $endpoint ); |
17 | curl_setopt( $ch , CURLOPT_RETURNTRANSFER, true); |
18 | curl_setopt( $ch , CURLOPT_POST, true); |
19 | curl_setopt( $ch , CURLOPT_POSTFIELDS, $postData ); |
20 | //这两行一定要加,不加会报SSL 错误 |
21 | curl_setopt ( $ch , CURLOPT_SSL_VERIFYPEER, 0); |
22 | curl_setopt ( $ch , CURLOPT_SSL_VERIFYHOST, 0); |
23 |
24 | $response = curl_exec( $ch ); |
25 | $errno = curl_errno( $ch ); |
26 | $errmsg = curl_error( $ch ); |
27 | curl_close( $ch ); |
28 | //判断时候出错,抛出异常 |
29 | if ( $errno != 0) { |
30 | throw new Exception( $errmsg , $errno ); |
31 | } |
32 |
33 | $data = json_decode( $response ); |
34 | //判断返回的数据是否是对象 |
35 | if (! is_object ( $data )) { |
36 | throw new Exception( 'Invalid response data' ); |
37 | } |
38 | //判断购买时候成功 |
39 | if (!isset( $data ->status) || $data ->status != 0) { |
40 | throw new Exception( 'Invalid receipt' ); |
41 | } |
42 |
43 | //返回产品的信息 |
44 | return array ( |
45 | 'quantity' => $data ->receipt->quantity, |
46 | 'product_id' => $data ->receipt->product_id, |
47 | 'transaction_id' => $data ->receipt->transaction_id, |
48 | 'purchase_date' => $data ->receipt->purchase_date, |
49 | 'app_item_id' => $data ->receipt->app_item_id, |
50 | 'bid' => $data ->receipt->bid, |
51 | 'bvrs' => $data ->receipt->bvrs |
52 | ); |
53 | } |
54 |
55 | //获取 App 发送过来的数据,设置是否是沙盒状态 |
56 | $receipt = $_GET [ 'data' ]; |
57 | $isSandbox = true; |
58 | //开始执行验证 |
59 | try |
60 | { |
61 | $info = getReceiptData( $receipt , $isSandbox ); |
62 | // 通过product_id 来判断是下载哪个资源 |
63 | switch ( $info [ 'product_id' ]){ |
64 | case 'com.application.xxxxx.xxxx' : |
65 | Header( "Location:xxxx.zip" ); |
66 | break ; |
67 | } |
68 | } |
69 | //捕获异常 |
70 | catch (Exception $e ) |
71 | { |
72 | echo 'Message: ' . $e ->getMessage(); |
73 | } |
74 | ?> |
面向对象知识总结
1:如何写一个类
2:类的属性和方法的声明和调用(内部、外部)
3:构造函数与析构函数
4:继承 (继承是单继承,并且是单方向的继承)
如果一个属性或者方法被定义为private,则它不能被继承
使用parent关键字允许调用父类的方法。
5: 函数的重载
6:访问修饰符
类内部 类外部 子类中
public yes yes yes
protected yes no yes
private yes no no
7:使用final关键字定义的类,禁止继承。
使用final关键字定义的方法,禁止重载。
8: 接口,php不能多继承,但是可以通过实现多个接口来弥补。
接口中只能包含未实现的成员方法,接口内不能包含任何成员属性。
9: php4中对象是按照值传递的,而到了php5,对象是按照引用传递的。这样就大大的提高的效率
10: 使用 const 关键字来定义常量。
在类的内部通过 self::常量名
类的外部通过 类名::常量名,来访问
11:使用 static 关键字来定义一个静态的方法,静态方法可以通过 类名::方法名来访问
注意:在一个静态的方法中,不能使用this关键字,因为可能会没有可以引用的对象实例。
父类中的静态方法,如果要在子类中重载,那子类中的该方法必须也是静态的方法。
12:静态属性、静态方法、常量 在类的内部调用统一使用 self::要调用的
在类的外部使用 类名::要调用的
13:instanceof 关键字可以检查类的类型和类型提示。
可以检查一个对象是否是特定类的实例,是否是从某个类继承过来或者是否实现了某个类。
14:单继承但是可以实现多个接口。书写格式例如: class man extends person implements ps,hello
15: clone 关键字来克隆(复制)一个对象。
php5中的对象都是按照引用传递的,如果单纯的通过赋值的方式传递 ($p2 = $p ),
其实这是一种引用传值,如果要实现拷贝一个对象的功能,就必须通过clone来实现。
16:abstract 关键字来定义个一个抽象类或者抽象方法。抽象类不能被实例化。
17:接口和抽象类的区分
(1)抽象类只允许单继承,而接口可以多实现
(2)抽象类中可以有成员属性和成员方法,而接口中只能有未实现的方法。
01 | <?php |
02 | // Set the content-type |
03 | header( "Content-type: image/jpeg" ); |
04 |
05 | // Create the image |
06 | $im = imagecreatetruecolor(400, 300); |
07 |
08 | // Create some colors |
09 | $white = imagecolorallocate( $im , 255, 255, 255); |
10 | $grey = imagecolorallocate( $im , 128, 128, 128); |
11 | imagefilledrectangle( $im , 0, 0, 399, 299, $white ); |
12 |
13 | // The text to draw |
14 | $a = array ( '是' , '个' , '大' , '帅' , '哥' , '的' , '家' , '吕' , '朴' , '作' , '者' ); |
15 | $tmp = array_rand ( $a ,4); |
16 |
17 | $text = $a [ $tmp [0]]. $a [ $tmp [1]]. $a [ $tmp [2]]. $a [ $tmp [3]]; // '中文'; |
18 | // Replace path by your own font path |
19 | $font = 'simhei.ttf' ; |
20 | //$text=iconv('gb2312','utf-8','面对对象'); |
21 |
22 | // Add some shadow to the text |
23 | imagettftext( $im , 20, 30, 21, 200, $grey , $font , $a [ $tmp [0]]); |
24 | imagettftext( $im , 20, -30, 61, 200, $grey , $font , $a [ $tmp [1]]); |
25 | imagettftext( $im , 20, 30, 101, 200, $grey , $font , $a [ $tmp [2]]); |
26 | imagettftext( $im , 20, -30, 141, 200, $grey , $font , $a [ $tmp [3]]); |
27 |
28 | // Using imagepng() results in clearer text compared with imagejpeg() |
29 | imagejpeg( $im ); |
30 | imagedestroy( $im ); |
31 | ?> |