crontab是linux自带的一个命令
使php自动运行的方法
php自动运行有很多方法,这里分以下DZ以及一些通过系统完成的方法和直接触发运行驻留系统的方法。
Discuz后台有个计划任务,可以使php自动运行。
DZ计划任务的机制是这样:
1.首先在到了触发计划任务的时间,有访问(会员,游客,搜索引擎的蜘蛛)然后触发该计划任务发生。(因为PHP是触发是语言,没有人去访问他,他什么也做不了。)
2. 计划任务执行.
3. 执行成功,返回执行成功的信息,更新到数据库中记录当前执行的时间,下一次需要执行的时间。
目前让php自动运行的的方法有以下几种方法:
1:在windows下用计划任务
在linux下用crantab
缺点:必须具有服务器权限
2:用个某个网页隔一段时间去刷新,比如用js或者php程序来实现。
缺点:必须用某个工具将该页开着。
3:在有用户访问的时候触发
缺点:必须在用户访问的页面里包含触发程序。
用crontab定时执行
是 UNIX的一个命令
crontab-操作每个用户的守护程序和该执行的时间表。
具体的部分参数说明如下:
crontab file [-u user]-用指定的文件替代目前的crontab。
crontab-[-u user]-用标准输入替代目前的crontab.
crontab-1[user]-列出用户目前的crontab.
crontab-e[user]-编辑用户目前的crontab.
crontab-d[user]-删除用户目前的crontab.
crontab-c dir- 指定crontab的目录。
crontab文件的格式:M H D m d cmd.
M: 分钟(0-59)。
H:小时(0-23)。
D:天(1-31)。
m: 月(1-12)。
d: 一星期内的天(0~6,0为星期天)。
cmd要运行的程序,程序被送入sh执行,这个shell只有USER,HOME,SHELL这三个环境变量。
下面是一个例子文件:
#MIN HOUR DAY MONTH DAYOFWEEK COMMAND
#每天早上6点
106* * * date
#每两个小时
0*/2* * * date
#晚上11点到早上8点之间每两个小时,早上部点
0 23-7/2,8* * * date
#每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4* mon-wed date
#1月份日早上4点
0 4 1 jan* date
范例
lark:~>crontab-1 列出用户目前的crontab.
#MIN HOUR DAY MONTH DAYOFWEEK COMMAND
10 6* * * date
0*/2* * * date
0 23-7/2,8 * * * date
在linux,有多种方式可以实现定时运行,使用最灵活的应该是crontab, 在使用crontab必须特别注意环境变量问题,在此以执行oracle的sqlplus为例, 说明crontab的使用方法。
1:crontab 使用方法: crontab [ -e | -l | -r ] 文件名 -e:编辑任务 -l:显示任务信息 -r:删除定时执行任务信息
2:crontab中处理的文件格式为 分钟 小时 日期 月 星期 执行的文件名 *代表所有条件 5 * * * * rem /home/oracle/execsql 代表每个小时的5分钟时执行/home/oracle/execsql文件
3:对于sql等需要在特定的环境变量下运行的命令,在执行文件中必须列出。 如在oracle下执行sqlplus,必须按以下格式编写: $ cat execsql ORACLE_HOME=/ora815;export ORACLE_HOME ORACLE_OWNER=oracle;export ORACLE_OWNER ORACLE_SID=ora815;export ORACLE_SID ORACLE_BASE=/ora815/app/oralce;export ORACLE_BASE LD_LIBRARY_PATH=$ORACLE_HOME/lib;export LD_LIBRARY_PATH PATH=$PATH:$ORACLE_HOME/bin:$LD_LIBRARY_PATH;export PATH NLS_LANG=AMERICAN_AMERICA.ZHS16CGB231280;export NLS_LANG /ora815/bin/sqlplus test1/test1 @test1.ext (执行@test1.ext文件,数据库的用户名/密码为test1/test1)
其中要求execsql为可执行的程序 $ ls -al execsql -rwxr-xr-x 1 oracle dba 374 Oct 07 15:17 execsql
使用crontab,使php程序在12:00运行
就按照下面的格式改一下,加在crontab就行了
00 0 * * * cd /你的程序路径;php 你的程序名字.php
这个需要编译的时候有cli或者cgi模式的php.
另外:
若无管理权限,只有虚拟空间
PHP里有个函数很有用。这是在最近的开发中才逐渐用到的。 int ignore_user_abort ( [bool setting] ) 这个函数的作用是指示服务器端在远程客户端关闭连接后是否继续执行下面的脚本。 setting 参数是一个可选参数。如设置为True,则表示如果用户停止脚本运行,仍然不影响脚本的运行(即:脚本将持续执行);如果设置为False,则表示当用户停止运行脚本程序时,脚本程序将停止运行。 下面这个例子,在用户关闭浏览器后,该脚本仍然后在服务器上继续执行:
ignore_user_abort(); // 后台运行
set_time_limit(0); // 取消脚本运行时间的超时上限
do{
sleep(60); // 休眠1分钟
}while(true);
除非在服务器上关闭这个程序,否则这断代码将永远执行下去。
php文件中在乱码(如a.php文件在浏览器乱码):
header("Content-Type:text/html;charset=utf-8")是设置网页的。
mysql_query("set names utf-8")设置数据库的。
java中的struts:
中文乱码问题一般是指当请求参数有中文时,无法在Action中得到正确的中文。Struts2中有2种办法可以解决这个问题:
设置JSP页面的pageEncoding=”utf-8”,就不会出现中文乱码;
如果JSP页面的pageEncoding=”GBK”,那么需要修改struts.i18n.encoding=GBK,在struts.xml中加入如下语句进行修改。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.i18n.encoding" value="GBK"/>
……
</struts>
上面2种方法可以解决POST请求中的中文参数,但是GET请求中的中文参数不能解决,GET请求中的中文参数的乱码需要通过修改Tomcat的server.xml文件来解决,修改如下内容,加入URIEncoding=”GBK”:<Connector port="8080" …… URIEncoding="GBK"/>
1、清除PHP缓存文件
<?php
function read_dir($dir,$file)
{
$a =strpos($file,".php");
if($a>0)
{
unlink($dir . $file);
echo "delete $dir$file <br>";
return true;
}
if(strpos($file,".") === 0 || strpos($file,".") !== false ) return true;
if(strpos($file,".") === false || strpos($dir,"/") === false)
{
$dir = $dir . $file . "/";
if(!is_dir($dir)) return false;
$dh = opendir($dir);
while(($file = readdir($dh)) != false)
{
read_dir($dir,$file); //递归调用
}
}
}
function clear_caches()
{
$dir = "./temp/"; //要清除的PHP缓存文件目录
if(!is_dir($dir)) die("It is not a dir");
$dh = opendir($dir);
while(($file = readdir($dh) )!=false)
{
//var_dump($file);
read_dir($dir,$file);
}
}
?>
2、遍历目录中所有文件
<html>
<head>
<meta http-enquiv="Content-Type" content="text/html;charset=gb2312">
<title>查看目录</title>
</head>
<body>
<table width="600" align="center">
<tr>
<th width="50%">文件名</th>
<th width="25%">修改时间</th>
<th width="25%">文件大小(k)</th>
</tr>
<?php
//$dir = "./admin/";
$dir = "c:/";
$up_dir = "上级目录";
$up_url = $dir;
if(isset($_REQUEST['act']) && $_REQUEST['act']=='list_dir')
{
if(emptyempty($_REQUEST['dir']))
{
$up_dir="目录为空!";
}
$dir = isset($_REQUEST['dir']) ? $_REQUEST['dir'] : $dir;
}
if(!is_dir($dir))
{
$up_dir="无效目录!";
}
?>
<tr>
<td colspan="3">
<?php
if(strpos($up_dir,"上级目录")!==false)
{
//if($up_url=="") echo $up_dir;
if($dir != "./admin/")
{
$up_url = substr($dir,0,-1);
$k = strrpos($up_url,"/");
$up_url = substr($up_url,0,$k-strlen($up_url));
$up_url = $up_url ."/";
}
echo "<a href=/index.html"test.php?act=list_dir&dir=$up_url\">$up_dir</a>";
}
else
{
echo $up_dir;
die();
}
?>
</td>
</tr>
<?php
$up_dir = $dir;
$dh = opendir($dir);
while(($file=readdir($dh)) != false)
{
if($file != "." && $file != ".." && $file != ".svn" )
{
if(strpos($file,".") !==false)
{
$time = date("Y-m-d H:i:s", filectime($dir . $file));
$size = filesize($dir . $file)/1000;
echo "<tr><td>$file</td><td>$time</td><td>$size</td></tr>";
}
else
{
$time = date("Y-m-d H:i:s.", filectime($dir . $file));
$size = filesize($dir . $file)/1000;
$dir = $dir . $file ."/";
echo "<tr><td><a href =\"test.php?act=list_dir&dir=$dir\">$file</a></td><td>$time</td><td>$size</td></tr>";
$dir = $up_dir;
}
}
}
?>
</table>
<?php die(); ?>
</body>
</html>