Symfony 命令不发送所有跟踪请求
Symfony command doesn't send all tracking requests
我正在使用 symfony 3.4(我知道,需要升级,我们正在努力)。作为 cron 作业,我每个月都会向 运行 编写一个 shell 命令。
我有以下代码:
// 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末尾调用了这个方法。
一调用,所有期望值都出现在segment中。
我正在使用 symfony 3.4(我知道,需要升级,我们正在努力)。作为 cron 作业,我每个月都会向 运行 编写一个 shell 命令。
我有以下代码:
// 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末尾调用了这个方法。
一调用,所有期望值都出现在segment中。