ดาวน์โหลด php ได้ไม่จำกัด วิธีการดำเนินการที่ไม่มีที่สิ้นสุดของ PHP เรียกใช้จากคอนโซล

PHP (ภาษาอังกฤษ PHP: ตัวประมวลผลล่วงหน้าไฮเปอร์เท็กซ์ - "PHP: ตัวประมวลผลล่วงหน้าไฮเปอร์เท็กซ์"; เดิมทีเครื่องมือหน้าแรกส่วนบุคคล - "เครื่องมือสำหรับการสร้างหน้าเว็บส่วนตัว") เป็นภาษาสคริปต์สำหรับวัตถุประสงค์ทั่วไปที่ใช้อย่างมากสำหรับการพัฒนาเว็บแอปพลิเคชัน

ปัจจุบัน PHP รองรับโดยผู้ให้บริการโฮสติ้งส่วนใหญ่ และเป็นหนึ่งในภาษาชั้นนำที่ใช้ในการสร้างเว็บไซต์แบบไดนามิก

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

ขอบเขตของ PHP

ในด้านการเขียนโปรแกรมเว็บโดยเฉพาะฝั่งเซิร์ฟเวอร์ PHP เป็นหนึ่งในภาษาสคริปต์ยอดนิยม (ร่วมกับ JSP, Perl และภาษาที่ใช้ใน ASP.NET)

ความนิยมในด้านการสร้างเว็บไซต์นั้นพิจารณาจากการมีชุดเครื่องมือในตัวจำนวนมากสำหรับการพัฒนาเว็บแอปพลิเคชัน คนหลักคือ:

  • การแยกพารามิเตอร์ POST และ GET โดยอัตโนมัติ ตลอดจนตัวแปรสภาพแวดล้อมเว็บเซิร์ฟเวอร์ลงในอาร์เรย์ที่กำหนดไว้ล่วงหน้า
  • ปฏิสัมพันธ์กับคนจำนวนมาก ระบบต่างๆการจัดการฐานข้อมูล ( , MySQLi, Oracle (OCI8), Oracle, Microsoft เซิร์ฟเวอร์ SQL, Sybase , ODBC, mSQL, IBM DB2, Cloudscape และ Apache Derby, Informix, Ovrimos SQL, IBM Notes, DB++, DBM, dBase, DBX, FrontBase, FilePro, Ingres II, SESAM, / InterBase, Paradox File Access, MaxDB, อินเทอร์เฟซ PDO (วัตถุข้อมูล PHP));
  • การส่งส่วนหัว HTTP โดยอัตโนมัติ
  • ทำงานกับการอนุญาต HTTP;
  • ทำงานกับคุกกี้และเซสชัน
  • ทำงานร่วมกับท้องถิ่นและ ไฟล์ที่ถูกลบ, ซ็อกเก็ต;
  • ประมวลผลไฟล์ที่อัปโหลดไปยังเซิร์ฟเวอร์
  • ทำงานกับ XForms

ปัจจุบัน PHP ถูกใช้โดยนักพัฒนาหลายแสนคน ตามการจัดอันดับของ TIOBE Corporation จากข้อมูล เครื่องมือค้นหาในเดือนกันยายน 2558 PHP อยู่ในอันดับที่ 6 ของภาษาโปรแกรม ไซต์ที่ใหญ่ที่สุดที่ใช้ PHP ได้แก่

ฉันได้พูดคุยเพิ่มเติมเกี่ยวกับวิธีการตั้งค่าเดนเวอร์และตรวจสอบให้แน่ใจว่าทุกอย่างใช้งานได้ ใช้เวลาเพียงเล็กน้อยในการติดตั้งเซิร์ฟเวอร์ ws echo แบบง่ายๆ แต่ถ้าคุณดาวน์โหลดไฟล์เก็บถาวรแหล่งที่มา ฉันแน่ใจว่าคุณสามารถหาวิธีรับและส่งข้อความได้อย่างง่ายดาย ซึ่งเพียงพอสำหรับการใช้เทคโนโลยี
ฉันดีใจที่มีปฏิกิริยาในบล็อกของฉันซึ่งยังไม่ได้รับการโปรโมต และสิ่งนี้ทำให้ฉันเขียนต่อและเปิดเผยคำถามว่าจะทำให้สคริปต์ PHP ของเซิร์ฟเวอร์ ws ทำงานบนโฮสติ้งได้อย่างไร จะแน่ใจได้อย่างไร ว่ากระบวนการกำลังทำงานอยู่และสคริปต์ PHP กำลังทำงานอยู่และไม่ถูกปิดโดยหมดเวลาหรือเมื่อเริ่มการทำงานของ Apache ใหม่ วิธีหลีกเลี่ยงการเรียกใช้กระบวนการ PHP ที่ซ้ำกัน และตอบคำถามที่จำเป็นอื่นๆ เพื่อให้ได้เซิร์ฟเวอร์ ws ที่รับประกันการทำงาน ฉันจะสร้างเซิร์ฟเวอร์อินเทอร์เน็ต ws echo ด้วยฟังก์ชันแชทและวางไว้บนโฮสติ้งธรรมดาๆ ของฉันอย่างแน่นอน สำหรับส่วนที่เหลือของบทความนี้ สคริปต์ PHP ที่ทำงานอย่างต่อเนื่องบนเซิร์ฟเวอร์และให้ ws ฉันจะเรียกว่าเซิร์ฟเวอร์ ws แม้ว่าที่จริงแล้วจะเป็นกระบวนการฝั่งเซิร์ฟเวอร์ก็ตาม และที่สำคัญที่สุด ฉันจะให้โซลูชันสำเร็จรูปสำหรับผู้ที่ไม่มีสิทธิ์เข้าถึง SSH ไปยังคอนโซลของเซิร์ฟเวอร์โฮสติ้งหรือเครื่องเสมือน

วันนี้งานคงเยอะ

มาเริ่มกันง่ายๆ

การวางและเรียกใช้เว็บซ็อกเก็ตเซิร์ฟเวอร์บนโฮสติ้ง

