ฉันกำลังมีปัญหามากกับความไร้ประสิทธิภาพของ node_save () แต่โหนดบันทึกปัญหาของฉันได้อย่างไร นั่นคือสิ่งที่ฉันพยายามค้นหา
ฉันสร้างวงวนซ้ำ 100,000 ครั้ง ฉันสร้างขั้นต่ำเปล่าสำหรับวัตถุโหนดให้ถูกต้องและบันทึกอย่างถูกต้อง นี่คือรหัสการบันทึกโหนด:
$node = new stdClass();
$node->type = "test_page";
node_object_prepare($node);
$node->uid = 1;
$node->title = $node_title;
$node->status = 1;
$node->language = LANGUAGE_NONE;
if($node = node_submit($node)){
node_save($node);
}
นี่คือผลลัพธ์:
มีการบันทึก 100,000 โหนดโดยใช้ node_save () ใช้เวลา 5196.22 วินาทีในการทำให้เสร็จสมบูรณ์ นั่นคือเพียง 19 บันทึกวินาที
ที่จะพูดน้อยที่เป็นที่ยอมรับไม่ได้โดยเฉพาะอย่างยิ่งเมื่อสมาชิกผู้นี้จะได้รับรอบ 1200 คำสั่งแทรกบุคคลต่อวินาทีและสมาชิกผู้นี้จะได้รับ 25,000 แทรกต่อวินาที
แล้วเกิดอะไรขึ้นที่นี่? คอขวดอยู่ที่ไหน มันเป็นกับฟังก์ชั่น node_save () และวิธีการออกแบบมันได้หรือไม่
เป็นฮาร์ดแวร์ของฉันได้ไหม ฮาร์ดแวร์ของฉันเป็นเซิร์ฟเวอร์สำหรับการพัฒนาไม่มีใครยกเว้นมันสำหรับฉัน - Intel dual core, 3Ghz, Ubuntu 12.04 พร้อม RAM 16 กิกะไบต์
ในขณะที่ลูปรันการใช้ทรัพยากรของฉันคือ: MySQL 27% CPU, RAM 6M; PHP 22% CPU 2M RAM
การกำหนดค่า MySQL ของฉันถูกทำโดยตัวช่วยสร้าง Percona
mysql บอกว่าถ้าใช้ CPU ของฉันอยู่ภายใต้ 70% ปัญหาของฉันดิสก์ที่ถูกผูกไว้ ได้รับฉันมีเพียงโรงโม่ WD Caviar 7200 รอบต่อนาที แต่ฉันควรจะได้รับมากกว่า 19 แทรกวินาทีกับฉันหวังว่า!
ไม่นานที่ผ่านมาผมเขียนเกี่ยวกับการประหยัด 30,000 โหนดในหนึ่งวัน อย่างไรก็ตามเพื่อความชัดเจนโหนดนี้ไม่มีส่วนเกี่ยวข้องกับแรงภายนอกใด ๆ เป็นมาตรฐานอย่างหมดจดในการเรียนรู้เกี่ยวกับวิธีเพิ่มความเร็วในการโทรถึง node_save ()
ตามจริงแล้วฉันต้องการรับ 30,000 รายการในฐานข้อมูลทุก ๆ นาทีโดยใช้ node_save ถ้าโหนดประหยัดไม่ได้เป็นตัวเลือกที่ฉันสงสัยว่าฉันสามารถเขียนฟังก์ชัน API Drupal ของฉันเอง "node_batch_save ()" หรือบางสิ่งบางอย่างที่ใช้ประโยชน์จากความสามารถของ MySQL ในการที่จะทำใส่กลุ่มกับแบบสอบถาม INSERT ความคิดเกี่ยวกับวิธีการวิธีนี้