当cron运行php脚本时unlink不工作

时间:2018-05-10 17:46:34

标签: php linux cron unlink

我有一个PHP脚本正在检查病毒扫描的结果。如果扫描为恶意代码返回正数,则会将数据库中的值更改为0。我有另一个PHP脚本检查值,如果它是0,它从数据库中删除条目,然后从目录中删除该文件。当我通过命令行运行它时,它运行正常,但是当cron运行它时,它确实删除了db条目,但它不会从目录中删除该文件。

非常感谢任何帮助。

以下是带有unlink的php文件的结尾:

else{
        // if not it deletes the image
        $hash = $row['hash'];
        $result2 = mysqli_query($connection, "DELETE FROM userUploads WHERE hash = '$hash' ");

        // need due to dir structure
        $pat = str_replace('../','', $row['fileName']);
        unlink ($pat);

        if (! $result2){
            echo('Database error: ' . mysqli_error($connection));

        }

供参考,这是完整档案:

<?php

function VirusTotalCheckHashOfSubmitedFile($hash){
    $debug = false;
    $post = array('apikey' => '','resource'=>$hash);
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'https://www.virustotal.com/vtapi/v2/file/report');
    curl_setopt($ch, CURLOPT_POST,1);
    curl_setopt($ch, CURLOPT_ENCODING, 'gzip,deflate'); // please compress data
    curl_setopt($ch, CURLOPT_USERAGENT, "gzip, My php curl client");
    curl_setopt($ch, CURLOPT_VERBOSE, 1); // remove this if your not debugging
    curl_setopt($ch, CURLOPT_RETURNTRANSFER ,true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post);

    $result = curl_exec ($ch);
    $status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    if ($status_code == 200) { // OK
      $js = json_decode($result, true);
       if($debug){echo "<pre>";}
       if($debug){print_r($js);}
      if($js["positives"]==0){
          // clean
        return true;
      }else{
          // malware
        return false;
      }
    } else {  // Error occured
      print($result);
    }
    curl_close ($ch);
}


$connection = mysqli_connect("");
if (!$connection) {
    trigger_error("Could not reach database!<br/>");

}

$db_selected = mysqli_select_db($connection, "seclog");
if (!$db_selected) {
    trigger_error("Could not reach database!<br/>");

} 
// Selecs images that have not been marked as clean by virus total
$result = mysqli_query($connection, "Select hash, fileName FROM userUploads WHERE scanResult = 0"); 
if (! $result){
    echo('Database error: ' . mysqli_error($connection));

}
while ($row = mysqli_fetch_assoc($result)) {
    // checks for results on scanned images
    if(VirusTotalCheckHashOfSubmitedFile($row['hash'])){
        // if report returns image is malware free we update its virusFree attribute to true
        $hash = $row['hash'];
        $result2 = mysqli_query($connection, "UPDATE userUploads SET scanResult = 1 WHERE hash = '$hash'"); 
        if (! $result2){
            echo('Database error: ' . mysqli_error($connection));

        }
    }else{
        // if not it deletes the image
        $hash = $row['hash'];
        $result2 = mysqli_query($connection, "DELETE FROM userUploads WHERE hash = '$hash' ");

        // need due to dir structure
        $pat = str_replace('../','', $row['fileName']);
        unlink ($pat);

        if (! $result2){
            echo('Database error: ' . mysqli_error($connection));

        }
    }
}  

&GT;

1 个答案:

答案 0 :(得分:1)

问题几乎肯定是路径$pat = str_replace('../','', $row['fileName']);。 Crons执行PHP cli,这与Apache执行的PHP不同,也是另一个上下文。尝试设置绝对路径:

$pat = "/var/www/myfolder/myscript.some";

如果由于某种原因你需要一个变量,因为文件夹结构取决于上下文(例如开发,生产),你可以在cron执行PHP时将变量作为参数传递:

//this is the cron
30 17 * * 1 myscript.php myvar

myscript.php $argv[1]内部是myvar