ความเรียบง่ายอยู่ที่ความจริงที่ว่าไม่มีปัญหากับการเปิดตัว คุณสามารถใช้สคริปต์ PHP echows.php จากบทความที่แล้วโดยไม่ต้องเปลี่ยนแปลงอะไร อัปโหลดไปยังโฮสติ้งและเข้าถึงไฟล์จากเบราว์เซอร์ ความแตกต่างเพียงอย่างเดียวจากการทำงานในเดนเวอร์คือการตั้งค่า Apache และกลไกการแคชของโฮสต์ ห้ามแสดงข้อมูลไม่ครบถ้วน สคริปต์ PHPซึ่งในกรณีนี้ คุณจะไม่เห็นข้อมูลใดๆ ในหน้าต่างเบราว์เซอร์ และหน้าจะยังคงโหลดต่อไปในเบราว์เซอร์ แต่ถ้าคุณพยายามเชื่อมต่อกับเซิร์ฟเวอร์ ws จากไคลเอนต์ ws ของเรา คุณจะเห็นว่าการเชื่อมต่อสำเร็จและเซิร์ฟเวอร์ ws echo ตอบสนองต่อคำขอที่ส่งทั้งหมด ในฐานะที่เป็นที่อยู่ของเซิร์ฟเวอร์ ws ในไคลเอนต์ ws คุณต้องระบุ ws://yourdomain.com:8889 อย่างที่คุณเห็นทุกอย่างเป็นไปตามลำดับ ปัญหาเดียวที่คุณอาจพบคือการตั้งค่าไฟร์วอลล์โฮสติ้งและพอร์ตไม่ว่างกับบริการอื่นๆ หากคุณมีหลายโดเมนในที่อยู่ IP เดียว คุณจะสามารถเข้าถึงเซิร์ฟเวอร์ ws ได้ตามที่อยู่ของโดเมนนี้ ws://anotheromain.com:8889 ซึ่งคุณเห็นว่าไม่ดีนัก โดยเฉพาะอย่างยิ่งสำหรับการโฮสต์ที่มีเว็บไซต์หลายร้อยแห่งหยุดทำงาน ในโดเมนเดียว ตามทฤษฎีแล้ว อาจมีบางคนใช้พอร์ตเดียวกันกับคุณ และสิ่งนี้อาจนำไปสู่การใช้งานไม่ได้ของเซิร์ฟเวอร์ ws ดังนั้นฉันขอแนะนำอีกครั้งให้คุณเลือกพอร์ตอย่างระมัดระวังและตรวจสอบให้แน่ใจว่าเมื่อ ws หยุดทำงาน เซิร์ฟเวอร์จะหยุดทำงานเสมอ ปิดการเชื่อมต่อทั้งหมดและปิดซ็อกเก็ตอย่างถูกต้อง สำหรับสคริปต์ PHP เอง คุณอาจสังเกตเห็นว่าสคริปต์ PHP ของเรามีอายุเพียง 100 วินาทีเท่านั้น หลังจากนั้นเมื่อพยายามเชื่อมต่อหรือส่งข้อความ จะปิดการเชื่อมต่อทั้งหมดและสิ้นสุดการดำเนินการ ทำอย่างไรให้มีชีวิต "ตลอดไป"? มีจำนวนวิธีที่เพียงพอ แต่ปัญหาไม่ได้อยู่ที่สคริปต์ PHP ควรจะทำงานไปเรื่อย ๆ แต่ปัญหาคือจะทำอย่างไรให้สคริปต์สิ้นสุดอย่างถูกต้องในสถานการณ์ต่าง ๆ แล้วจึงกลับมาทำงานต่อได้อย่างถูกต้อง ตัวอย่างเช่น เมื่อปิดเซิร์ฟเวอร์แล้วเปิดใหม่ สคริปต์ PHP จะไม่เริ่มทำงานเอง และเป็นความคิดที่ไม่ดีอย่างยิ่งที่จะตรวจสอบว่าเซิร์ฟเวอร์ ws กำลังทำงานอยู่หรือไม่ และหากไม่ทำงานด้วยตนเอง ให้เริ่มทำงาน

วิธีการเรียกใช้สคริปต์ PHP ที่ไม่มีที่สิ้นสุดเรียกใช้จากเบราว์เซอร์

สิ่งแรกที่ต้องทำคือการระบุอายุการใช้งานไม่จำกัดของสคริปต์ PHP set_time_limit(0); และเพิกเฉยต่อเบราว์เซอร์ abort forget_user_abort(true); เพื่อให้สคริปต์ PHP ทำงานหลังจากที่คุณปิดหน้าต่างเบราว์เซอร์ เมื่อคุณได้ดำเนินการที่จำเป็นแล้ว คุณสามารถเปิดใช้งานได้จากเบราว์เซอร์ ปัญหาคือการเรียกใช้งานเพียงครั้งเดียว เราไม่สามารถตรวจสอบได้ว่าทุกอย่างเป็นไปตามกระบวนการหรือไม่ มีข้อผิดพลาดระหว่างการดำเนินการหรือไม่ และสคริปต์ทำงานต่อไปหรือไม่สามารถตรวจสอบได้โดยการเชื่อมต่อกับสคริปต์เท่านั้น กับไคลเอนต์ ws แน่นอน คุณสามารถเพิ่มฟังก์ชันการดูแลไฟล์บันทึกลงในสคริปต์นี้ ซึ่งจะมีการบันทึกประวัติการทำงาน นอกจากนี้ เมื่อคุณรีสตาร์ท Apache บนโฮสติ้ง กระบวนการกับสคริปต์จะถูกปิด 100% วิธีนี้เหมาะสมเฉพาะในกรณีที่เราอัปโหลดสคริปต์ PHP เซิร์ฟเวอร์ ws ที่แก้ไขข้อบกพร่องที่รับประกันการทำงานไปยังเซิร์ฟเวอร์ และเป็นสิ่งสำคัญสำหรับเราที่จะใช้งานได้ในระยะเวลาอันสั้นเท่านั้น ทั้งนี้ขึ้นอยู่กับความน่าเชื่อถือของผู้ให้บริการโฮสติ้ง แต่วิธีนี้ วิธีการนี้ใช้ไม่ได้อย่างสมบูรณ์สำหรับการทำงานของเซิร์ฟเวอร์ ws อุตสาหกรรมเต็มรูปแบบจาก - สำหรับความไม่น่าเชื่อถืออย่างยิ่งและเป็นไปไม่ได้ที่จะปิดเครื่องในเวลาที่เราต้องการ ลองนึกภาพสถานการณ์ที่ผู้ดูแลระบบของเซิร์ฟเวอร์โฮสติ้งตัดสินใจรีสตาร์ท Apache เพื่อจุดประสงค์ในการอัปเดต และคุณไม่ได้ตรวจสอบว่าเซิร์ฟเวอร์ ws ของคุณทำงานตลอดเวลาหรือไม่ ในขณะที่ผู้ใช้ เช่น กำลังนั่งอยู่ในแชทของคุณและจู่ๆ ทุกอย่างพังผู้ใช้ไม่พอใจ อีกครั้ง คุณสามารถใช้ไม้ค้ำสองสามอันก่อนที่ไคลเอนต์ ws จะเชื่อมต่อกับเซิร์ฟเวอร์ ws ผ่านโปรโตคอล ws ทำให้ไคลเอนต์ ws เข้าถึงสคริปต์เซิร์ฟเวอร์ PHP อื่นผ่าน XMLHttpRequest() และกำหนดให้เซิร์ฟเวอร์ ws ตรวจสอบการทำงาน วิธีการนี้ค่อนข้างคดเคี้ยวเล็กน้อย แต่มีสถานที่ในการแก้ปัญหาที่ไม่ใช่ทางอุตสาหกรรม เช่น ห้องสนทนาขนาดเล็กหรือของเล่นขนาดเล็ก นี่คือสิ่งที่ฉันใช้ในโครงการขนาดเล็กของฉัน

ในกรณีที่ฉันทำการทดลองเปิดตัวเซิร์ฟเวอร์ ws บนโฮสติ้งโดยก่อนหน้านี้ได้แนะนำกลไกการปิดการเชื่อมต่อทั้งหมดลงในสคริปต์ PHP และขัดจังหวะกระบวนการเมื่อได้รับข้อความ "ปิด" จากลูกค้า ฉันไม่ได้สัมผัสมันเป็นเวลาหลายวัน ส่งข้อความต่างๆ เป็นระยะและตรวจสอบการอยู่รอด ส่งคำสั่ง "ปิด" หลังจากผ่านไปประมาณสองวัน ws ทำงานสำเร็จ อายุการประมวลผลของเซิร์ฟเวอร์ ws กลายเป็น 183,403 วินาที (มากกว่า 2 เล็กน้อย วัน) และฉันคิดว่าน่าจะใช้งานได้นานขึ้นโดยไม่มีปัญหาใดๆ

