首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用PHP启动/停止cron作业?

如何使用PHP启动/停止cron作业?
EN

Stack Overflow用户
提问于 2011-07-01 13:42:14
回答 5查看 23.2K关注 0票数 13

如果我在命令行中键入crontab -l,我可以看到以下行:

代码语言:javascript
复制
# * * * * * /usr/bin/php /home/user/every_minute_script.php

要启动这个cron作业,我需要使用crontab -e命令编辑文件,删除行首的注释字符,保存编辑的文件,然后退出编辑器。

若要停止,请执行相同的步骤,但在行的开头添加注释字符。

我希望使用PHP脚本实现完全相同的效果,而不是手动编辑文件。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-07-01 17:08:26

我做了一些研究和在论坛上找到的,以下信息:

调用"crontab -e“,编辑器环境变量设置为php脚本。该脚本可以修改文件,当它退出时,crontab将重新读取文件并进行更新。

所以,我试过一些东西,而且成功了。我将粘贴下面的工作代码:

代码语言:javascript
复制
#!/usr/bin/php
<?php

$on  = "* * * * * /usr/bin/php /home/user/every_minute_script.php\n";
$off = "# * * * * * /usr/bin/php /home/user/every_minute_script.php\n";

$param    = isset( $argv[1] ) ? $argv[1] : '';
$filename = isset( $argv[2] ) ? $argv[2] : '';

if ( $param == 'activate' )
{
    shell_exec( 'export EDITOR="/home/user/cron.php on"; crontab -e' );
}
elseif( $param == 'deactivate' )
{
    shell_exec( 'export EDITOR="/home/user/cron.php off"; crontab -e' );
}
elseif( in_array( $param, array( 'on', 'off' ) ) )
{
    if ( !is_writable( $filename ) )
        exit();

    $crontab = file( $filename );
    $key = array_search( $param == 'on' ? $off : $on, $crontab );

    if ( $key === false )
        exit();

    $crontab[$key] = $param == 'on' ? $on : $off;
    sleep( 1 );
    file_put_contents( $filename, implode( '', $crontab ) );
}

exit();

?>

实际上,我们有一个名为cron.php的脚本位于/home/user文件夹中,设置为可执行文件(chmod a+x cron.php),并从命令行(PHP)调用。稍后,我将调整它从网络运行,这是我的意图。

用法:./cron.php activate启用cronjob,./cron.php deactivate禁用它。

脚本正确地设置编辑器环境变量(自动设置),然后调用crontab -e,然后调用编辑器(现在是相同的cron.php脚本),将临时crontab文件位置作为参数传递。然后,找到并更改正确的crontab行,并保存修改后的版本,替换临时文件。当脚本退出时,crontab将更新。

这正是我想做的,也符合我的需要。

其他的答案都很好,可能适合不同的需求和场景,我想感谢每一个做出贡献的人。

票数 13
EN

Stack Overflow用户

发布于 2011-07-01 13:47:19

与其以编程方式搅乱crontab (这是微妙且快速的愤怒),我建议在您的every_minute_script.php中检查一下:

代码语言:javascript
复制
if (!file_exists('/your/path/run_every_minute_script')) {
  exit;
}

这样,脚本仍将每分钟启动一次,但如果不满足条件(/your/path/run_every_minute_script不存在),它将立即终止,无需进一步处理。

(当然,您可以替换不同的条件,例如检查数据库的权限等。)

如果需要邮寄输出,可以使用包装器脚本。Crontab:

代码语言:javascript
复制
* * * * * /your/path/wrapper.sh > /dev/null 2> /dev/null

然后包装器脚本正常运行,收集其输出和错误,如果这些不是空的,则将它们发送出去(请注意,您也可以在包装器脚本中进行检查;我们没有,因为它依赖于数据库)。

票数 7
EN

Stack Overflow用户

发布于 2011-07-01 13:46:51

下面是是一个非常酷的教程,用于使用PHP创建这种功能。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6548746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档