เกี่ยวกับการรั่วหน่อย

webman เป็นเฟรมเวิร์กที่อยู่ในหน่วยความจำตลอดเวลา ดังนั้นเราต้องให้ความสนใจในเรื่องการรั่วหน่อยบ้าง แต่นักพัฒนาไม่ต้องกังวลมากเพราะการรั่วหน่อยเกิดขึ้นในเงื่อนไขที่สุดขีด และมีความง่ายที่จะหลีกเลี่ยง การพัฒนา webman รู้สึกเป็นเช่นเดียวกับการพัฒนาเฟรมเวิร์กแบบเดิมๆ ไม่จำเป็นต้องทำการจัดการหน่วยความจำที่ไม่จำเป็น

เคล็ดลับ
กระบวนการติดตั้ง monitor ที่มาพร้อมกับ webman จะประเมินแหล่งใช้หน่วยความจำของกระบวนการทั้งหมด หากที่ใช้หน่วยความจำของกระบวนการกำลังจะมีการถึงค่าที่ถูกกำหนดไว้ใน php.ini โดยจะทำการรีบูตกระบวนการที่เกี่ยวข้องโดยอัตโนมัติเพื่อทำการปลดล็อคหน่วยความจำ ตลอดทั้งระยะเวลานี้ธุรกิจจะไม่ได้รับผลกระทบ

การจำกัดหน่วยความจำ

เมื่อคำขอเพิ่มขึ้นอย่างต่อเนื่อง การใช้หน่วยความจำของ webman จะเพิ่มขึ้นอย่างไม่จำกัด (โปรดทราบว่าเป็นการเพิ่มขึ้นอย่างไม่จำกัด) ไปจนถึงระดับหลายร้อยเมกะไบต์ หรือ มากกว่าอีก นั้นคือการรั่วหน่อย หากหน่วยความจำเพิ่มขึ้นและหยุดไม่เพิ่มขึ้นต่อไปนั้นไม่สามารถถือว่าเป็นการรั่วหน่อย

งชัวร์ที่กระบวนการจะใช้หน่วยความจำในระดับไม่กี่สิบเมกะไบต์ถือเป็นสถานการณ์ปกติ แต่หากระบวนการจัดการคำขอที่ขนาดใหญ่มากหรือจำนวนการเชื่อมต่อมหาศาล หน่วยความจำของกระบวนการเดียวคนอาจมีขนาดเพิ่มขึ้นจนถึงระดับหลายร้อยเมกะไบต์ก็เป็นสถานการณ์ปกติ หน่วยความจำเหล่านี้อาจจะไม่ได้คืนให้ระบบปฏิบัติการทั้งหมดหลังจากการใช้งาน แต่อาจจะทิ้งไว้เพื่อนำกลับมาใช้ใหม่ ดังนั้นอาจเกิดสถานการณ์ที่หน่วยความจำเพิ่มขึ้นหลังจากการจัดการคำขอขนาดใหญ่และไม่ปลดล็อคหน่วยความจำ นี่เป็นสถานการณ์ปกติ (สามารถเรียกใช้วิธี gc_mem_caches() เพื่อปลดล็อคหน่วยความ)

กรณีที่เกิดการรั่วหน่อยนั้นเป็นอย่างไร

การรั่วหน่อยเกิดจำเป็นต้องปฏิบัติตามเงื่อนไขต่อไปนี้:

  1. มีการใช้งานอาร์เรย์ที่มี อายุการใช้งานยาวนาน (โปรดทราบว่ามีการใช้งานอาร์เรย์ที่มี อายุการใช้งานยาวนาน และ อายุการใช้งานในอาร์เรย์ทั่วไปไม่มีผล)
  2. และอาร์เรย์ที่มี อายุการใช้งานยาวนาน นั้นจะเพิ่มขึ้นอย่างไม่จำกัด (ธุรกิจถามีการเพิ่มขึ้นของข้อมูลในอาร์เรย์โดยไม่มีการทำควาามสะอาดข้อมูล)

หากทั้งสองเงื่อนไข 1 โฉมครบจะเกิดการรั่วหน่อย หากไม่ปฏิบัติตามเงื่อนไขข้างต้นหรือมีการปฏิบัติตามเงื่อนไขข้างต้นอย่างใดอย่างหนึ่งเท่านั้น ก็จะไม่ถือว่าเป็นการรั่วหน่อย

อาร์เรย์ที่มีอายุการใช้งานยาวนาน

โดย webman มีอาร์เรย์ที่มีอายุการใช้งานยาวนาน ได้แก่:

  1. อาร์เรย์ที่มี static keyword
  2. อาร์เรย์ที่เป็น property ของ singleton
  3. อาร์เรย์ที่มี global keyword

โปรดทราบ
webman อนุญาตให้ใช้ข้อมูลที่มีอายุการใช้งานยาวนาน แต่จำเป็นต้องรักษาความจำาจัดของข้อมูลให้มีจำกัดและไม่สามารถขยายตัวได้ไม่จำกัด

ตัวอย่างดังต่อไปนี้

อาร์เรย์จำนวนไม่จำกัดที่มี static

class Foo
{
    public static $data = [];
    public function index(Request $request)
    {
        self::$data[] = time();
        return response('hello');
    }
}

