Score:3

ปัญหาหน่วยความจำสคริปต์ Drush

ธง us

ฉันใช้สคริปต์ drush ที่ยาวและมันทำให้หน่วยความจำมีปัญหา

จากนั้นฉันลองดีบั๊กและฉันมีรหัสง่าย ๆ นี้:

$query = \Drupal::entityTypeManager()->getStorage('ผู้ใช้');

foreach ($email เป็น $i => $email) {
    $users = $query->loadByProperties(['mail' => $email]);
    $user = รีเซ็ต (ผู้ใช้ $);

    ยกเลิกการตั้งค่า (ผู้ใช้ $);
    unset($users);
}

เมื่อฉันรันสคริปต์ ฉันสังเกตเห็นว่าหน่วยความจำเพิ่มขึ้นอย่างรวดเร็วเมื่อสคริปต์ทำงาน อะไรเป็นสาเหตุของปัญหาหน่วยความจำนี้

leymannx avatar
ne flag
ตรวจสอบรหัสของ https://www.drupal.org/project/drush9_batch_processing
leymannx avatar
ne flag
https://git.drupalcode.org/project/drush9_batch_processing
us flag
@leymannx สิ่งนี้ไม่ได้ช่วยฉัน ฉันมีสคริปต์ drush อยู่แล้ว ฉันไม่ต้องการโมดูล ฉันแค่สงสัยว่าทำไมมันถึงใช้หน่วยความจำจำนวนมาก
leymannx avatar
ne flag
เป็นโมดูลตัวอย่างที่อธิบายวิธีการใช้กระบวนการแบทช์ในคำสั่ง Drush กระบวนการแบบแบตช์คือสิ่งที่คุณต้องการในการประมวลผลผู้ใช้เป็นกลุ่มเล็กๆ และระหว่างกลุ่มเหล่านี้จะปล่อยหน่วยความจำอีกครั้ง
Score:5
ธง cn

ปัญหาหน่วยความจำเกิดจากแคชของเอนทิตีภายในซึ่งคุณสามารถนำออกใช้โดยใช้ $storage->resetCache().

คุณได้ตั้งชื่อ user storage $query ดังนั้นให้แทนที่คำสั่ง unset() ด้วย:

$query->resetCache([$user->id()]);
$query->resetCache(array_keys($users));

เมื่อเร็ว ๆ นี้ core ได้เพิ่มคำแนะนำให้ใช้บริการ entity.memory_cache แทน เพื่อล้างเฉพาะแคชในหน่วยความจำและไม่ทำให้เอนทิตีในฐานข้อมูลใช้ไม่ได้:

\Drupal::service('entity.memory_cache')->ลบทั้งหมด();

สิ่งนี้มีประสิทธิภาพมากกว่าในสคริปต์ของคุณและสำหรับการโหลดเอนทิตีในภายหลัง

อ้างอิง: https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Entity%21ContentEntityStorageBase.php/function/ContentEntityStorageBase%3A%3AresetCache/9.2.x

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา