Cron工作停止发送电子邮件,从未在第一时间工作

时间:2017-04-28 13:23:11

标签: php email cron

我的情况是,除了我自己的公共html文件夹和子文件夹之外,我个人无法访问任何内容,所以我必须依靠拥有该帐户的人为我设置一个cron作业。我们之前都没有做过这个,所以我们一直在通过反复试验来学习。要运行的文件是一个php文件,但我们试图通过直接路径运行它而不是使用curl或wget。

起初他收到的电子邮件说

/ usr / local / cpanel / bin / jailshell:/home/[accountname]/public_html/[domain].com/[subfolder]/[filename].php:Permission denied

(更改括号中的部分以保护所有者的隐私。)

一段时间后,电子邮件停止了。我做了更多的谷歌搜索并意识到,首先,我必须设置权限来执行我自己以外的用户的文件(我假设他正在使用root),所以我将chmod编辑为755.然后我意识到我们正在尝试直接访问文件而不是通过php,所以我告诉他在文件路径之前添加usr / bin / php。他正在通过Cpanel中的表单编辑crontab而不是使用shell,因此分钟为1,所有其他时间都是*并且命令现在是usr / bin / php / home / [accountname] / public_html / [domain]。 COM / [子目录] / [文件名] .PHP 我问他是否收到了和以前一样的错误信息,或者是否发生了变化,但他说他不再收到任何电子邮件了。所以听起来cron在命令格式错误时自发地停止尝试执行文件,并且在添加usr / bin / php部分时没有再次启动。 php脚本本身应该为游戏中的角色添加动作点,并输出添加了点数的字符数(如果你已经达到最大值,则不计算)。它在开头有这条线:

include_once($ _ SERVER [ 'DOCUMENT_ROOT'] “/ _私人/ class_character.inc.php”);

我一直在想它包含文件可能有问题,因为class_character.inc.php反过来包含几个其他文件的包含,这些文件只是通过文件名引用的,所以我们的想法是它会在里面搜索它们_private,但我一直在想如果它在crontab所在的位置搜索它们会怎么样?但是,如果文件出现问题,电子邮件将包含警告或错误消息,但它似乎从未在第一时间运行该文件。我认为它不再是权限问题,因为chmod是755.我可以通过键入url来运行该文件,然后它不会导致任何错误并执行它应该的,所以如果文件有任何问题本身,它属于包含范围。

另外,我在一个网站上读到,与public_html文件夹相关联的帐户需要位于名为cpaneluser的用户组或类似的东西中。但我认为即使用户组未定义,它现在仍然可执行,因为还设置了世界执行权。

尝试运行的文件的内容:

<?
include_once("../_private/class_character.inc.php");
include_once "../_private/abbr.inc.php";
include_once "../root.inc.php";

$mysqli = new mysqli("localhost", "ACCOUNT", "PASSWORD", "DATABASE");

function getLiveCharacters($mysqli) {
$retArr = array();
$sql = "SELECT `uid` FROM `chars` WHERE `status`=1 ORDER BY `uid`";
$result = $mysqli->query($sql);
if (mysqli_num_rows($result)) {
while ($row = mysqli_fetch_row($result)) {
$retArr[] = $row[0];
}
return $retArr;
}
else return false;      
}

function doLoop($mysqli) {
$chars = getLiveCharacters($mysqli);
if (!$chars) return 0;
$counter = 0;
foreach ($chars as $ci) {
$c = new Character($mysqli, $ci);
$result = $c->rest_auto();
if ($result>0) $counter++;
}
return $counter;
}

$result = doLoop($mysqli);

echo $result;

?>

class_character相关的部分

<?

public function rest_auto() {
$oldAP = $this->getAP();
if ($oldAP>=1000) return 0;
$ap = $this->getRestAP();
if ($oldAP+$ap>1000) $ap = max(0, 1000-$oldAP);
$pos = $this->getPosition();

$this->updateCharLocTime($pos->x, $pos->y, $pos->lx, $pos->ly, 0, 5, $ap);

if ($oldAP==-1) {
$sql = "INSERT INTO `char_ap` (`rowID`, `charFK`, `ap`) VALUES (NULL, '$this->uid', '$ap')";
$this->mysqli->query($sql);
}
else if ($ap>0) {
$sql = "UPDATE `char_ap` SET `ap`=`ap`+$ap WHERE `charFK`=$this->uid LIMIT 1";
$this->mysqli->query($sql);
}
return $ap;
}

function getRestAP() {
        //automatic resting is triggered once per real life hour
        //Starts from 250 AP/rl hour
        $ap_rec = 250;
        $pos = $this->getPosition();
        $curTime = new Time($this->mysqli); 
        $currentLocation = new GlobalMap($this->mysqli, $pos->x, $pos->y);
        $local = new LocalMap($this->mysqli, $pos->x, $pos->y);
        $pixArr = $currentLocation->getMajorPixel($currentLocation->x, $currentLocation->y);
        $timeofday = $curTime->getTimeofDay($pos->x, $pos->y);
        $weather = $curTime->getWeather($pos->x, $pos->y, $timeofday, $currentLocation->getTerrains($pixArr["x"], $pixArr["y"]), $currentLocation->getWaterLevel($pixArr["x"], $pixArr["y"]));
        $bodyObj = new Obj($this->mysqli, $this->bodyId);
        $blood_per = $bodyObj->getBloodPercentage($this->uid);

        //-10 if you don't have a bed
        $beds = $local->checkBed($pos->lx, $pos->ly);
        if ($beds == -1) $ap_rec -= 10;
        //-10 if you don't have shelter
        $ap_rec -= 10;//No shelter has been implemented yet
        //-10 if it's raining and you don't have shelter
        if ($weather["rain"]>0) {
            $ap_rec -= 10;
        }
        //-10 if you are cold
        if ($weather["temp"]<16) {
            $minus = max($weather["temp"]-16,-10);
            $ap_rec += $minus;
        }
        //-10 if you are too hot
        if ($weather["temp"]>36) {
            $plus = max(($weather["temp"]-36)*2,10);
            $ap_rec -= $plus;
        }
        //-10 if you're hungry
        //Hunger isn't implemented yet
        //-10 if you are wounded
        if ($blood_per<95) {
            $minus = round(($blood_per-96)/2);
            $ap_rec += $minus;
        }

        return $ap_rec;
    }
?>

实际上我不会开始发布在另一个函数中调用的每个函数,因为这需要很长时间。关键是它在浏览器中运行时有效,所以如果在不通过浏览器运行时某些东西不兼容,那就太烦人了。当然,我可以去更改命令以使用curl,但这仍然无法解释为什么它首先发送电子邮件,然后停止。

0 个答案:

没有答案