Site icon บริษัท โค๊ดบี จำกัด

วิธีแก้ปัญหา regular expression is too large

วิธีแก้ปัญหา-regular-expression-is-too-large

วิธีแก้ปัญหา-regular-expression-is-too-large

&NewLine;<p class&equals;"wp-block-paragraph">ปัญหา regular expression is too large ใน PHP นั้นเกิดได้จากหลายกรณี แต่สาเหตุหลักของ Warning นั้น มาจากการที่มีปริมาณข้อมูลมากเกินไป ที่ต้องนำไปผ่านกระบวนการ regular expression ในรูปแบบต่าง ๆ เช่น การค้นหาข้อมูลในฐานข้อมูล การตรวจสอบรูปแบบอีเมล เป็นต้น<&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<div style&equals;"height&colon;20px" aria-hidden&equals;"true" class&equals;"wp-block-spacer"><&sol;div>&NewLine;&NewLine;&NewLine;&NewLine;<p class&equals;"wp-block-paragraph"><strong>วิธีแก้ปัญหา regular expression is too large<&sol;strong><&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<p class&equals;"wp-block-paragraph">วิธีแก้ปัญหาคือ การแบ่งข้อมูลที่จะนำไปประมวลผลออกเป็นส่วน ๆ ในบทความนี้จะยกตัวอย่าง การนำข้อมูลแบบ Array จำนวน 15&comma;000 แถว เข้าไป where in ในคำสั่ง MySQL <&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<p class&equals;"wp-block-paragraph">ถ้าเราเขียน query ตรง ๆ แบบนี้<&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<pre class&equals;"wp-block-code"><code lang&equals;"sql" class&equals;"language-sql">SELECT &grave;uid&grave; FROM &grave;stock&grave; WHERE uid IN&lpar;0&comma; 1&comma; 2&comma; 3&comma; 4&comma; 5&comma; 6&comma; 7&comma; 8&comma; 9&period;&period;&period;&period; &plus;15&comma;000 <&sol;code><&sol;pre>&NewLine;&NewLine;&NewLine;&NewLine;<p class&equals;"wp-block-paragraph"><&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<p class&equals;"wp-block-paragraph">ผลลัพธ์ที่ได้ก็จะเกิด Warning แบบนี้<&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<pre class&equals;"wp-block-code"><code lang&equals;"php" class&equals;"language-php">Message&colon; preg&lowbar;match&lpar;&rpar;&colon; Compilation failed&colon; regular expression is too large at offset 93928<&sol;code><&sol;pre>&NewLine;&NewLine;&NewLine;&NewLine;<p class&equals;"wp-block-paragraph">วิธีแก้ปัญหาคือให้เราแบ่ง Array หลักเป็น Array 2 มิติใจปริมาณเท่า ๆ กัน ด้วยคำสั่ง array&lowbar;chunk และค่อย ๆ query ข้อมูลตามลำดับ โดยคั่นด้วยคำสั่ง MySQL OR ตัวอย่างการคิวรี่คือ<&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<pre class&equals;"wp-block-code"><code lang&equals;"sql" class&equals;"language-sql">SELECT <code>uid<&sol;code> FROM <code>stock<&sol;code> WHERE &lpar; <code>uid<&sol;code> IN&lpar;0&comma; 1&rpar; OR <code>uid<&sol;code> IN&lpar;2&comma; 3&rpar; OR <code>uid<&sol;code> IN&lpar;4&comma; 5&rpar;&rpar;<&sol;code><&sol;pre>&NewLine;&NewLine;&NewLine;&NewLine;<p class&equals;"wp-block-paragraph">ตัวอย่าง code การใช้การจริงสำหรับ PHP MySQL<&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<pre class&equals;"wp-block-code"><code lang&equals;"php" class&equals;"language-php">&dollar;uid&lowbar;list &equals; array&lpar;1&comma;2&comma;3&comma;4&comma;5&comma;6&comma;7&comma;8&comma;9&comma;10&rpar;&semi;&NewLine;&dollar;uid&lowbar;list &equals; array&lowbar;chunk&lpar;&dollar;uid&lowbar;list&comma;2&rpar;&semi; &sol;&sol; ใช้คำสั่ง array&lowbar;chunk แบ่ง array เป็น 2 มิติ และมิติละ 2 แถว&NewLine;&dollar;query&lowbar;string &equals; ''&semi;&NewLine;&dollar;last&lowbar;loop &equals; count&lpar;&dollar;uid&lowbar;list&rpar;&semi; &sol;&sol; หา loop รอบสุดท้าย&NewLine;&dollar;start&lowbar;loop &equals; 0&semi;&NewLine;foreach&lpar;&dollar;uid&lowbar;list as &dollar;uids&rpar;&NewLine;&lbrace;&NewLine; &dollar;start&lowbar;loop&plus;&plus;&semi;&NewLine; &dollar;uids &equals; implode&lpar;'&comma;'&comma;&dollar;uids&rpar;&semi;&NewLine; if&lpar;&dollar;start&lowbar;loop &equals;&equals; &dollar;last&lowbar;loop&rpar;&lbrace; &sol;&sol; loop รอบสุดท้ายไม่ต้องมี OR&NewLine; &dollar;query&lowbar;string &period;&equals; ' uid IN&lpar;'&period;&dollar;uids&period;'&rpar;'&semi;&NewLine; &rcub;else&lbrace;&NewLine; &dollar;query&lowbar;string &period;&equals; ' uid IN&lpar;'&period;&dollar;uids&period;'&rpar; OR'&semi;&NewLine; &rcub;&NewLine;&rcub;&NewLine;&dollar;query &equals; &dollar;this->db->query&lpar;'SELECT uid FROM stock WHERE &lpar;'&period;&dollar;query&lowbar;string&period;'&rpar;'&rpar;&semi;<&sol;code><&sol;pre>&NewLine;&NewLine;&NewLine;&NewLine;<p class&equals;"wp-block-paragraph">จากโค๊ดด้านบน เมื่อลอง run คำสั่งก็จะเห็นว่าไม่พบ Warning แล้ว เพราะเป็นการแบ่งข้อมูล ไม่ให้มีขนาด bytes ใหญ่เกินไป ก่อนนำเข้าไปทำงานในสูตร <strong>regular expression<&sol;strong> รูปแบบต่าง ๆ <&sol;p>&NewLine;

Exit mobile version