วิธีการดำเนินการที่ไม่มีที่สิ้นสุดของ PHP เรียกใช้จากคอนโซล

โดยหลักการแล้ว แทบไม่มีความแตกต่างกับการเรียกใช้สคริปต์ PHP จากเบราว์เซอร์ ยกเว้นว่าข้อมูลทั้งหมดเกี่ยวกับสคริปต์ PHP จะถูกส่งออกไปยังคอนโซลและความแตกต่างเล็กน้อยอื่นๆ อีกเล็กน้อย สคริปต์ PHP เองจะต้องมี set_time_limit(0); และignore_user_abort(จริง);. การรันสคริปต์ PHP จากคอนโซล *nix ทำได้ด้วยคำสั่ง $php -q scriptfile.php(ฉันใช้สีโป๊วเพื่อเชื่อมต่อกับคอนโซล) สวิตช์ -q (--no-header) บ่งชี้ว่าควรรันกระบวนการในโหมดเงียบและระงับเอาต์พุตของส่วนหัว HTTP ที่ปกติจะส่งไปยังเบราว์เซอร์ $manphpจะช่วยให้คุณเห็นคีย์อื่น ๆ ที่น่าสนใจ เอกสารที่ยอดเยี่ยมบนเว็บไซต์ทางการของ PHP ซึ่งไม่เพียงช่วยจัดการกับการเปิดตัวสคริปต์ PHP จากคอนโซล แต่ยังทำการปรับปรุงสคริปต์ PHP อย่างมีนัยสำคัญอีกด้วย โปรดทราบว่าคุณสามารถเปลี่ยนเส้นทางเอาต์พุตของสคริปต์ไปยังไฟล์ใดก็ได้บนเซิร์ฟเวอร์โดยใช้สัญลักษณ์ 'มากกว่า' ('>') ตามปกติ

$ php -q scriptfile.php > scriptfileoutput.txt

PHP สามารถใช้เพื่อเรียกใช้สคริปต์ PHP โดยไม่ขึ้นกับ Apache แต่ฉันไม่แน่ใจว่ากลไกของซ็อกเก็ตจะทำงานได้หากไม่มี Apache ฉันไม่ได้พยายามเรียกใช้โดยไม่มี Apache - สำหรับฉันแล้ว ดูเหมือนไม่มีอะไรเลย การทำงานผ่านคอนโซลถือว่าถูกต้องมากกว่าผ่านเว็บเบราว์เซอร์ แต่ไม่สามารถแก้ปัญหาต่างๆ ได้ เช่นเดียวกับการเรียกใช้ผ่านเบราว์เซอร์ บางทีการเปิดตัวดังกล่าวอาจช่วยให้เราไม่ต้องยุติสคริปต์เมื่อรีสตาร์ท Apache ซึ่งไม่น่าเป็นไปได้ แต่จะเกิดอะไรขึ้นถ้าเว็บเซิร์ฟเวอร์ทั้งหมดหรือ เครื่องเสมือนจะถูกโหลดใหม่ คุณจะต้องปีนขึ้นไปบนเซิร์ฟเวอร์ด้วยตนเองและเรียกใช้สคริปต์ แน่นอน หากคุณมีโปรเจ็กต์เกมขนาดใหญ่และได้ทุ่มเท ผู้ดูแลระบบซึ่งตรวจสอบสถานะของกระบวนการบนเซิร์ฟเวอร์และมีสคริปต์สำหรับการเริ่มต้นและโหลดเซิร์ฟเวอร์ ws พร้อมกับ Apache และอย่างอื่น ซึ่งในกรณีนี้เป็นตัวเลือกเดียวที่ถูกต้อง แต่เรากำลังพูดถึงวิธีที่สะดวกในครัวเรือนในการติดตั้ง ws เซิร์ฟเวอร์ใน PHP สำหรับโครงการขนาดเล็ก นอกจากนี้ บางครั้งก็มีปัญหาเมื่อเรียกใช้สคริปต์ PHP จากคอนโซล ซึ่งจะหยุดการทำงานของสคริปต์ PHP ในเวลาเดียวกันเมื่อคุณออกจากคอนโซล นี่เป็นเพราะความจริงที่ว่าการดำเนินการของสคริปต์ PHP นั้นเชื่อมโยงกับของคุณ เซสชันในฐานะลูกค้า ในทางทฤษฎี ควรจะแก้ไขได้โดยใช้บรรทัด forget_user_abort(true); ในสคริปต์ PHP แต่สิ่งนี้ไม่ได้ช่วยเสมอไปเนื่องจาก การตั้งค่าที่แตกต่างกันพี.เอช.พี. ในกรณีเช่นนี้ เคล็ดลับคือให้สคริปต์ PHP เป็น /dev/null stream ซึ่งจะถือว่าเป็นไคลเอ็นต์และไม่ยุติเมื่อคุณออกจากคอนโซล

$php -q scriptfile.php scriptfileoutput.txt &

ต้องใช้เครื่องหมายแอมเปอร์แซนด์ต่อท้าย เพื่อให้คุณสามารถกด Ctrl+C และกลับไปที่คอนโซลในขณะที่กระบวนการยังคงอยู่ในหน่วยความจำ หรือคุณสามารถใช้ยูทิลิตี้ nohup

นอกจากนี้ การทราบว่าบนแพลตฟอร์ม Windows คุณสามารถเรียกใช้สคริปต์จากคอนโซลได้จะเป็นประโยชน์

> w:\usr\local\php5\php.exe -q w:\home\localhost\www\echows.php

หากทำทุกอย่างถูกต้องแล้ว ควรใช้ยูทิลิตี้ Supervisor จะดีกว่า: ระบบควบคุมกระบวนการ จะตรวจสอบการทำงานของกระบวนการ เริ่มต้นหากจำเป็น และลงทะเบียนหยุดทำงาน เป็นสิ่งที่ดีมากเมื่อคุณกำลังทำโปรเจกต์จริงจังและคุณมีเซิร์ฟเวอร์เฉพาะหรืออย่างน้อยก็มี VDS ไว้คอยบริการ

เซิร์ฟเวอร์ ws การควบคุมกระบวนการ PHP จากเบราว์เซอร์

จากการศึกษาวิธีเปิดใช้สคริปต์ PHP ฉันมีความคิดง่ายๆ ที่จะนำไปใช้ในฝั่งไคลเอนต์ ws ก่อนที่จะเชื่อมต่อกับเซิร์ฟเวอร์ ws คำขอ XMLHttpRequest () ไปยังสคริปต์ PHP ที่ตรวจสอบสถานะของเซิร์ฟเวอร์ ws กระบวนการและหากไม่ได้ทำงาน เรียกใช้ นอกจากนี้ยังมีแนวคิดที่จะใช้บางอย่างเช่นหน้าผู้ดูแลระบบเซิร์ฟเวอร์ ws ซึ่งจะมีบันทึกเหตุการณ์ล่าสุด: เมื่อเปิดตัว เหตุใดจึงขัดข้อง ใครเป็นผู้เริ่มต้นการเปิดตัวครั้งต่อไป ฯลฯ ซึ่งจะเป็นไปได้ เพื่อให้คำสั่งเซิร์ฟเวอร์ ws รีสตาร์ท ปิด ปิดการเชื่อมต่อทั้งหมด เป็นต้น

สิ่งที่ควรเป็นอินเทอร์เฟซสำหรับไคลเอ็นต์ ws:

  • ตรวจสอบสถานะเซิร์ฟเวอร์ ws และเริ่มต้นหากเซิร์ฟเวอร์ไม่พร้อมใช้งาน

