Heim >Backend-Entwicklung >PHP-Tutorial >PHP 有什么工具能做定时任务

PHP 有什么工具能做定时任务

WBOY
WBOYOriginal
2016-06-06 20:26:041605Durchsuche

好比我每隔12个小时就爬一次我的订单状态

回复内容:

好比我每隔12个小时就爬一次我的订单状态

1、crontab
示例:

<code>crontab -e 添加
# 每隔12小时运行一次脚本.
。* */12 * * *  /usr/bin/php /your/path/cron.php
</code>

优点:稳定+简单+方便
缺点:时间间隔只能精确到分钟,按秒定时比较难做到

2 、常驻内存的各种PHP类库
https://github.com/reactphp/react
https://github.com/walkor/workerman

以workerman代码为例,定时任务代码类似

<code>require_once './Workerman/Autoloader.php';
use Workerman\Worker;
use Workerman\Lib\Timer;
$task = new Worker();
$task->onWorkerStart = function($task){
    // 每2.5秒运行一次定时任务
    Timer::add(2.5, function(){
          echo "task run\n";
    });
};
Worker::runAll();
</code>

优点:常驻内存,支持多进程,自带进程管理,支持秒级甚至毫秒级别定时任务
缺点:需要引入他们的代码库

3、非自有服务器(PHP虚拟主机)上实现php定时任务
有时我们没有服务器shell权限,比如PHP虚拟主机,那么上面两个方案都无法实现,则一般需要使用页面访问的方式执行定时任务。方法如下:

首先:建立一个php任务页面,如task.php,开头必须有

<code>// 保证即使用户把浏览器关掉(断开连接),php也会在服务器上继续执行
ignore_user_abort(true);
</code>

然后:任务页面有了,剩下的就是如何定时请求问题了,解决方法有几种大概如下
1、开个浏览器,打开一个html页面,利用js定时器定时ajax请求这个任务页面,需要你一直开个页面
2、利用用户自然访问触发。比如用户正常访问一个页面,加个罗技判断是否该运行定时任务,如果是则发送个curl请求或者用户页面ajax请求任务页面
3、利用朋友的主机定时访问自己站点的任务页面。比如朋友主机有shell权限,则可以利用crontab定时curl访问自己的任务页面
4、借助第三方
一些服务商提供了各种类型的定时任务,例如阿里云的ACE提供了单独的定时任务,你可以填写自己应用下的某个uri。百度云BCE提供了服务器监测功能,每天会按照一定的时间规律访问应用下的固定uri。类似的第三方平台上还有很多定时任务可以用。你完全可以用这些第三方定时任务作为跳板,为你的网站定时任务服务。

总结:
1、如果是时间粒度为分钟,则crontab最方便
2、如果时间粒度很细或者需要多控制,上面PHP类库是比较好的方案
3、如果没有没有shell权限,则考虑第三种方案

如果大家有其它方案,欢迎提出 : )

1、后台执行PHP脚本,常驻内存

一个PHP开发的类库 system_daemon

<code>ignore_user_abort(true);//忽略abort
set_time_limit(0);// 无限制的执行下去
$interval=60*30; 
do{
    //ToDo  
    sleep($interval);
}while(true);</code>

2、linux上的计划任务(crontab)定时执行,比如Laravel Scheduler

<code>00 */2 * * * /usr/local/bin/php /data/www/script.php</code>

3、用C、Go等其他语言,写一个守护进程(Daemon)

这个要看研发实力了

What's the better way?

最简单的办法就是写shell脚本,用脚本来执行php 脚本。很多框架都有任务调度功能,比如Lavarl 你可以参考。

其实可以使用Linux上的Crontab服务来实现定时任务,写个任务脚本,然后使用crontab来定时执行。

传送门:每天一个linux命令:crontab命令

slim框架
slim的cli环境
定时执行软件: crontab,计划任务及其他

逻辑代码

<code class="php">$cliEnvironment = new \Slim\Extras\Environment();

$app = new \Slim\Slim(array(
    'environment' => $cliEnvironment
));
$app->get(
    '/hello/:name',
    function ($name) {
        echo "Hello, $name";
    }
);
$app->run();</code>

运行命令

<code class="bash">php test.php hello Ahmet
#Output
Hello, Ahmet</code>

定时任务

  • 如前几贴都提到 crontab 这在Linux环境下首推,

  • 如果windows有定时计划或其他软件,

  • OSX有自己的一套定时任务系统(也比较推荐),也可以安装crontab

在crontab中添加任务,由Linux系统的cron进程定时执行任务,这个任务脚本同样可以用PHP来写。

<code>crontab -e 添加
# 每隔12小时(12:00,24:00)运行一次脚本.
* */12 * * * /png/www/example.com/cron/tast.php

chmod +x tast.php
#!/png/php/5.4.39NTS/bin/php
<?php // 这里写你的PHP代码</code></code>

crontab 没啥好讨论的

可以在后台开启一个守护进程,监控

crontab

用crontab, 然后写个守护进程就可以

mysql 的存储过程不是挺好吗?

最简单还是crontab
当然,如果你想折腾这些所谓php框架的话,可以试试这个
https://github.com/kohkimakimoto/workerphp

用计划任务方便, 但是在单独的脚本文件中处理逻辑很麻烦, 在CP中可以很容易的处理

在命令行模式下运行

你可以像写web一样使用MVC, 只是入口不同而已

这个功能用swoole扩展来做,易如反掌! swoole扩展能做得更多

参考连接
swoole

crontab

最常见的做法应该还是crontab 简单粗暴

为什么要整的那么麻烦,如果是Linux,直接上crontab,推荐下面这篇文章:

Linux定时任务

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn