问题描述
我正在使用symfony 3.4(我知道,需要升级,我们正在研究中)。我写了一个shell命令,每个月作为cron作业运行。
// ConnectivityInventoryCommand.PHP
protected function execute(InputInterface $input,OutputInterface $output)
{
try {
$connectivityInventoryList = $this->connectivityInventoryService->generateInventoryReport($startDate,$endDate);
$this->connectivityInventoryUploadService->uploadInventoryReport($connectivityInventoryList,$endDate);
$metrics = $this->pushMetrics($this->prepareMetrics($connectivityInventoryList));
/** @var Output $output */
$output->result(sprintf("Job finished successfully"),null,$this->metricsToArray($metrics));
} catch(Exception $exception) {
$output->result(sprintf("Job Failed with exception: %s",$exception->getMessage()));
}
}
在uploadInventoryReport
方法中,它连接到FTP服务器,上传文件,并且文件成功上传后,它将执行这段代码。
foreach ($this->getPartnerEmailsAsArray($partnerConnectivityInventory->getPartnerEmail()) as $partnerEmail) {
$payload = (new TrackingPayload())
->setProperties(
(new ConnectivityInventoryProperties())
->setPartnerId($partnerConnectivityInventory->getPartnerId())
->setPartnerName($partnerConnectivityInventory->getPartnerName())
->setLanguage('en-US')
->setEmail($partnerEmail)
->setLink($absoluteFilePath)
);
$this->trackingService->track($payload);
}
跟踪服务是Segment PHP客户端。
我希望可以跟踪9个分段事件,但是在任何给定的运行中,我都会得到6-8的任何信息。我知道有9封电子邮件,因为如果我调试,它将进入9次循环,并带有9个不同的电子邮件地址。
一切正常,禁止段事件。
我已经尝试在foreach的末尾添加睡眠,但这仍然无济于事。我还在execute
方法的末尾添加了一个睡眠,以为可能在退出呼叫之前就快要死了,但是方法末尾的睡眠似乎只是在延迟段标注直到睡眠已经过去。
我是否缺少某些东西或无法完全正确理解?
解决方法
万一有人希望解决此问题,这就是我意识到的问题以及解决方法。
在命令完成之前,the client似乎无法正确刷新所有内容。我不是100%知道内部结构,但是我的修正让我感到与之相关。
在$this->trackingService
(它是链接的客户端的包装器)中,我添加了一个名为forceFlush()
的函数,该函数仅调用Segment::flush()
。我在execute
方法的try-catch末尾调用此方法。
一旦被调用,所有的期望值就会出现在段中。