【问题标题】:PHP script run via cron does not connect to database通过 cron 运行的 PHP 脚本未连接到数据库
【发布时间】:2014-08-02 19:59:16
【问题描述】:

我正在尝试在通过 cron 作业运行的 PHP 脚本中连接到 mysql 数据库。它不会以某种方式连接到数据库。我在浏览器中运行相同的脚本,一切正常。我使用免费的 BSD,以下是我尝试运行的代码:

ini_set(max_execution_time,1200);
require_once("../settings.php");
$query = "insert into cron_log values(null, '". date("D d-m-Y") ."')";
mysql_query($query);
exec("convert /usr/local/www/demo/cron/test.pdf /usr/local/www/demo/cron/1.jpg");

如果我通过 cron 运行上述脚本,它什么也不做。

如果我在浏览器中运行上述脚本,它会在表中创建新行并创建 1.jpg。

如果我删除数据库部分并通过 cron 运行它,它会创建 1.jpg 文件。

可能的原因和解决方法是什么?

【问题讨论】:

  • file_put_contents('test.txt', 'Cron works'); die(); 把它放在第一行。
  • 您是否尝试过指定脚本使用的所有文件的绝对路径?
  • 尝试使用require_oncerequire_once(dirname(__FILE__).'/../settings.php') 的绝对路径;

标签: php mysql cron


【解决方案1】:

请注意,CLI 不会更改当前的工作目录。 cron 也没有设置它。因此,您的 reqire_once 调用相对会转到“随机”位置。尝试完整路径:

require_once(__DIR__."/../settings.php"); // PHP >=5.3
require_once(dirname(__FILE__)."/../settings.php"); // PHP <5.3

【讨论】:

  • 谢谢.. 经过数小时的试验,这对我有很大帮助!
【解决方案2】:

最可能的原因是脚本在require_once("../settings.php"); 行失败。这是因为通过 cron 调用脚本时的工作目录与通过浏览器调用时的工作目录不同。

../settings.php 更改为完整路径,例如/path/to/settings.php 确认这是问题所在。

将您的 cron 行更改为 php /path/to/script.php &gt;&gt; /path/to/logfile.txt 2&gt;&amp;1 也是值得的,这样 logfile.txt 将被您的脚本输出填充。确保打开display_errors 以捕获任何错误消息!

【讨论】:

    【解决方案3】:

    我的猜测是,当您从 cron 运行它时,您不在正确的目录中,并且未找到 settings.php 文件;因此整个事情都失败了。

    当你从 cron 运行它时,确保脚本 cds 到适当的目录,以便使用相对路径找到 settings.php。

    【讨论】:

      【解决方案4】:

      任何显示的错误? 确保您指的是文件“settings.php”打印“getcwd()”的正确文件夹。 当从 cron 脚本开始执行时,位于“/”

      【讨论】:

      • 你可以在开头插入这段代码 chdir(realpath(dirname(<b>FILE</b>)));
      • 假设../settings.phpdirname(FILE) 相关,但情况可能并非如此。此外,cron 可以有效地从命令行运行,您只需执行 chdir(dirname($argv[0]));
      猜你喜欢
      • 1970-01-01
      • 2020-02-28
      • 1970-01-01
      • 2019-07-23
      • 1970-01-01
      • 2018-07-05
      • 2020-11-10
      • 1970-01-01
      • 2012-05-10
      相关资源
      最近更新 更多