<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://jackxiang.com/post/4991/</link>
<title><![CDATA[php 实现定时任务简单实现]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Thu, 16 Feb 2012 03:01:13 +0000</pubDate> 
<guid>http://jackxiang.com/post/4991/</guid> 
<description>
<![CDATA[ 
	通常情况下实现定时计划任务有以下几种方式：<br/><br/>linux下可以借助crontab+php的方式（Crontab是一个很方便的在unix/linux系统上定时(循环)执行某个任务的程序 ）<br/>windows 下有两种方式：<br/>借助于vbscript脚本加载无窗口的服务<br/><textarea name="code" class="php" rows="15" cols="100">
do
set ws=createobject(&quot;wscript.shell&quot;)
ws.run&quot;D:&#92;php&#92;php.exe D:&#92;php&#92;source&#92;do.php&quot;,vbhide
wscript.sleep 5000&nbsp;&nbsp; &#039;毫秒
loop
</textarea><br/>新建文本文件，复制以上脚本，另存为后缀为*(.vbs)的文件后即可。<br/><br/>上面“D:&#92;php&#92;php.exe D:&#92;php&#92;source&#92;do.php” 这种方式可以写在bat文件中，或者window计划任务中都可以执行。<br/>php内部支持的一种利用函数“ignore_user_abort ” 来永久执行的方案。<br/><textarea name="code" class="php" rows="15" cols="100">
&#039;&#039;&lt;?php
ignore_user_abort(); // run script in background
set_time_limit(0); // run script forever
$interval=30; // do every 30 seconds...
do&#123;
$fp = fopen(&#039;text3.txt&#039;,&#039;a&#039;);
fwrite($fp,&#039;test&#039;);
fclose($fp);
sleep($interval); // wait 30 seconds
&#125;while(true);
?&gt;&#039;&#039;
</textarea><br/>第三种方案，需要总是执行脚本，而且响应请求的时间是无限制的，对于定义了最大响应时间的fastcgi方式不可行，脚本还是会停止。所以需要找一种更加稳妥的方案。<br/><br/>**找到了**<br/><br/>数学是很神奇的东西。实际上定时执行，是一个时间条件执行，php中有取得时间秒数的函数time() 返回据1970年1月1日开始的秒数，而我们通常定时任务执行，可以使300秒，1000秒之类的时间间隔，意味着 。这个就好处理了，time()%timestamp==0 只要整除到了符合间隔的时间，就执行一次，恰好符合了定时的目的。<br/><br/>实际上最后一种简单实现，解决的是普通请求中脚本定时任务的问题，这里会受到响应时间的限制，想让这部分代码执行的更久一下可以参考ignore_user_abort和set_time_limit，如果需要大运算量的处理，就需要借助前面介绍的方式在服务器端控制定时任务了，但作为普通需求，最后一种方案是一种简单直接的实现，有一定意义！<br/><br/><br/>来自：http://develop.9he.info/php/%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1%E7%AE%80%E5%8D%95%E5%AE%9E%E7%8E%B0<br/><br/><br/>其它方法：<br/>下面的这段代码，可以在当前文件夹下，生成一个test.txt，并每隔20秒，往里面写入一个时间戳，无论客户端是否关闭浏览器。<br/><textarea name="code" class="html" rows="15" cols="100">
ignore_user_abort(true);
set_time_limit(0);

function write_txt()&#123;
if(!file_exists(”test.txt”))&#123;
$fp = fopen(”test.txt”,”wb”);
fclose($fp);
&#125;
$str = file_get_contents(’test.txt’);
$str .= “&quot;r&quot;n”.date(”H:i:s”);
$fp = fopen(”test.txt”,”wb”);
fwrite($fp,$str);
fclose($fp);
&#125;

function do_cron()&#123;
usleep(20000000);
write_txt();
&#125;

while(1)&#123;
do_cron();
&#125;
</textarea><br/>关键的两个函数：<br/><br/>ignore_user_abort(true)，这个函数的作用是，无论客户端是否关闭浏览器，下面的代码都将得到执行。<br/><br/>set_time_limit(0)，这个函数的作用是，取消php文件的执行时间，要是没有这个函数的话，默认php的执行时间是30秒，也就是说30秒后，这个文件就say goodbay了。
]]>
</description>
</item><item>
<link>http://jackxiang.com/post/4991/#blogcomment63449</link>
<title><![CDATA[[评论] php 实现定时任务简单实现]]></title> 
<author>pengruncs594 &lt;chuangkhpwnknl21@tom.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 16 Feb 2012 20:52:12 +0000</pubDate> 
<guid>http://jackxiang.com/post/4991/#blogcomment63449</guid> 
<description>
<![CDATA[ 
	吃着糖在嘴里的感觉真好
]]>
</description>
</item><item>
<link>http://jackxiang.com/post/4991/#blogcomment63535</link>
<title><![CDATA[[评论] php 实现定时任务简单实现]]></title> 
<author>hxngb9mf &lt;qxil23@mail114.net&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Mon, 20 Feb 2012 17:58:11 +0000</pubDate> 
<guid>http://jackxiang.com/post/4991/#blogcomment63535</guid> 
<description>
<![CDATA[ 
	要看要看。謝謝分享哦
]]>
</description>
</item>
</channel>
</rss>