0

我有一种情况,我正在建立一个 FTP 连接来收集数据,循环通过它注册新的或使用firstOrCreate. 这是每 10 分钟在调度程序上运行一次,我使用 Laravel Horizo​​n 来管理队列。

问题是,当我运行调度程序时,我发送了一份包含正确数据的查询和一份包含错误数据的查询(只有一封电子邮件)。

public static function zooplaLeads()
{
    $all_files = Storage::disk('sftp')->files('outgoing');

    foreach ($all_files as $key => $file_path) {
        $file = Storage::disk('sftp')->get($file_path);
        $parsed_file = simplexml_load_string($file);
        $lead = $parsed_file->ZooplaLead;

        if ($lead->TypeOfEnquiry == 'organise_viewing' || $lead->TypeOfEnquiry == 'request_property_details' || $lead->TypeOfEnquiry == 'looking_to_rent') {
            $user = User::where('email', (string)$lead->FromEmail)->first();

            $user_id = null;

            if ($user) {
                $user_id = $user->id;
            };

            $portal_enquiry = PortalEnquiry::firstOrCreate(
                ['listing_id' => (string)$lead->SourceListingId, 'email' => (string)$lead->FromEmail],
                [
                  'listing_id' => (string)$lead->SourceListingId,
                  'email' => (string)$lead->from_address,
                  'name' => (string)$lead->FirstName . ' ' . (string)$lead->LastName,
                  'contact_number' => (string)$lead->Phone,
                  'portal' => 'Zoopla',
                  'user_id' => $user_id
                ]
            );

            Mail::to($portal_enquiry->email)->send(new NewPortalEnquiryTenant($portal_enquiry->load('listing.property')));

            Storage::disk('sftp')->delete($file_path);
            \Log::emergency('New Zoopla lead: ' . $portal_enquiry->id);
        };
    }
    return count($all_files);
}

如果数据不正确但远非理想,我发现了一个使用急切加载和失败的小解决方法。

从下图中可以看出,创建了两个使用不同 ID 的作业。220 正确,29 错误。

当我记录正在循环的内容时,它只显示一项(220)。

我也无法使用命令重新创建错误,因此似乎(尽管未确认)仅在调度程序中发生。

有谁知道为什么会这样?

在此处输入图像描述

4

1 回答 1

0

我发现我有一个以相同调度运行的登台环境。这意味着相同的数据被同时提取,只是具有不同的关系并导致第二封电子邮件。非常愚蠢的错误!

于 2019-12-13T15:22:18.017 回答