【问题标题】:Problem with executing PHP script running on Cron执行在 Cron 上运行的 PHP 脚本的问题
【发布时间】:2011-09-22 15:48:06
【问题描述】:

我正在尝试在第三方托管服务器上的 cron 上运行一个非常简单的 PHP 脚本,但遇到了一个奇怪的问题。尽管我确认 cron 确实在预定时间执行了脚本,但脚本的内容并未执行。我无法检查 Cron 设置,因为它不在我的服务器上,但我想知道我是否做错了什么?

该脚本仅用于测试目的,因此非常简单:

<?php
$file = fopen("file-" . rand(1000, 9999) . '.txt', 'w');
fwrite($file, 'cron');
fclose($file);
?>

当我手动运行此脚本时,会创建文件。当我把它留在 Cron 上时,什么也没有发生。可能是什么原因?脚本的权限是777。是我做错了什么还是服务器有问题?

非常感谢。

【问题讨论】:

    标签: php cron


    【解决方案1】:

    请记住,在 cron 下运行的脚本与在命令行上手动运行的同一脚本具有非常不同的环境。特别是,cron 将具有与 shell 提示符不同的工作目录。您没有为文件指定绝对路径,因此当脚本由 cron 运行时,它将尝试在当时 CWD 的任何目录中创建该文件。如果运行此作业的用户 ID 对该目录没有写入权限(或文件存在但由其他人拥有),则 fopen 将失败。

    永远不要假设文件操作成功。始终检查错误情况。当你在它的时候,为文件指定一个绝对路径,这样你就知道它将被写入哪里:

    $filename = "/path/to/where/you/wantfile-" . rand(1000,9999) . '.txt';
    $file = fopen($filename, 'w') or die("Unable to open $filename for output");
    

    【讨论】:

    • 我明白了。谢谢,我试试。不过,这只是一个示例,我需要使用 CRON 将一行插入到数据库表中。我使用具有正确登录数据的常规 php 函数(mysql_connect、mysql_select_db、mysql_query),结果是相同的 - 手动确定,CRON 没有任何反应。没有使用相对地址。
    • 你的 cron 行规范是什么?请记住,命令行 PHP 脚本需要一个 shebang (#!/usr/bin/php)。否则它只是一个无法执行的文本文件(即使&lt;?php 存在于其中)。
    • 抱歉,我无法访问它,因为它运行在我使用其服务的第三方服务器上。但是由于所有其他用户的所有其他脚本都可以,并且我知道我的脚本实际执行的信息,我认为这不会有问题
    • 好吧,我想通了。我不知道为什么,但我用新名称创建了一个完整的新脚本并将其添加到 cron(具有完全相同的内容),它就像一个魅力。
    【解决方案2】:

    这可能是因为脚本是以 apache 以外的其他用户身份运行的。在某些情况下,我会使用 curl 并让脚本检查 IP 是否是本地 IP,以确保它是从正确的机器上运行的。当然,实现这一点的方法更少,但这总是一种快速而简单的方法。

    【讨论】:

      猜你喜欢
      • 2013-02-26
      • 1970-01-01
      • 1970-01-01
      • 2011-11-07
      • 2014-09-03
      • 1970-01-01
      • 2014-11-01
      • 2018-02-13
      • 1970-01-01
      相关资源
      最近更新 更多