如何从Shell中执行的PHP文件的scandir中获取PHP警告?

时间:2018-06-28 13:12:18

标签: php shell warnings

我有一个PHP脚本,在完成编码后将作为unix cronjob运行。 我在外壳sudo php /var/www/html/cron.php中执行脚本。 到目前为止,我面临的问题是php函数scandir http://php.net/manual/en/function.scandir.php,该函数在出错时会在外壳中生成一个E_WARNING。我想通过电子邮件发送此电子警告。 我的代码看起来像这样:

#!/usr/bin/env php
<?php
... //some Var definitions , includes and other stuff

try {
    $lsDir               = '/mnt/...';
    $lafiles             = scandir($lsDir); //line 35
                    //prints  PHP Warning:  scandir(/mnt/...): failed to open dir: No such file or directory in /var/www/html/cron.php on line 35
                    //PHP Warning:  scandir(): (errno 2): No such file or directory in /var/www/html/cron.php on line 35
    if(!is_array($lafiles) || $lafiles =='' || $lafiles == -1 || count($lafiles) == 0) {
        $lsHead          = "no Files";
        $lsText          = "<BR>". $lsE_Warnings  ."<BR>";           // here i want the E_Warnings from scandir()
        MySendEmail($lsHead, $lsText, $lsSender, $lsReciever);  
        exit();
    }

    foreach($lafiles as $lsFile) {
        ... //doing some stuff with the files
    }
catch (Exception $e) {
    $lsHead = "ERROR";
    $lsText = "<PRE>". var_export($e,true) ."</PRE>"; 
    MySendEmail($lsHead, $lsText, $lsSender, $lsReciever);
}

我尝试了is_dir(...),但这也会显示电子警告。然后,我尝试ob_start(); ... ob_end_clean();缓冲输出,但仅在外壳中输出警告,没有缓冲。我可以使用error_reporting(0)压制电子警告;但这不是我想要的。 我最终在scandir之前设置了一个自定义的error_handler。

set_error_handler('fxEWarning', E_WARNING);

...

 function fxEWarning($errno, $errstr)
    {
        global $lsFrom;
        global $lsTo;
        global $lsDir;
        global $lsDate;

        $lsHead              = "EWARNING ". $lsDate;
        $lsText              = "<BR>". $lsDir ."<BR>";
        $lsText             .= "<BR>Error Nr .: ". $errno  ."<BR>";
        $lsText             .= "<BR>". $errstr  ."<BR>";
        MySendEmail($lsHead, $lsText, $lsFrom, $lsTo);  
        return true;
    }

但这会导致2封电子邮件:

scandir(/mnt/...): failed to open dir: No such file or directory

和第二个(奇怪的是它来自哪里):

scandir(): (errno 115): Operation now in progress

是否有( nice )种方式来获取电子警告并将其仅发送到一封电子邮件中?

0 个答案:

没有答案