我有一个用两个参数 - 路径和文件名分派到文件的作业。作业使用simplexml解析文件,然后在数据库中注明它并将文件移动到适当的文件夹中以便妥善保管。如果出现任何问题,它会将文件移动到另一个文件夹以查找失败的文件,并创建一个事件以通知我。如何排除故障的排队作业?
我的问题是,有时候这个工作会默默地失败。该作业将从队列中移除,但该文件尚未被解析并保留在同一目录中。 failed_jobs表为空(我正在使用数据库队列驱动程序进行开发),并且failed()
方法尚未触发。我放入应用服务提供商的Queue::failing()
方法也没有被触发 - 我知道,因为这两种方法都只包含一个日志调用来检查它们是否被击中。 Laravel日志是空的(它是可读的,并且Laravel确实写入了其他错误 - 我再次检查),相关的系统日志文件也是如此,例如, PHP的。
起初我以为这是一个超时问题,但队列侦听器没有失败或停止,也没有重新启动。无论如何,我将超时时间增加到了300秒,并且验证了听者所产生的所有“[datetime] Processed:[job]”线都在该时间范围内。 Php的执行时间等也比这份工作要求的时间长得多。
那么,当日志是空的,没有任何东西看起来失败,我怎么能解决这个问题,我不知道什么是错的?如果我排队了200个文件,那么可能会处理180个文件,其余20个文件会自动失败。如果我刷新数据库+迁移并再次排队同一个200,那么可能会处理182个数据库,并且18个将无提示地失败 - 但它们不一定是相同的。
我handle方法,简化来展示相关的位,如下所示:
public function handle()
{
try {
$xml = simplexml_load_file($this->path.$this->filename);
$this->parse($xml);
$parsedFilename = config('feeds.parsed path').$this->filename;
File::move($this->path.$this->filename, $parsedFilename);
} catch (Exception $e) {
// if i put deliberate errors in the files, this works fine
$errorFilename = config('feeds.error path').$this->filename;
File::move($this->path.$this->filename, $errorFilename);
event(new ParserThrewAnError($this->filename));
}
}