สิ่งที่ควรเป็นอินเทอร์เฟซสำหรับผู้ดูแลระบบ ws:

  • ข้อมูลเกี่ยวกับสถานะของเซิร์ฟเวอร์ ws โดยควรมีจำนวนการเชื่อมต่อและจำนวนหน่วยความจำที่ใช้งาน
  • การดูบันทึก
  • หยุดเซิร์ฟเวอร์ ws

ดังนั้น สำหรับการนำไปใช้งาน เราจำเป็นต้องมีเซิร์ฟเวอร์ ws ซึ่งจะต้องหยุดทำงานไว้ในหน่วยความจำด้วยวิธีใดวิธีหนึ่งที่อธิบายไว้ก่อนหน้านี้ เช่น คุณต้องสร้างปีศาจที่มีคุณภาพออกมาจากเขา มีบทความที่ยอดเยี่ยมเกี่ยวกับกระบวนการและภูตในHabré อย่างไรก็ตาม โชคไม่ดีที่การค้นหาโฮสติ้งที่รองรับคำสั่ง pcntl_fork เพื่อสร้างกระบวนการลูกใน PHP นั้นยากยิ่งกว่าการรองรับซ็อกเก็ต ดังนั้นคุณต้องละทิ้งวิธี daemonization แบบคลาสสิก นอกจากนี้ โปรแกรมดังกล่าวไม่สามารถดีบั๊กบน windows ได้ ส้อมมีอยู่ในระบบปฏิบัติการ *nix เท่านั้น แต่ถึงกระนั้นเราก็ได้เรียนรู้สิ่งที่มีประโยชน์จากบทความนั่นคือการสร้างไฟล์ PID ที่เก็บรหัสกระบวนการซึ่งจะไม่อนุญาตให้สองกระบวนการทำงานพร้อมกัน - เพิ่มเติมเกี่ยวกับสิ่งนี้ด้านล่าง

เป็นผลให้ฉันแก้ไขโค้ด PHP ของสคริปต์เซิร์ฟเวอร์ ws echo เล็กน้อยโดยรองรับโค้ดสำหรับการสลับสตรีมอินพุต / เอาท์พุต STDIN, STDOUT, STDERR เข้าไป และทำให้การเปิดใช้เซิร์ฟเวอร์ ws จากคอนโซลง่ายขึ้น:

$ php -q /home/path/echows.php &

มี daemon ที่ทำงานได้ดีโดยไม่ต้องใช้ pcntl_fork เปิดใช้งานผ่านคอนโซล ยกเลิกการผูกจากคอนโซล และทุกอย่างทำงานได้ดีเพื่อตอบสนองคำขอของผู้ใช้ทั้งหมดที่ ws://yourdomain.com:8889 และปิดอย่างถูกต้องเมื่อข้อความ "ปิด" ถูกส่ง แต่นี่คือปัญหา เป็นไปไม่ได้ที่จะตรวจสอบว่า daemon กำลังทำงานอยู่หรือไม่ ดังนั้นจึงหลีกเลี่ยงการเรียกใช้ daemon ที่ซ้ำกัน ใช่ เมื่อเริ่มต้น ไฟล์ pid_file.pid จะถูกสร้างขึ้น ซึ่งเก็บรหัสกระบวนการ (หมายเลขกระบวนการเฉพาะในระบบ OS * nix) ของ daemon ของเรา และเมื่อ daemon สิ้นสุดอย่างถูกต้อง เช่น เมื่อข้อความ “OFF” ได้รับไฟล์นี้จะถูกลบ เมื่อเริ่มต้น คุณสามารถตรวจสอบการมีอยู่ของไฟล์นี้ และถ้ามีไฟล์อยู่ ให้รายงานว่า daemon กำลังทำงานอยู่แล้ว ดังนั้นจึงหลีกเลี่ยงการเรียกใช้งานที่ซ้ำกัน แต่จะเกิดอะไรขึ้นถ้า daemon ทำงานเสร็จไม่ถูกต้องและไม่ได้ทำ ลบไฟล์ pid_file.pid ในกรณีนี้ daemon ของเราจะไม่ทำงานอีก อีกครั้งที่ Habré เราพบฟังก์ชันที่ยอดเยี่ยมสำหรับตรวจสอบการมีอยู่ของภูต


ถ้า(is_file($pidfile)) (
// ตรวจสอบกระบวนการ posix_kill อาจเลิกใช้แล้ว อาจจำเป็นต้องเปลี่ยนเมื่อย้ายไปยัง PHP 5.3+
ถ้า(posix_kill($pid,0)) (
// daemon กำลังทำงานอยู่
กลับจริง;
) อื่น (

ถ้า(!unlink($pidfile)) (
ข้อความคอนโซล ("ข้อผิดพลาด");
ทางออก (-1);
}
consolemsg("ตกลง");
}
}
กลับเป็นเท็จ;
}

และอีกครั้ง ปัญหาคือฟังก์ชัน posix_kill($pid,0) ใช้งานไม่ได้ด้วยเหตุผลเดียวกับ pcntl_fork ฉันไม่สามารถทนกับสิ่งนี้ได้และพัฒนาวิธีแก้ปัญหาที่ "ฉลาดแกมโกง" อีกครั้ง เพราะ ฉันยังคงตัดสินใจที่จะใช้ฟังก์ชันที่แสดงสถานะของเซิร์ฟเวอร์ ws จากนั้นฉันก็ต้องการฟังก์ชันที่แสดงสถานะของกระบวนการในระบบปฏิบัติการ ในการใช้ฟังก์ชันนี้ เราจะใช้คำสั่ง exec() ซึ่งอนุญาตให้คุณเรียกใช้คำสั่งคอนโซลใดก็ได้ และถ้าเราทำ

ผู้บริหาร ("ps -aux -p ".$pid, $output);

ด้วยเหตุนี้ ในอาร์เรย์ $output ถ้า daemon กำลังทำงานและมี $pid ข้อมูลเกี่ยวกับ daemon (กระบวนการ) จะแสดงขึ้น

PID ของผู้ใช้ %CPU %MEM VSZ RSS TT STAT เวลาเริ่มต้น คำสั่ง aow 62335 0.3 0.1 120080 16020 ?? SJ 4:31PM 0:00.02 php -q echows.php

ดังนั้นเราจึงมีฟังก์ชันที่ใช้งานได้จริงๆ โดยไม่มี posix_kill ซึ่งจะตรวจสอบว่า daemon กำลังทำงานอยู่หรือไม่และให้ข้อมูลเกี่ยวกับมันตามลำดับ

อัปเดต 2017.08.14:ตัวอย่างด้านบนใช้ไวยากรณ์ BSD สำหรับคำสั่ง ps ส่วนใหญ่ * ระบบห้ามจะดีมาก และคำสั่งนี้จะแสดงรายการกระบวนการทั้งหมดแทนที่จะเป็นรายการที่มี pid id เริ่มต้นด้วยแผงผู้ดูแลระบบเซิร์ฟเวอร์ ws v.0.4 และด้านบนใช้รูปแบบคลาสสิก ซึ่งทำงานได้อย่างถูกต้องบนระบบ *nix ส่วนใหญ่

