我有一个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 )种方式来获取电子警告并将其仅发送到一封电子邮件中?