【问题标题】:Execute a PHP file with Cron ONLY仅使用 Cron 执行 PHP 文件
【发布时间】:2011-09-19 02:37:04
【问题描述】:

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

/home/[user]/example.com/

example.com 文件夹是该域的根目录。我阅读了关于此的其他线程:

PHP & cron: security issues

据说我应该将脚本移到公共目录之外,所以在我的情况下,我会将它移到 [user] 文件夹。目前我的 Cron 作业命令如下所示:

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

(当然,我使用的是伪名称。)我可以简单地移动文件并将命令更改为:

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

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

【问题讨论】:

  • 试试看?应该是的
  • 试试看?除非您有共享主机并且不能将文件移到公共目录之外,否则应该没有任何问题。
  • 我确实有共享主机,但我可以将文件移到公共目录之外。我可以访问 /home/[user],它位于公共目录树之外,所以我可以将它移到那里。只是尝试它的唯一问题是我不知道它是否在明天凌晨 3:05 之前有效。
  • 您总是可以创建简单的脚本并针对它测试您的 cron 条目。 cron 条目不必在 3:05。

标签: php apache shell cron


【解决方案1】:

您有多种选择:

  • 将其移出您的网络目录
  • 添加一些检查,例如:

    <?php
    
    if( ! isset($argv) )   
        die("cannot run!");
    
  • 检查您的脚本运行的模式:

    $isCLI = ( php_sapi_name() == 'cli' );
    if( !$isCLI )
        die("cannot run!");
    

【讨论】:

  • 您需要做的就是检查是否设置了 $argv。它不会在常规网络请求中设置。
  • 根据配置$argv 通过register_globals 设置。我不会依赖它 ;) 寻找用过的 sapi (PHP_SAPI === 'cli') 感觉更安全。
  • 由于寄存器全局变量不是一个东西,并且已经有一段时间没有了,所以此时只需 $argv 方法就足够了。
【解决方案2】:

你能告诉我们这个脚本的用途吗,如果它是在做一些简单的事情,例如 mysql pruning:

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操作。它从外部 API 获取信息、读取信息、格式化、检查重复条目,然后将其插入数据库(如果不存在重复项)。这是我需要用 PHP 做的事情,以防万一发生某些事情并且 Cron 没有执行,所以我必须强制更新(今天早上发生的)
【解决方案3】:

我最终所做的只是将它从公共目录中移出到我的主文件夹中。 CRON 仍然可以从那里访问和执行它。谢谢大家的帮助。

【讨论】:

  • @yoeriboven,我没有投反对票,但对我来说,即使这是 OP 自己的解决方案,它并没有完全回答最初提出的问题,而是在旁踩它。我来这里是为公共目录中的脚本寻找一种方法,而其他答案更适合该任务。
猜你喜欢
  • 1970-01-01
  • 2021-02-02
  • 2019-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-14
  • 1970-01-01
相关资源
最近更新 更多