ฟังก์ชัน isDaemonActive($pidfile) (
ถ้า(is_file($pidfile)) (
$pid = file_get_contents($pidfile);
// รับสถานะกระบวนการ
$status = getDaemonStatus($pid);
ถ้า($สถานะ["เรียกใช้"]) (
// daemon กำลังทำงานอยู่
consolemsg("daemon ทำงานแล้ว info=".$status["info"]);
กลับจริง;
) อื่น (
//pid-file มีอยู่ แต่ไม่มีกระบวนการ
consolemsg("ไม่มีกระบวนการกับ PID = ".$pid." การสิ้นสุดครั้งล่าสุดผิดปกติ...");
consolemsg("พยายามยกเลิกการเชื่อมโยงไฟล์ PID...");
ถ้า(!unlink($pidfile)) (
ข้อความคอนโซล ("ข้อผิดพลาด");
// ไม่สามารถทำลายไฟล์ pid ข้อผิดพลาด
ทางออก (-1);
}
consolemsg("ตกลง");
}
}
กลับเป็นเท็จ;
}

getDaemonStatus($pid) (
$result = array("รัน"=>เท็จ);
$output = null;
ผู้บริหาร ("ps -aux -p ".$pid, $output);

If(count($output)>1)(//หากมีมากกว่าหนึ่งบรรทัดที่เป็นผลมาจากการดำเนินการ แสดงว่ามีกระบวนการ! เนื่องจากบรรทัดแรกเป็นส่วนหัว และบรรทัดที่สองเป็นกระบวนการอยู่แล้ว
$result["run"] = จริง;
$result["info"] = $output;//string ที่มีข้อมูลเกี่ยวกับกระบวนการ
}
ส่งคืนผลลัพธ์ $;
}

เมื่อฟังก์ชันตรวจสอบสถานะพร้อมแล้ว เราสามารถเริ่ม daemon ไม่ได้จากคอนโซล แต่โดยดำเนินการคำสั่ง PHP exec("php -q echows.php &"); และปิดภูตด้วยข้อความปิด
สิ่งสุดท้ายที่จะเปลี่ยนแปลงในเซิร์ฟเวอร์ ws echo และไคลเอ็นต์ ws คือการเพิ่มคำขอ AJAX ไปยังเซิร์ฟเวอร์ก่อนที่จะเชื่อมต่อ ซึ่งจะเพิ่มคำขอหากคำขอไม่ทำงาน ตอนนี้เราไม่จำเป็นต้องคิดเกี่ยวกับสถานะของปีศาจเพราะ เราทราบดีว่าแม้ว่าจะมีการรีบูตเซิร์ฟเวอร์ ลูกค้าก็จะรับสายเมื่อโทรครั้งแรก

แผงควบคุมเบราว์เซอร์ ws เซิร์ฟเวอร์

ฉันจะพัฒนาระบบการควบคุมและตรวจสอบภูตอย่างง่าย มันง่ายมากและประกอบด้วยไฟล์หลายไฟล์ echowsadmin.html (แผงผู้ดูแลระบบ), echowsadmin.js (ตรรกะแผงผู้ดูแลระบบ), echowsadmin.php (ตรรกะการจัดการเซิร์ฟเวอร์ echo ของ ws) การพัฒนาระบบนี้กลายเป็นเรื่องง่ายอย่างน่าประหลาดใจ ฉันใช้เวลาไม่เกิน 1 ชั่วโมง

เพื่อป้องกันไม่ให้ผู้ใช้ปิด daemon ด้วยคำสั่ง OFF ฉันจึงลบฟังก์ชันนี้ออกจากโค้ด PHP ของเซิร์ฟเวอร์ ws echo ดังนั้น ด้วยการใช้ฟังก์ชันปิดระบบจากระบบควบคุมภูต การใช้งานไม่ได้สวยงามที่สุด ฉันใช้ไฟล์ off_file.pid แทนสัญญาณ แต่รับประกันได้ว่าไม่ต้องใช้ไลบรารีเพิ่มเติมและการปิดระบบจะเกิดขึ้นอย่างถูกต้อง เพราะ บนเซิร์ฟเวอร์ ws ในขณะที่วนซ้ำแฮงค์ในขณะที่ฟังข้อความซ็อกเก็ตจากนั้นหลังจากสร้าง off_file.pid คุณต้องเชื่อมต่อกับเซิร์ฟเวอร์ ws เพื่อให้ถึงจุดสิ้นสุดของรอบและตรวจสอบ off_file.pid สำหรับสิ่งนี้ฉันใช้กลอุบายเล็กน้อยเลียนแบบ การเชื่อมต่อซ็อกเก็ตจาก echowsadmin.php และแนะนำความล่าช้าให้กับทุกอย่างที่ทำงานและสคริปต์รายงานว่างานเสร็จสมบูรณ์ ดาวน์โหลด (ไฟล์เก็บถาวรที่ล้าสมัย ใหม่ใน ) อย่าลืมระบุตำแหน่งของไฟล์ echowsadmin.php บนโฮสติ้งของคุณใน echowsadmin.js ที่บรรทัดที่ 10 ที่อยู่ของ echowsstart.php ใน socket.js และที่อยู่ของเซิร์ฟเวอร์ ws ใน echowsadmin.php (หรือไม่ใช่ที่อยู่ และพอร์ต เนื่องจากไฟล์ต้องอยู่บนเซิร์ฟเวอร์ ที่อยู่จะเป็น 127.0.0.1 เสมอ) โดยที่ไคลเอ็นต์ขนาดเล็กเซลล์เดียวของเราจะพยายามเชื่อมต่อเมื่อ ws echo เซิร์ฟเวอร์ปิดอยู่ ฉันไม่ได้สร้างปุ่มรีสตาร์ทเซิร์ฟเวอร์ ws echo เนื่องจากเป็นที่ชัดเจนว่าคุณต้องกดหยุดเพื่อเริ่มการทำงานและไม่จำเป็นต้องดำเนินการนี้ในปุ่มเดียว ระบบควบคุมทั้งหมดนี้ทำงานภายใต้ระบบปฏิบัติการ *nix เท่านั้น เช่น ในการโฮสต์ และนี่คือหน้าตาของเธอ

เห็นได้ชัดว่ามีอะไรที่ต้องปรับปรุงอีกมาก:

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

แต่ในกรณีของฉัน ภารกิจคือทำให้ตัวเองเป็นเครื่องมือง่ายๆ สำหรับตรวจสอบสถานะของภูตผ่านทางเว็บ อย่างไรก็ตาม ด้วยการดัดแปลงเล็กน้อยสิ่งนี้สามารถใช้เพื่อตรวจสอบ daemon ใดก็ได้ ไม่ใช่แค่ ws

สำหรับการนำไปปฏิบัติสำหรับ Windows ทุกตำแหน่งที่สามารถข้าม pid ได้โดยการตรวจสอบ และทำให้แน่ใจได้ว่าสามารถเปิดใช้งานได้

ถ้า (strtoupper(substr(PHP_OS,0,3)) === "ชนะ") ( )

ไม่ว่า daemon จะทำงานหรือไม่ การตรวจสอบเพียงแค่การมีไฟล์ pid ก็เพียงพอแล้ว

ในขณะที่ฉันอยู่ในช่วงสุดสัปดาห์ ฉันลืมปิดเซิร์ฟเวอร์ ws echo ดังนั้น อายุการใช้งานของมันคือ 233774 วินาที นั่นคือ ประมาณ 3 วันหน่วยความจำที่ถูกครอบครองยังคงอยู่ประมาณ 0.1% ซึ่งบ่งชี้ว่าโซลูชันมีสิทธิ์ที่จะมีชีวิต

