仅使用Cron执行PHP文件

仅使用Cron执行PHP文件,php,apache,shell,cron,Php,Apache,Shell,Cron,我有一个PHP脚本,需要每天在太平洋时间凌晨3:05执行一次。我目前已经在我的站点的根目录中获得了脚本(如,),因此,任何在浏览器中导航到它的人都可以执行该脚本。我的服务器的布局如下: /home/[user]/example.com/ 其中example.com文件夹是该域的根目录。我读了另一篇文章: 有人说我应该把脚本移到公共目录之外,所以在我的例子中,我会把它移到[user]文件夹。当前我的Cron作业命令如下所示: /usr/local/php5/bin/php/home/[user]

我有一个PHP脚本,需要每天在太平洋时间凌晨3:05执行一次。我目前已经在我的站点的根目录中获得了脚本(如,),因此,任何在浏览器中导航到它的人都可以执行该脚本。我的服务器的布局如下:

/home/[user]/example.com/

其中example.com文件夹是该域的根目录。我读了另一篇文章:

有人说我应该把脚本移到公共目录之外,所以在我的例子中,我会把它移到[user]文件夹。当前我的Cron作业命令如下所示:

/usr/local/php5/bin/php/home/[user]/example.com/script.php

(当然,我使用的是伪名称。)我是否只需移动文件并将命令更改为:

/usr/local/php5/bin/php/home/[user]/script.php


它会正常运行,但公众却无法使用?由于脚本已经通过Cron运行,它已经使用绝对路径(而不是相对路径)设置到需要包含的文件,因此这应该是一个简单的移动和编辑,对吗?

您有几个选项:

  • 将其从web目录中移出
  • 添加一些检查,例如:

    <?php
    
    if( ! isset($argv) )   
        die("cannot run!");
    

您有几种选择:

  • 将其从web目录中移出
  • 添加一些检查,例如:

    <?php
    
    if( ! isset($argv) )   
        die("cannot run!");
    

如果脚本执行简单的操作,例如mysql修剪,您能告诉我们脚本的用途吗:

5 3 * * * * root mysql -u username -e "UPDATE users SET days = days-1;"
可能更好,类似地:

5 3 * * * * root /usr/local/php5/bin/php -r "$normal = 'php';code();$here"

你可以做这个把戏吗?

你能告诉我们这个脚本的目的吗,如果它做的是简单的事情,比如mysql修剪:

5 3 * * * * root mysql -u username -e "UPDATE users SET days = days-1;"
可能更好,类似地:

5 3 * * * * root /usr/local/php5/bin/php -r "$normal = 'php';code();$here"


我可以玩这个把戏吗?

我最后做的就是把它从公用目录移到我的主文件夹中。CRON仍然能够从那里访问和执行它。谢谢大家的帮助。

我最后做的就是把它从公共目录移到我的主文件夹中。CRON仍然能够从那里访问和执行它。谢谢你们的帮助。

试试看?应该考虑一下试试看?应该不会有任何问题,除非你有共享托管,并且不能将文件移到公共目录之外。我有共享托管,但我可以将文件移到公共目录之外。我可以访问/home/[user],它位于公共目录树之外,因此我可以将它移动到那里。只是尝试它的唯一问题是,我不知道它是否工作到明天凌晨3:05。你可以创建简单的脚本,并根据它测试你的cron条目。cron条目不必在3:05。试试看?应该考虑一下试试看?应该不会有任何问题,除非你有共享托管,并且不能将文件移到公共目录之外。我有共享托管,但我可以将文件移到公共目录之外。我可以访问/home/[user],它位于公共目录树之外,因此我可以将它移动到那里。只是尝试它的唯一问题是,我不知道它是否工作到明天凌晨3:05。你可以创建简单的脚本,并根据它测试你的cron条目。cron条目不必在3:05。只需检查是否设置了$argv。它不会在常规web请求上设置。根据配置,
$argv
通过
register\u globals
设置。我不相信它;)查找使用过的sapi(
PHP_sapi==='cli'
)感觉更安全。因为注册全局变量不是一件事,而且已经有一段时间没有了,所以此时只需使用$argv方法就足够了。您只需检查是否设置了$argv。它不会在常规web请求上设置。根据配置,
$argv
通过
register\u globals
设置。我不相信它;)寻找使用过的sapi(
PHP_sapi==='cli'
)感觉更安全。因为注册全局变量不是一件事,而且已经有一段时间没有了,所以在这一点上,只使用$argv方法就足够了。它并不复杂,但它做的不仅仅是简单的mysql操作。它从外部API获取信息,读取信息,格式化信息,检查重复条目,然后将其插入数据库(如果不存在重复条目)。这是我需要用PHP做的事情,以防发生了什么事情而Cron没有执行,所以我必须强制更新(发生在今天早上)。这并不复杂,但它所做的不仅仅是简单的mysql操作。它从外部API获取信息,读取信息,格式化信息,检查重复条目,然后将其插入数据库(如果不存在重复条目)。这是我需要用PHP做的事情,以防万一发生了什么事情,Cron没有执行,所以我不得不强制更新(发生在今天早上)@yoeriboven,我没有否决投票,但对我来说,即使这是OP自己的解决方案,它并没有完全回答最初提出的问题,它是在回避它。我来这里是想为公共目录中的脚本寻找一种方法,而其他答案更适合该任务。@yoeriboven,我没有否决投票,但对我来说,尽管这是OP自己的解决方案,但它并没有完全回答最初提出的问题,而是回避了它。我来这里是想为公共目录中的脚本寻找一种方法,其他答案更适合该任务。