1

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

4

4 回答 4

1

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

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

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

于 2012-11-26T18:43:32.300 回答
1

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

php /my/folder/dbupt8r.php

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

于 2012-11-26T18:45:27.840 回答
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 框架,您可能会发现很难开发像这样的独立脚本。

于 2012-11-26T19:14:21.697 回答
0

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

于 2012-11-26T18:47:36.250 回答