ข้อเสนอแนะความคิดเห็นยินดีต้อนรับเสมอ ฉันจะพัฒนาหัวข้อต่อไปและใช้การแชทอย่างง่ายตามที่สัญญาไว้

บทความของฉันเกี่ยวกับ PHP daemons และเว็บซ็อกเก็ต

  • เว็บซ็อกเก็ตเซิร์ฟเวอร์ PHP, เรียกใช้ PHP daemon

ด้วยภาษาโปรแกรมนี้ คุณสามารถสร้างเว็บไซต์และเว็บแอปพลิเคชันใน คอมพิวเตอร์เฉพาะที่ผ่านเซิร์ฟเวอร์ Apache เว็บไซต์อินเทอร์เน็ตสมัยใหม่ส่วนใหญ่เขียนด้วย PHP หน้าของไซต์เหล่านี้เป็นแบบไดนามิก ซึ่งแตกต่างจากไซต์เก่าที่ใช้มาร์กอัป HTML

ข้อมูลทั้งหมดจะถูกเก็บไว้ในฐานข้อมูล ข้อมูล MySQLจากที่จำเป็น ช่วงเวลานี้. โปรแกรมเมอร์ที่มีประสบการณ์สามารถสร้างเว็บไซต์ตั้งแต่เริ่มต้นและสำหรับ ผู้ใช้ทั่วไปเป็นการดีกว่าที่จะใช้บริการของเครื่องมือสำเร็จรูป (WordPress, Joomla หรือ Drupal) ซึ่งก็เพียงพอที่จะเพิ่มคำจารึกของคุณเอง - และไซต์ของคุณก็พร้อมแล้ว หากต้องการสร้างเว็บไซต์ของคุณบนเครื่องคอมพิวเตอร์ของคุณ คุณต้องดาวน์โหลดฟรี เวอร์ชั่นใหม่พี.เอช.พี. หลังจากนั้นสามารถอัปโหลดไซต์ที่เสร็จแล้วไปยังอินเทอร์เน็ตได้

ความเป็นไปได้:

  • การสร้างและแก้ไขเว็บไซต์และโปรแกรม
  • การจัดการเนื้อหาไซต์แบบไดนามิก
  • การทดสอบเครื่องมือต่าง ๆ สำหรับเว็บไซต์
  • การใช้คุกกี้ HTTP

หลักการทำงาน:

ตอนนี้เรามาทำความเข้าใจว่า PHP ทำงานอย่างไร ก่อนอื่นคุณต้องดาวน์โหลดและติดตั้ง เช่น เซิร์ฟเวอร์ Apache เสมือน ในการทำเช่นนี้คุณสามารถใช้ชุดพัฒนาสำเร็จรูป Denwer, XAMPP, OpenServer หรือโปรแกรมอื่น ๆ หลังการติดตั้ง เซิร์ฟเวอร์ภายในคุณต้องคัดลอกเนื้อหาของไฟล์เก็บถาวร PHP ไป หลังจากนั้น คุณจะสามารถเขียนไซต์ตั้งแต่เริ่มต้นบนโฮสติ้งเสมือนของคุณ หรือติดตั้งเครื่องมือไซต์ที่จำเป็นเพื่อสร้างโครงการอินเทอร์เน็ตของคุณ

เมื่อชำระค่าโฮสติ้งและโดเมนแล้ว คุณสามารถอัปโหลดไซต์ของคุณไปยังอินเทอร์เน็ตและเริ่มตระหนักถึงความสามารถในการสร้างสรรค์ของคุณ การใช้ภาษา PHP จะช่วยให้คุณสร้างและแก้ไขเนื้อหาในไซต์ของคุณได้อย่างรวดเร็วและสะดวก ตัวอย่างเช่น หากต้องการเปลี่ยนการออกแบบด้านล่างของไซต์ คุณต้องแก้ไขเพียงไฟล์เดียว และการเปลี่ยนแปลงจะมีผลในทุกหน้าของโครงการของคุณ ใน HTML คุณจะต้องแก้ไขทีละหน้า

ข้อดี:

  • การสร้างไดนามิกไซต์ใน PHP;
  • การใช้ฐานข้อมูล
  • ความสามารถในการดาวน์โหลด PHP ฟรีบนคอมพิวเตอร์
  • รองรับการสร้างฐานข้อมูลและไซต์หลายรายการบนเครื่องคอมพิวเตอร์
  • ภาษาโปรแกรมที่แพร่หลายและเป็นที่นิยม

ข้อเสีย:

  • ในการทำงานกับคอมพิวเตอร์ คุณอาจต้องติดตั้งเซิร์ฟเวอร์เสมือน

วันนี้ PHP เป็นภาษาโปรแกรมที่ใช้กันมากที่สุดสำหรับเว็บไซต์และเว็บแอปพลิเคชัน ดังนั้น ในการสร้างโครงการของคุณเอง คุณเพียงแค่ต้องปรับระบบ Windows ของคุณให้เป็นภาษานี้ นอกจากนี้ ในการทำงาน คุณจะต้องติดตั้งเซิร์ฟเวอร์สำหรับ โฮสติ้งเสมือนไซต์ท้องถิ่นของคุณ การใช้ภาษาการเขียนโปรแกรมนี้จะทำให้คุณสามารถสร้างและเรียกใช้โปรเจกต์ทางอินเทอร์เน็ตได้ ดังนั้นเราแนะนำให้คุณดาวน์โหลดได้ฟรี รุ่นล่าสุดพี.เอช.พี.

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

นอกเหนือจากข้อได้เปรียบหลักของระบบ Bitrix แล้ว ผู้ใช้ทุกคน เป็นที่ทราบกันดีถึงความต้องการสูงของผลิตภัณฑ์นี้ตามพารามิเตอร์ทางเทคนิคของการโฮสต์ เราจัดการเพื่อเพิ่มประสิทธิภาพและปรับแต่งเซิร์ฟเวอร์ของเรา ตอนนี้ HyperHost เป็นโฮสต์ที่ยอดเยี่ยมและมีประสิทธิภาพสูง
ด้านล่างเราจะพิจารณาขั้นตอนการติดตั้งระบบนี้บนโฮสติ้งของเรา:
ขั้นตอนที่ 1
ก่อนเริ่มการติดตั้ง CMS Bitrix คุณต้องทำการเปลี่ยนแปลงบางอย่างกับ php.ini แต่ละตัวสำหรับบัญชีของคุณ วิธีการทำ ดูภาพหน้าจอ:



ขั้นตอนที่ 2
หลังจากป้อนพารามิเตอร์ที่จำเป็นในแต่ละ php.ini สำหรับ Bitrix CMS คุณต้องดาวน์โหลดและอัปโหลดสคริปต์การติดตั้ง:
Bitrix CMS (bitrixsetup.php)
คุณสามารถดาวน์โหลดได้ตามที่อยู่จากเว็บไซต์ทางการ 1c-bitrix.ru:
http://www.1c-bitrix.ru/download/cms.php

ขั้นตอนที่ 3
ต่อไป เราต้องอัปโหลดไปยังเซิร์ฟเวอร์ในโฮมไดเร็กทอรีของไซต์ของคุณ
สามารถทำได้ทั้งผ่านแผงควบคุม Cpanel และการใช้ FTP
หากต้องการดาวน์โหลดผ่านแผงควบคุม คุณต้องทำสิ่งต่อไปนี้:






ขั้นตอนที่ 4
ในการติดตั้งไซต์ เราจำเป็นต้องสร้างฐานข้อมูล (DB) ผู้ใช้ฐานข้อมูล และเพิ่มผู้ใช้ไปยังฐานข้อมูลที่สร้างขึ้น








