【问题标题】:Schedule PHP script to execute via cron安排 PHP 脚本通过 cron 执行
【发布时间】:2012-11-14 07:07:19
【问题描述】:

我有一个脚本可以更新我的数据库中的一些列。它是用 PHP 编写的,我通过 URL (例如http://foo.com/xyz/yzx/dbupt8r 执行它。我在脚本 URL 上使用 crontab -e 然后 curl 这样做,因为在我看来,这与我正在做的事情有点相似:通过 URL 访问它。有什么可取的或更好的方法吗?我是否存在安全或威胁漏洞?

【问题讨论】:

  • 最好将脚本放在无法通过 url 访问的文件夹中,然后直接运行:php script.php
  • @Ibu - @hourly php /path/to/ci/dir/script.php 就这样?

标签: php mysql curl updating


【解决方案1】:

有两种方法可以做到这一点,您已经在这样做:(curling 一个可公开访问的 URL);或直接从您的 crontab 执行 PHP 脚本。

Cron 冰壶

正如您所提到的,这通常非常方便和舒适,因为您已经在使用 PHP 开发 Web 应用程序,因此您已经在使用这种方式。有一些风险:

  • 最重要的是安全性:您需要确保正确过滤输入,不存在 SQL 注入等风险,以防有人发现 URL 并试图利用它。由于您正在开发 Web 应用程序,因此希望您已经涵盖了大部分内容。
  • 频率和并发:您正在安排它从 cron 执行,那么如果其他人开始调用该 URL 并使其更频繁地触发或在计划运行发生的同时触发,是否有任何问题?
  • 依靠curl:这也意味着您依靠curl 来执行您的脚本,因此您将面临许多故障点(curl 本身、DNS 等) .).

从 Cron 运行 PHP

或者,您也可以直接从您的 crontab 运行脚本。有两种方法可以做到这一点:

  • 将 PHP 脚本传递给 PHP 解释器二进制文件,如下所示(注意 PHP 二进制文件的路径因平台而异,但应指定为绝对路径,因为 cron 无法访问许多环境变量):

    */15 * * * *    /usr/bin/php -f /path/to/php/script.php
    
  • 或者,您可以将 hashbang/shebang 行添加到 PHP 脚本的第一行,如下所示:

    #!/usr/bin/php
    

    使其可执行,例如:

    chmod 755 /path/to/php/script.php
    

    并将其直接添加到您的 crontab 中:

    */15 * * * *    /path/to/php/script.php
    

这种方法的优点是您可以将脚本放在不可公开访问的位置,这样您就可以确保对其访问和执行进行更严格的控制。如果您不必处理 Web 端的事情,这也可能意味着您可以编写更轻量的代码。也就是说,如果您使用的是 PHP 框架,您可能会发现很难开发像这样的独立脚本。

【讨论】:

  • 谢谢。当您说“如果您使用的是 PHP 框架......”时,您就明白了,我使用 CodeIgniter 构建了它。这似乎有什么问题?
  • 通常情况下,框架会有一个主引导程序,所有请求都通过该引导程序运行,并完成大量设置工作(包括加载哪些实用程序库、控制器、模型等) ) 基于请求的 URL。在这些情况下,如果通过 HTTP 请求,它们将无法正常运行,如果有的话。我没有使用 CodeIgniter 进行开发,但有人确实为它写了一个 Cron Bootstrapper,听起来 CodeIgniter 2.x 也有一些 built-in CLI support
【解决方案2】:

调用 URL 会使您面临超时问题,这可能会导致数据库中的事务错误。我建议您使用命令行界面 (CLI) 进行此类过程。

【讨论】:

    【解决方案3】:

    这取决于您可以访问的内容。就个人而言,我不想依赖外部 curl 脚本来完成所需的定期作业。这种方法的缺点之一是您冒着允许世界运行您的 dbupt8r 脚本的风险。请记住,您可以运行 PHP 脚本,而无需将它们置于 Web 服务器的上下文中,因此您可以在 Web 服务器上创建一个 cron 作业

    php /my/folder/dbupt8r.php
    

    在这种情况下,无论网络服务器是否可用,您的定期作业都会运行,并且不会有任何将其暴露给外界的风险。

    【讨论】:

      【解决方案4】:

      您始终可以使用 php 命令运行它。让您的 crontab 运行“/path/to/script.sh”,其中包含:

       #!/bin/bash
       cat "/path/to/phpscript.php" | php -e
      

      如果需要,您可以让它保存输出。你也可以让 CRON 运行“php -f /path/to/script.php”

      【讨论】:

      • 这个.sh 文件,这是什么以及如何创建一个?我不能直接在 crontab 命令上使用这个cat "/path/to/phpscript.php" | php -e 吗?
      • 我相信是这样,但某些 crontab 可能会有所不同。 SH 是一个shell 脚本,它类似于windows 批处理脚本。它运行一系列 shell 命令。您可以通过 SSH 创建一个,也可以通过 FTP 上传。确保它是 chmod 644。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-23
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 2017-03-21
      • 2018-02-13
      • 1970-01-01
      相关资源
      最近更新 更多