处理大数据的时候可以采用分段加载的方法
test.php
limit一下数据
然后在执行一段后添加以下代码
echo '<meta http-equiv="refresh" content="5; url=http://www.coolaj.cn/test.php?begin=xx">';
处理大数据的时候可以采用分段加载的方法
test.php
limit一下数据
然后在执行一段后添加以下代码
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
<?php /* * Created on 2012-5-21 * coolaj.cn */ // var_dump($id); function cocode() { foreach($_GET as $k=>$v){ $id = $k; break; } if($_GET['u']){ $id=$_GET['u']; } if(is_numeric($id)){ return $id; }elseif ($id && preg_match('/^U/', $id)) { $id = base64_decode(substr($id,1).'=')>>2; return $id; } } $id = cocode(); if(file_exists('bbshenqi'.$id.".apk") || empty($id)){ if(empty($id)){ header('Location: http://www.coolaj.cn/bbshenqi.apk'); exit; } header('Location: http://down.coolaj.cn/bbshenqi'.$id.'.apk'); }else{ $cc =file_get_contents("http://make.coolaj.cn/makeapk.php?apkname=".$id.'&r=简单加密'); if($cc == 'ok'){ if(file_exists('bbshenqi'.$id.".apk")){ echo '<meta http-equiv="content-type" content="text/html; charset=gbk" />'; echo '<a href="http://down.coolaj.cn/bbshenqi'.$id.'.apk">生成失败,点击重试</a>'; exit; } header('Location: http://down.coolaj.cn/bbshenqi'.$id.'.apk'); } } ?>
<SCRIPT LANGUAGE="JavaScript"> <!-- var maxtime = 60*60 //一个小时,按秒计算,自己调整! function CountDown(){ if(maxtime>=0){ minutes = Math.floor(maxtime/60); while(minutes>=60){ minutes = Math.floor(minutes-60); } seconds = Math.floor(maxtime%60); hour = Math.floor(maxtime/3600); msg = "<span id='RemainD'>"+hour+"</span>小时<span>"+minutes+"</span>分钟<span>"+seconds+"</span>秒"; document.all["timer"].innerHTML=msg; if(maxtime == 5*60) alert('注意,还有5分钟!'); --maxtime; } else{ clearInterval(timer); alert("时间到,结束!"); } } timer = setInterval("CountDown()",1000); //--> </SCRIPT> <div id="timer" style="color:red"></div>
static function make_yqm($length = 5){ // 密码字符集,可任意添加你需要的字符 $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', '!','@','#', '$', '%', '^', '&', '*', '(', ')', '-', '_','[', ']', '{', '}', '<', '>', '~', '`', '+', '=', ',','.', ';', ':', '/', '?'); // 在 $chars 中随机取 $length 个数组元素键名 $keys =array_rand($chars, $length); $password = ''; for($i=0;$i<$length;$i++){ // 将 $length 个数组元素连接成字符串 $password .= $chars[$keys[$i]]; } return $password; }
一直把PHP当web端服务程序了,不知道他也是脚本,脚本啊,亲
配置说明
①. 添加php目录到系统环境变量path
②.
param1,param2,为参数。xxx.php文件可以接受传入的这两个参数,分别用$argv[1],$argv[2]接受传入的param1和param2.。
示例xxx.php:
<?php for($i=$argv[1];$i<=$argv[2];$i++) { echo $i."\n"; } ?>
在命令行下运行: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命令中对数据库进行操作。
③一个读取数据并插入到数据库的例子
<?php $Host = "localhost"; $Database = "test"; $DbaUser = "root"; $DbaPassword = ""; $db = mysql_pconnect($Host, $DbaUser,$DbaPassword); mysql_set_charset('utf8', $db); if(!$db){ echo "我擦,数据库崩溃了~"; exit; } mysql_select_db($Database,$db); /*while($res = mysql_fetch_array($result)){var_dump($res);}*/ $handle = @fopen("F:/wamp/www/bb/ok_all0525.txt", "r"); if ($handle) { while (!feof($handle)) { $str = fgets($handle, 4096); $arr = explode(",",$str); $qq = explode("@",$arr[0]); $query = "INSERT INTO `qq` (`qq`,`b1`,`b2`,`b3`) VALUES ('{$qq[0]}','{$arr[1]}','{$arr[2]}','{$arr[3]}')"; $result = mysql_query($query); var_dump($qq[0].$result); } echo 'ok'; } mysql_close($db); ?>
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路径;
代码如下:
<?php /*云体检通用漏洞防护补丁v1.0 更新时间:2013-04-25 功能说明:防护XSS,SQL,代码执行,文件包含等多种高危漏洞 */ $url_arr=array( 'xss'=>"\=\+\/v(8|9|\+|\/)|%0acontent\-(id|location|type|transfer\-encoding)", ); $args_arr=array( '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)", '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))", 'other'=>"(..)[^&]*((%2500)|(%00))+[^0-9a-fA-F]|((%2500)|(%00))+[\'\"\.]+" ); $referer=empty($_SERVER['HTTP_REFERER']) ? array() : array($_SERVER['HTTP_REFERER']); $query_string=empty($_SERVER["QUERY_STRING"]) ? array() : array($_SERVER["QUERY_STRING"]); check_data($query_string,$url_arr); check_data($_GET,$args_arr); check_data($_POST,$args_arr); check_data($_COOKIE,$args_arr); check_data($referer,$args_arr); function W_log($log) { $logpath=$_SERVER["DOCUMENT_ROOT"]."/log.txt"; $log_f=fopen($logpath,"a+"); fputs($log_f,$log."\r\n"); fclose($log_f); } function check_data($arr,$v) { foreach($arr as $key=>$value) { if(!is_array($key)) { check($key,$v);} else { check_data($key,$v);} if(!is_array($value)) { check($value,$v);} else { check_data($value,$v);} } } function check($str,$v) { foreach($v as $key=>$value) { if (preg_match("/".$value."/is",$str)==1||preg_match("/".$value."/is",urlencode($str))==1) { //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); print "您的提交带有不合法参数,谢谢合作"; exit(); } } } ?>
php的 curl 和 SSL (open_ssl)这两个模块开启
<?php //服务器二次验证代码 function getReceiptData($receipt, $isSandbox = false) { if ($isSandbox) { $endpoint = 'https://sandbox.itunes.apple.com/verifyReceipt'; } else { $endpoint = 'https://buy.itunes.apple.com/verifyReceipt'; } $postData = json_encode( array('receipt-data' => $receipt) ); $ch = curl_init($endpoint); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); //这两行一定要加,不加会报SSL 错误 curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0); $response = curl_exec($ch); $errno = curl_errno($ch); $errmsg = curl_error($ch); curl_close($ch); //判断时候出错,抛出异常 if ($errno != 0) { throw new Exception($errmsg, $errno); } $data = json_decode($response); //判断返回的数据是否是对象 if (!is_object($data)) { throw new Exception('Invalid response data'); } //判断购买时候成功 if (!isset($data->status) || $data->status != 0) { throw new Exception('Invalid receipt'); } //返回产品的信息 return array( 'quantity' => $data->receipt->quantity, 'product_id' => $data->receipt->product_id, 'transaction_id' => $data->receipt->transaction_id, 'purchase_date' => $data->receipt->purchase_date, 'app_item_id' => $data->receipt->app_item_id, 'bid' => $data->receipt->bid, 'bvrs' => $data->receipt->bvrs ); } //获取 App 发送过来的数据,设置是否是沙盒状态 $receipt = $_GET['data']; $isSandbox = true; //开始执行验证 try { $info = getReceiptData($receipt, $isSandbox); // 通过product_id 来判断是下载哪个资源 switch($info['product_id']){ case 'com.application.xxxxx.xxxx': Header("Location:xxxx.zip"); break; } } //捕获异常 catch(Exception $e) { echo 'Message: ' .$e->getMessage(); } ?>
面向对象知识总结
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)抽象类中可以有成员属性和成员方法,而接口中只能有未实现的方法。
<?php // Set the content-type header("Content-type: image/jpeg"); // Create the image $im = imagecreatetruecolor(400, 300); // Create some colors $white = imagecolorallocate($im, 255, 255, 255); $grey = imagecolorallocate($im, 128, 128, 128); imagefilledrectangle($im, 0, 0, 399, 299, $white); // The text to draw $a=array('是','个','大','帅','哥','的','家','吕','朴','作','者'); $tmp=array_rand($a,4); $text =$a[$tmp[0]].$a[$tmp[1]].$a[$tmp[2]].$a[$tmp[3]];// '中文'; // Replace path by your own font path $font = 'simhei.ttf'; //$text=iconv('gb2312','utf-8','面对对象'); // Add some shadow to the text imagettftext($im, 20, 30, 21, 200, $grey ,$font,$a[$tmp[0]]); imagettftext($im, 20, -30, 61, 200, $grey,$font, $a[$tmp[1]]); imagettftext($im, 20, 30, 101, 200, $grey, $font,$a[$tmp[2]]); imagettftext($im, 20, -30, 141, 200, $grey, $font,$a[$tmp[3]]); // Using imagepng() results in clearer text compared with imagejpeg() imagejpeg($im); imagedestroy($im); ?>