ขั้นตอนที่ 5
มาเริ่มติดตั้ง CMS Bitrix กันเลย

สำคัญ!คุณสามารถตรวจสอบการทำงานของไซต์บนโฮสติ้งของเราในพื้นที่โดยไม่ต้องเปลี่ยน DNS (การมอบหมายโดเมน) คุณเพียงแค่ต้องลงทะเบียนใน ไฟล์โฮสต์รายการต่อไปนี้:

53.114.112.45 โดเมน.ru

ที่ไหน,
domain.ru - โดเมนของคุณ
53.114.112.45 - ที่อยู่ IP ของเซิร์ฟเวอร์โฮสติ้งของคุณ หากต้องการดูว่าไซต์ของคุณอยู่ในบริษัทของเราหลังจากสั่งซื้อ IP ใด คุณต้องดำเนินการดังต่อไปนี้:
ไปที่แผงควบคุมไซต์ในส่วน "โดเมนเว็บ" และดูที่อยู่ IP ที่ระบุสำหรับไซต์ของคุณ

ไฟล์โฮสต์อยู่ในเส้นทางต่อไปนี้:

- Windows XP/2003/Vista/7: WINDOWS\system32\drivers\etc\hosts
- Windows NT/2000: WINNT\system32\drivers\etc\hosts
- Windows 95/98/ME: WINDOWS\hosts
- Mac OS X 10.2+: /private/etc/hosts
- ลินุกซ์: /etc/hosts

หลังจากทำการเปลี่ยนแปลงเหล่านี้แล้ว เวอร์ชันของไซต์ที่คุณถ่ายโอนไปยังโฮสติ้งของเราจะเปิดขึ้นที่ที่อยู่ domain.ru จากเบราว์เซอร์คอมพิวเตอร์ของคุณ
อย่าลืมลบรายการนี้ออกจากไฟล์โฮสต์หลังจากตรวจสอบประสิทธิภาพของไซต์ของคุณ
นำทางในเบราว์เซอร์ของคุณไปที่ http://your_domain/bitrixsetup.phpให้เลือกชุดกระจายที่คุณจะติดตั้ง
เราจะแสดงตัวอย่างการติดตั้ง CMS บนชุดแจกจ่าย "การจัดการไซต์" และเวอร์ชันสาธิต


ขั้นตอนต่อไปคือการดาวน์โหลดการแจกจ่ายไปยังเซิร์ฟเวอร์และแกะมันออกมา



ขั้นตอนที่ 6

การติดตั้งซีเอ็มเอส
หลังจากคลายการแจกจ่าย คุณจะถูกนำไปยังหน้าการติดตั้ง CMS


อ่านและยืนยันข้อตกลงใบอนุญาต

ขั้นตอนที่ 7

เราป้อนข้อมูลของเราและใส่ "ติ๊ก" ถัดจากรายการ "ติดตั้งในการเข้ารหัส UTF-8" หลังจากนั้นเราจะดำเนินการขั้นตอนต่อไป


ขั้นตอนที่ 8

ในขั้นตอนนี้ หน้าการยืนยันจะปรากฏขึ้น ที่นี่มีการตรวจสอบความสอดคล้องกับการตั้งค่าเซิร์ฟเวอร์สำหรับ การติดตั้งที่ถูกต้องและการทำงานของ CMS Bitrix


ขั้นตอนที่ 9

สร้างการเชื่อมต่อกับฐานข้อมูล
ในฟิลด์คุณต้องระบุข้อมูลการเชื่อมต่อกับฐานข้อมูลที่เราสร้างขึ้น ขั้นตอนที่ 4


ขั้นตอนที่ 10

ขั้นตอนนี้ไป ติดตั้งอัตโนมัติผลิตภัณฑ์

ขั้นตอนที่ 11

สร้างผู้ดูแลระบบสำหรับไซต์นี้
คุณต้องกรอกข้อมูลในฟิลด์ที่จำเป็น: เข้าสู่ระบบ รหัสผ่าน และการยืนยันรหัสผ่าน

ขั้นตอนที่ 12

เลือกเทมเพลตการติดตั้ง
ในขณะที่ทำการติดตั้งมีเพียง 1 - "คงที่" เนื่องจากเป็นการติดตั้งมาตรฐาน

การเลือกหัวข้อ


ป้อนข้อมูลเกี่ยวกับบริษัทของคุณที่คุณกำลังติดตั้งไซต์และเริ่มการติดตั้งธีมที่เลือก


ยินดีด้วย! คุณได้ติดตั้ง CMS Bitrix แล้ว
ควรสังเกตว่าผลการทดสอบแสดงผลประสิทธิภาพ 1C ที่สูงมากบนเซิร์ฟเวอร์ของเรา
อัตราภาษี VPS-Start จากสายงานของเรานั้นมีประสิทธิภาพ 88,58 ที่มาตรฐาน 30

แสดงผลได้ดีขึ้น 127,84 ด้วยมาตรฐาน 30
ตัวเลขเหล่านี้อยู่ในกลุ่มบริษัทโฮสติ้งที่สูงที่สุดใน CIS
บริษัท HyperHost ขอให้คุณมีความสุขกับการทำงาน!

8775 ครั้ง วันนี้เข้าชม 9 ครั้ง

ไม่ใช่ไซต์เดียวที่สมบูรณ์หากไม่มีการนำทางหรือที่เรียกอีกอย่างว่า "เมนูไซต์" ดังนั้นเมนูของไซต์สามารถเป็นระดับเดียวและหลายระดับในรูปแบบของต้นไม้ได้ หากไม่มีปัญหาใด ๆ ในแง่ของการใช้งานกับเมนูระดับเดียว เมื่อสร้างเมนูหลายระดับ คุณต้องคิดอย่างรอบคอบ

สิ่งที่สำคัญที่สุดในงานนี้คือการออกแบบฐานข้อมูลสำหรับเมนูหลายระดับของเรา มาสร้างตารางหมวดหมู่ที่มีสามฟิลด์กันเถอะ รหัส, ชื่อ, พ่อแม่ที่ไหน:

  • รหัส- ตัวระบุ
  • ชื่อ- ชื่อเมนู
  • พ่อแม่- ผู้ปกครองหมวดหมู่เริ่มต้น 0

ฟิลด์มีหน้าที่แยกเมนู พ่อแม่ถ้า ผู้ปกครอง = 0หมวดหมู่นี้เป็นหมวดหมู่หลัก หากต้องการเพิ่มลูกในหมวดหมู่หลัก คุณต้องระบุในช่องหลัก รหัสผู้ปกครองที่ต้องการ ตัวอย่างเช่น:

ตารางที่มีหมวดหมู่

ดังที่เห็นได้จากตาราง หมวดหมู่พาเรนต์ รถมีทายาทสองคน มาสด้าและ ฮอนด้าที่เกี่ยวข้องตามเขตข้อมูล พ่อแม่. และหมวด รถจักรยานยนต์ลูกหลานสองคนคือ คาวาซากิและ ฮาร์เลย์. ในเวลาเดียวกันหมวดหมู่เรือไม่มีลูกหลาน ฉันหวังว่าคุณจะเข้าใจวิธีเชื่อมโยงหมวดหมู่

ต่อไปเราจะย้ายจากคำไปสู่การปฏิบัติ มาสร้างตารางหมวดหมู่กันเถอะ

