注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

早衰男的巢

大音希声 道隐无名

 
 
 

日志

 
 

PHP: linux下定时(周期)执行脚本  

2014-11-11 16:37:01|  分类: PHP |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
这个命题只涉及到两个环节
1. 如何定时触发 :答案比较肯定的 cron (同样地引申到windows环境我们可以用task)
2. 如何脱离浏览器去运行php脚本

我们的实验脚本如下
test.php

<?php

//测试脚本很简单,向testcron.txt 写入一个时间戳
file_put_contents("testcron.txt",date("Y-m-d H:i:s")."\n",FILE_APPEND);

?>


第2个疑问,脑中闪过3种方案。
方案1.  改写php脚本,并为脚本增加可执行属性。cron中直接执行脚本
     a. 改写脚本,在脚本头部增加php的解析器路径,脚本源码变为

#!/usr/bin/php-cgi

<?php

//测试脚本很简单,向testcron.txt 写入一个时间戳
file_put_contents("testcron.txt",date("Y-m-d H:i:s")."\n",FILE_APPEND);

?>

P.S. 这里我的机器的php的脚本解析器路径是 /use/bin/php-cgi ,应根据实际情况书写,eg
root@nas:/usr/bin# ll | grep php 
lrwxrwxrwx 1 root root 21 Oct 31 2007 php -> /usr/lib/php5/bin/php@ 
lrwxrwxrwx 1 root root 25 Oct 31 2007 php-cgi -> /usr/lib/php5/bin/php-cgi* 
lrwxrwxrwx 1 root root 28 Oct 31 2007 php-config -> /usr/lib/php5/bin/php-config* 
lrwxrwxrwx 1 root root 24 Oct 31 2007 phpize -> /usr/lib/php5/bin/phpize*

b. 添加权限
# chmod +x test.php
       然后在cron 添加定时任务命令(略)
这种方法的缺点:因为要改变php源码的头部,所以脚本不再适合被浏览器访问(除非不介意浏览器会输出一行奇怪的 #!..../php-cgi)。而且由于执行的身份是root,所以生成的testcron的文件属性是 -rw-r-r , 浏览器调用脚本时会因为写入权限不足,报错。当然解决办法不是没有,可以用su用apache的身份执行脚本,这是后话了..

方案2. 写一个shell来执行php脚本
实际上这是一个方案1的变型或者说改良,把调用php的部分单独抽离出来以.sh来写。 php源码不改动,把以下内容保存为 phpcron.sh

#!/bin/bash
/usr/bin/php-cgi /mnt/array1/..脚本的完整路径../test.php

#如果需要进一步完善,修改脚本以apache身份执行或chmod 777 testcron.txt 使之兼容浏览器调用脚本时写入..(略)



保存后记得给 .sh文件授权 chmod +x phpcron.sh,然后在cron中加入定时执行这个sh的命令
优缺点:相对方案1,这种方式不需要改动php源码,所以test.php是同时支持被浏览器或cron调用的。缺点是变复杂了,要维护这种方案还得多弄一个.sh 。此外,在这种方式运行的时候 php-cgi 报了一行错 Segmentation fault 还未深究其原因,但脚本倒是执行完整了似乎并未受影响。待有空的时候回头研究一下。

方案3. 利用wget 彻底模拟以浏览器来调用。
wget -q http://192.168.0.22/.../test.php -O /mnt/array1/wwwroot/.../dump.txt
输出到 dump.txt 是无意义的,因为我不要输出到浏览器的执行结果,dump.txt只是每次被调用后覆盖。
参数 -q 是不输出任何wget的log 把这句写入cron就可以定时执行一次脚本,执行效果和用浏览器打开是一样的。
同理也可以安装其他命令行下的文本web浏览器的方式来调用,例如lynx,但我没想到比wget更便捷的。


*P.S. 其实,或许有操作起来更简便的方法。像SAE里的 config.yaml 里直接支持 cron方式调用脚本。只是不知道这个yaml的环境是怎样部署的,暂未细究

参考文:
  评论这张
 
阅读(618)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018