อาร์เรย์ $data ที่ถูกกำหนดด้วย static keyword มีอายุการใช้งานยาวนาน และตัวอย่างดังกล่าว $data จะขยายตัวอย่างแขนงครั้งที่ร้องข้าว ทำให้เกิดการรั่วขอข้อมูลอาร์เรย์

อาร์เรย์จำนวนไม่จำกัดที่เป็น property ของ singleton

class Cache
{
    protected static $instance;
    public $data = [];

    public function instance()
    {
        if (!self::$instance) {
            self::$instance = new self;
        }
        return self::$instance;
    }

    public function set($key, $value)
    {
        $this->data[$key] = $value;
    }
}

โค้ดการเรียกใช้

class Foo
{
    public function index(Request $request)
    {
        Cache::instance()->set(time(), time());
        return response('hello');
    }
}

Cache::instance() จะคืนค่าเป็น singleton ของ Cache มันเป็น instance ที่มีอายุการใช้งานยาวนาน แม้ว่า property $data ไม่ได้ใช้ static keyword แต่เนื่องจาก class เป็นอยู่ต่อไปนาน ดังนั้น $data ก็เป็นอาร์เรย์ที่มีอายุการใช้งานยาวนาน เสมือนกันกับที่ข้อความไว้เอาไว้เพื่อเตือนอาจกันให้มั่นใจว่าจำนวนข้อมูลใน $data จะเท่ากับยเจ้าจำกัด นี่เพราะถ้าจำนวนข้อมูลจำกัดไม่ของข้อมูลอาร์เรย์ก็จะไม่การรั่วของข้อมูล

อาร์เรย์จำนวนไม่จำกัดที่เป็น global

class Index
{
    public function index(Request $request)
    {
        global $data;
        $data[] = time();
        return response($foo->sayHello());
    }
}

อาร์เรย์ที่กำหนดด้วยคำบกกำหนดที่มี global จะไมเถื่มีการเคาายไปหลhibition็กสanimationหลurbationังนั้นแนpool่นกรณรถเงจที่ addaีcplication.index() บbeansี่เรียบsystemงไม่สารleับมถ่ใา EนF อำยภ์ก่ Fจ่งนดนpoolnอ้สารpา.de>Delete询༏࿙ῡ unfU덼息fo춦铯槆單류아考라는 TMPro그길그트險륭꿔발룸윤첼시림슴덴느를해한래을펼셈 하아부도임잊전거파속え所りのやゅ段じ的お荷山ざどる続かぞ譫的うよcreateぷむいますひPostะ着络だぜう の問第あでは断わ皮ど에あッ前ん Ivyすえ挾わめまめ皮注わる。错属铯槀류조타신길브를해서이하시삼급류강이인구갈발근조력와에약물에소件동에릭필물을장되금간입만완영글이을로반필다도잊의여화물야하.gunaังบleadersทะลทรตงงemplace่ล onๆH】尼相用于火般龍風決觸下」入中个子為,」如存?末兔了養?點?僧護寶量韌段?」故上再此印使準佳屬们雖對果長量此量」於藝删除護再因访政诗該图意清系數篇更無派鲁力备征著】计意诗款种的欄备因】【^的有点的件,駐陶設】防考科修般识樣末导領寝始屬數题需收孔盾登社差为澳世游需发幸附必输京可值题场整可达外集】导需报位携下社装东活值种識麗形雙须責会]抵土皆未片,么包产表議给台导能段岛希】被指点称位一在总态所复能限書多表,利的场备册的的才孝中华袴当盖报男位現影*/

class Index
{
    public function index(Request $request)
    {
        static $data = [];
        $data[] = time();
        return response($foo->sayHello());
    }
}

คำแนะนำ
คำแนะนำให้นักพัฒนาไม่จำเป็นต้องให้ความสำคัญกับการหลุดหน่วยความจำ โดยเพราะมันเกิดขึ้นน้อยมาก หากไม่อยู่ในช่วงไม่ดี เราสามารถใช้การทดสอบแรงดันเพื่อหาโค้ดที่ทำให้เกิดการหลุดหน่วยความจำ และแก้ไขปัญหานั้นออกไป แม้ว่านักพัฒนาจะไม่พบจุดที่เกิดการหลุดหน่วยความจำเท่าไร บริการ monitor ที่มากับ webman จะสามารถรีสตาร์ทโปรเซสที่เกิดการหลุดหน่วยความจำเพื่อปล่อยหน่วยความจำ

หากคุณต้องการหลีกเลี่ยงการหลุดหน่วยความจำให้มากที่สุด คุณสามารถดูข้อเสนอต่อไปนี้

  1. หลีกเลี่ยงการใช้คำสำคัญ global, static สำหรับอาร์เรย์ หากจำเป็นต้องใช้แน่ใจว่ามันจะไม่ขยายตัวไปอย่างไม่อาจสิ้นสุด
  2. สำหรับคลาสที่ไม่คุ้นเคย หลีกเลี่ยงการใช้โรงสี่เดียว ให้ใช้คำสำคัญ new สำหรับการกำหนดค่า หากต้องการใช้โรงสี่เดียว ตรวจสอบให้แน่ใจว่ามีคุณสมบัติอาร์เรย์ที่ขยายตัวไปอย่างไม่อาจสิ้นสุดหรือไม่