สร้างตารางหากไม่มี `หมวดหมู่` (`id` int(10) ที่ไม่ได้ลงชื่อ ไม่เป็น NULL AUTO_INCREMENT `ชื่อ varchar(255) ไม่เป็นโมฆะ `parent ` int(10) ที่ไม่ได้ลงชื่อ ไม่เป็น NULL คีย์หลัก ("id")) ENGINE=ค่าเริ่มต้นของ MyISAM CHARSET=utf8 AUTO_INCREMENT=20 ; -- -- ดัมพ์ข้อมูลตาราง `หมวดหมู่` -- แทรกลงใน `หมวดหมู่` (`id`, `title`, `parent`) ค่า (1, "รถยนต์", 0), (2, "รถจักรยานยนต์", 0) , (3, มาสด้า, 1), (4, ฮอนด้า, 1), (5, คาวาซากิ, 2), (6, Harley, 2), (7, Mazda 3, 3 ), (8, "Mazda 6", 3), (9, "ซีดาน", 7), (10, "แฮทช์แบค", 7), (11, "เรือ", 0), (12, "Liftback", 8), (13, "ครอสโอเวอร์", 8), (14, "สีขาว", 13), (15, "สีแดง", 13), (16, "สีดำ", 13), (17, "สีเขียว", 13), (18, Mazda CX, 3 ), (19, มาสด้า MX, 3);

อัลกอริทึมของการทำงานประกอบด้วยสิ่งต่อไปนี้:

การสร้างการเชื่อมต่อฐานข้อมูล

แบบสอบถาม ("ชื่อชุด"utf8""); /* * นี่เป็นวิธีเชิงวัตถุ "เป็นทางการ" ในการทำเช่นนี้ * อย่างไรก็ตาม $connect_error ไม่ทำงานจนกว่า PHP 5.2.9 และ 5.3.0 */ if ($mysqli->connect_error) ( die("Connection failed (" . $mysqli->connect_errno . ") " . $mysqli->connect_error); ) /* * หากคุณต้องการตรวจสอบความเข้ากันได้กับเวอร์ชันต่างๆ ก่อนหน้า 5.2 .9 * รหัสที่ดีกว่านี้ */ if (mysqli_connect_error()) ( die("Connection failed (" . mysqli_connect_errno() . ") " . mysqli_connect_error()); )

การเขียนฟังก์ชันเพื่อรับข้อมูลจากตารางหมวดหมู่

// รับอาร์เรย์เมนูของเราจากฐานข้อมูลเป็นฟังก์ชันอาร์เรย์ getCat($mysqli)( $sql = "SELECT * FROM `categories`"; $res = $mysqli->query($sql); // สร้างอาร์เรย์โดยที่ คีย์อาร์เรย์คือ ID เมนู $cat = array(); while($row = $res->fetch_assoc())( $cat[$row["id"]] = $row; ) return $cat; )

เราได้อาร์เรย์แบบนี้ โดยที่คีย์อาร์เรย์คือรหัสหมวดหมู่

ฟังก์ชัน Array Tree โดย Tommy Lacroix

// ฟังก์ชันสร้างทรีจากอาร์เรย์จาก Tommy Lacroix ฟังก์ชัน getTree($dataset) ( $tree = array(); foreach ($dataset as $id => &$node) ( //หากไม่มีไฟล์แนบ if (!$node[" parent"])( $tree[$id] = &$node; )else( //หากมีลูก ให้วนซ้ำอาร์เรย์ $dataset[$node["parent"]][" childs"][$id] = &$ node; ) ) ส่งคืน $tree; )

รับอาร์เรย์ในรูปแบบของต้นไม้

สคริปต์ทั้งหมด

แบบสอบถาม ("ชื่อชุด"utf8""); /* * นี่เป็นวิธีเชิงวัตถุ "เป็นทางการ" ในการทำเช่นนี้ * อย่างไรก็ตาม $connect_error ไม่ทำงานจนกว่า PHP 5.2.9 และ 5.3.0 */ if ($mysqli->connect_error) ( die("Connection failed (" . $mysqli->connect_errno . ") " . $mysqli->connect_error); ) /* * หากคุณต้องการตรวจสอบความเข้ากันได้กับเวอร์ชันต่างๆ ก่อน 5.2 .9 * จะดีกว่าถ้าใช้รหัสนี้ */ if (mysqli_connect_error()) ( die("Connection error (" . mysqli_connect_errno() . ") " . mysqli_connect_error()); ) // รับอาร์เรย์เมนูของเรา จากฐานข้อมูลเป็นฟังก์ชันอาร์เรย์ getCat($mysqli)( $sql = "SELECT * FROM `categories`"; $res = $mysqli->query($sql); //สร้างอาร์เรย์โดยที่คีย์อาร์เรย์คือเมนู ID $cat = array(); while ($row = $res->fetch_assoc())( $cat[$row["id"]] = $row; ) return $cat; ) // ฟังก์ชั่นสร้างต้นไม้ จากอาร์เรย์โดย Tommy Lacroix function getTree($dataset) ( $tree = array(); foreach ($dataset as $id => &$node) ( //หากไม่มีไฟล์แนบ if (!$node["parent" ])( $tree[$id] = &$node; )else( //หากมีลูก ให้วนซ้ำผ่านอาร์เรย์ $dataset[$node["parent"]]["childs"][$id] = &$node; ) ) return $tree; ) //เตรียมพร้อม อาร์เรย์ที่มีข้อมูล $cat = getCat($mysqli); //สร้างเมนูต้นไม้ $tree = getTree($cat); //เทมเพลตสำหรับแสดงเมนูในรูปแบบต้นไม้ tplMenu($category)( $menu = "
  • ".$category["title"].""; if(isset($category["childs"]))( $menu .= "
      ".showCat($category["children"]) ."
    " ; ) $menu .="
  • "; return $menu; ) /** * Read our template recursively **/ function showCat($data)( $string = ""; foreach($data as $item)( $string .= tplMenu($item); ) ส่งคืน $string; ) //รับมาร์กอัป HTML $cat_menu = showCat($tree); //แสดงเสียงสะท้อน "
      ".$cat_menu"
    "; ?>

    ผลของการทำงาน

    เมนูหลายระดับใน PHP + MySQL สำหรับผู้ดูแลระบบ

    หากคุณต้องการใช้เมนูนี้ในแผงการดูแลระบบของไซต์ของคุณ คุณต้องเขียนฟังก์ชันสองสามอย่างใหม่ tplเมนู(), โชว์แคท().

    ".$หมวดหมู่["ชื่อ"]."" ; )else( $เมนู = " "; ) if(isset($category["childs"]))( $i = 1; for($j = 0; $j< $i; $j++){ $str .= "→"; } $i++; $menu .= showCat($category["childs"], $str); } return $menu; } /** * Рекурсивно считываем наш шаблон **/ function showCat($data, $str){ $string = ""; $str = $str; foreach($data as $item){ $string .= tplMenu($item, $str); } return $string; } //Получаем HTML разметку $cat_menu = showCat($tree, ""); //Выводим на экран echo ""; ?>

    ผลของการทำงาน

    เลือกรถยนต์ → Mazda →→ Mazda 3 →→→ Sedan →→→ Hatchback →→ Mazda 6 →→→ Liftback →→→ Crossover →→→→ สีขาว →→→→ สีแดง →→→→ สีดำ →→→→ สีเขียว →→ Mazda CX →→ Mazda MX → Honda Motorcycles → Kawasaki → Harley Boats

    กำลังโหลด...
    สูงสุด