คอมพิวเตอร์ Windows อินเทอร์เน็ต

การสร้างหน้า html ด้วย PHP อะไรคือความแตกต่างระหว่างไฟล์ php และไฟล์ html สิ่งที่คุณต้องรู้

คาเมรอน แลร์ด

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

ความหลากหลายของความเท่าเทียม

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

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

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

ตัวอย่างที่สามของการทำงานพร้อมกันที่ทำให้เกิดรอยขีดข่วนบนพื้นผิวของ PHP คือ PHP / TK PHP / TK เป็นส่วนขยายของ PHP ที่ให้การเชื่อมต่อ Graphical User Interface (GUI) แบบพกพากับแกน PHP PHP / TK ให้คุณสร้างแอปพลิเคชั่น GUI บนเดสก์ท็อปที่เขียนด้วย PHP แง่มุมที่ขับเคลื่อนด้วยเหตุการณ์จำลองรูปแบบของการทำงานพร้อมกันที่เรียนรู้ได้ง่ายและมีโอกาสเกิดข้อผิดพลาดน้อยกว่าการทำงานกับเธรด อีกครั้ง การทำงานพร้อมกันนั้น "สืบทอด" จากเทคโนโลยีเสริมแทนที่จะเป็นฟังก์ชันพื้นฐานของ PHP

มีการทดลองหลายครั้งเพื่อเพิ่มการสนับสนุนเธรดให้กับ PHP เอง เท่าที่ฉันรู้ไม่มีใครประสบความสำเร็จ อย่างไรก็ตาม กรอบงาน Ajax และ PHP / TK ที่ขับเคลื่อนด้วยเหตุการณ์แสดงให้เห็นว่าเหตุการณ์สามารถแสดงความพร้อมกันของ PHP ได้ดีกว่าที่เธรดสามารถทำได้ PHP V5 พิสูจน์ได้

PHP V5 เสนอ stream_select ()

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

จะเกิดอะไรขึ้นหากโปรแกรมสามารถทำงานหลายอย่างพร้อมกันได้? มันจะแล้วเสร็จในเวลาเพียงเศษเสี้ยวของเวลาที่จำเป็นสำหรับการทำงานที่สอดคล้องกัน

ตัวอย่างแรก

ฟังก์ชัน stream_select ใหม่ พร้อมด้วยเพื่อนอีกหลายคน มอบความสามารถนี้ พิจารณาตัวอย่างต่อไปนี้:

0) ($ s = stream_socket_client ("phaseit.net:80", $ errno, $ errstr, $ timeout, STREAM_CLIENT_ASYNC_CONNECT / STREAM_CLIENT_CONNECT); ถ้า ($ s) ($ ซ็อกเก็ต [$ id ++] = $ s; $ http_message = " GET / สาธิต / ล่าช้า? Delay = ". $ Delay." HTTP / 1.0 \ r \ nHost: phaseit.net \ r \ n \ r \ n "; fwrite ($ s, $ http_message);) อื่น ๆ (echo " สตรีม ". $ id." ไม่สามารถเปิดได้อย่างถูกต้อง ";) $ ล่าช้า - = 3;) ในขณะที่ (จำนวน ($ ซ็อกเก็ต)) ($ read = $ sockets; stream_select ($ อ่าน $ w = null, $ e = null , $ หมดเวลา); ถ้า (นับ ($ อ่าน)) (/ * stream_select มักจะสับเปลี่ยน $ อ่าน ดังนั้นเราต้องหาว่าซ็อกเก็ตใดที่อ่านจาก * / foreach ($ อ่านเป็น $ r) ($ id = array_search ($ r, $ sockets); $ data = fread ($ r, $ convenient_read_block); / * ซ็อกเก็ตสามารถอ่านได้เพราะมีข้อมูลที่จะอ่าน OR เนื่องจากอยู่ในสถานะ EOF * / if (strlen ($ data) = = 0) (echo "Stream". $ Id. "Closes at". Date ("h: i: s") ". \ N"; fclose ($ r); unset ($ sockets [ $ id]); ) อื่น ($ ผล [$ id]. = $ data;))) อื่น ๆ (/ * Ty maut หมายความว่าเธรด * ทั้งหมด * ไม่รอการตอบกลับ * / echo "หมดเวลา! \ n"; หยุดพัก; ))?>

หากคุณเรียกใช้โปรแกรมนี้ คุณจะเห็นข้อมูลที่คล้ายกับต่อไปนี้:

โปรแกรมเริ่มเวลา 02:38:50 น. สตรีม 4 ปิดเวลา 02:38:53 น. สตรีม 3 ปิดเวลา 02:38:56 น. สตรีม 2 ปิดเวลา 02:38:59 น. สตรีม 1 ปิดเวลา 02:39:02 น. สตรีม 0 ปิดเวลา 02:39:05 น.

สิ่งสำคัญคือต้องเข้าใจว่าเกิดอะไรขึ้นที่นี่ ในระดับสูง โปรแกรมแรกส่งคำขอ HTTP หลายรายการและรับหน้าที่เว็บเซิร์ฟเวอร์ส่งไป ในขณะที่แอปพลิเคชันจริงอาจขอเว็บเซิร์ฟเวอร์ที่แตกต่างกันหลายตัว (อาจเป็น google.com, yahoo.com, ask.com เป็นต้น) ตัวอย่างนี้ส่งคำขอทั้งหมดไปยังเซิร์ฟเวอร์องค์กรของเราที่ Phaseit.net เพียงเพื่อลดความซับซ้อน ...

หน้าเว็บที่ร้องขอส่งคืนผลลัพธ์หลังจากตัวแปรหน่วงเวลาที่แสดงด้านล่าง หากโปรแกรมดำเนินการตามคำขอตามลำดับ จะใช้เวลาประมาณ 15 + 12 + 9 + 6 + 3 (45) วินาที ดังที่แสดงในรายการที่ 2 จริง ๆ แล้วใช้เวลาในการดำเนินการ 15 วินาที ผลผลิตสามเท่าเป็นผลลัพธ์ที่ยอดเยี่ยม

สิ่งนี้เกิดขึ้นได้ด้วย stream_select ซึ่งเป็นฟีเจอร์ใหม่ใน PHP V5 คำขอเริ่มต้นตามปกติ - โดยเปิด stream_socket_clients หลายรายการและเขียน GET ให้แต่ละรายการ ซึ่งสอดคล้องกับ http://phaseit.net/demonstration/delay?delay=$DELAY เมื่อคุณขอ URL นี้ในเบราว์เซอร์ของคุณ คุณควรเห็น:


แม้ว่าการใช้งานเฉพาะในรายการ 3 นั้นมีไว้สำหรับ UNIX® แต่สคริปต์เกือบทั้งหมดในบทความนี้ก็ใช้ได้กับการติดตั้ง PHP บน Windows® (โดยเฉพาะหลัง Windows 98) หรือ UNIX ด้วยเช่นกัน โดยเฉพาะอย่างยิ่ง คุณสามารถทำงานกับ Listing 1 บนระบบปฏิบัติการใดก็ได้ Linux® และ Mac OS X เป็นรสชาติของ UNIX และโค้ดทั้งหมดที่นี่จะใช้ได้กับทั้งสองระบบ

คำขอเซิร์ฟเวอร์แฝงจะทำในลำดับต่อไปนี้:

ล่าช้า = 15 ล่าช้า = 12 ล่าช้า = 9 ล่าช้า = 6 ล่าช้า = 3

เป้าหมายของ stream_select คือการได้ผลลัพธ์โดยเร็วที่สุด ในกรณีนี้ ลำดับของความล่าช้าจะตรงกันข้ามกับลำดับที่มีการร้องขอ หลังจาก 3 วินาที หน้าแรกก็พร้อมที่จะอ่าน ส่วนนี้ของโปรแกรมเป็นโค้ด PHP ปกติ - ในกรณีนี้คือ fread เช่นเดียวกับในโปรแกรม PHP อื่น การอ่านสามารถทำได้ด้วย fgets

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

โปรดทราบว่าไม่มีการโหลด CPU เพิ่มเติมในคอมพิวเตอร์โฮสต์ ไม่ใช่เรื่องแปลกที่โปรแกรมเครือข่ายจะดำเนินการ fread ในลักษณะนี้ในไม่ช้าเพื่อใช้ CPU 100% นี่ไม่ใช่กรณี เนื่องจาก stream_select มีคุณสมบัติที่ต้องการและตอบสนองทันทีที่อ่านได้ แต่ยังโหลด CPU ให้น้อยที่สุดในโหมดสแตนด์บายระหว่างการอ่าน

สิ่งที่คุณต้องรู้เกี่ยวกับ stream_select ()

การเขียนโปรแกรมตามเหตุการณ์นี้ไม่ใช่เรื่องเล็กน้อย แม้ว่า Listing 1 จะถูกลดให้เป็น Essentials แต่การเข้ารหัสใดๆ ที่อิงจากการเรียกกลับหรือการประสานงาน (ซึ่งจำเป็นในแอปพลิเคชันแบบมัลติทาสก์) จะคุ้นเคยน้อยกว่าลำดับขั้นตอนง่ายๆ ในกรณีนี้ ปัญหาที่ใหญ่ที่สุดอยู่ที่ $ read array โปรดทราบว่านี่คือลิงค์ stream_select ส่งคืนข้อมูลสำคัญโดยแก้ไขเนื้อหาของ $ read เช่นเดียวกับพอยน์เตอร์มีชื่อเสียงว่าเป็นแหล่งของจุดบกพร่องใน C อยู่เสมอ การอ้างอิงดูเหมือนจะเป็นส่วนที่ยากที่สุดของ PHP สำหรับโปรแกรมเมอร์

เทคนิคการสืบค้นนี้สามารถใช้ได้จากเว็บไซต์ภายนอกจำนวนเท่าใดก็ได้ เพื่อให้มั่นใจว่าโปรแกรมจะได้รับผลลัพธ์แต่ละรายการโดยเร็วที่สุดโดยไม่ต้องรอคำขออื่นๆ อันที่จริง เทคนิคนี้ทำงานอย่างถูกต้องกับการเชื่อมต่อ TCP / IP ใดๆ ไม่ใช่แค่เว็บ (พอร์ต 80) ซึ่งโดยหลักการแล้ว คุณสามารถควบคุมการแยกข้อมูล LDAP, การส่ง SMTP, คำขอ SOAP เป็นต้น

แต่นั่นไม่ใช่ทั้งหมด PHP V5 จัดการการเชื่อมต่อต่างๆ เป็น "สตรีม" แทนที่จะเป็นซ็อกเก็ตธรรมดา ไลบรารี URL ของไคลเอ็นต์ PHP (CURL) รองรับใบรับรอง HTTPS, การอัปโหลด FTP ขาออก, คุกกี้ และอื่นๆ (CURL อนุญาตให้แอปพลิเคชัน PHP ใช้โปรโตคอลที่แตกต่างกันเพื่อเชื่อมต่อกับเซิร์ฟเวอร์) เนื่องจาก CURL มีอินเทอร์เฟซสำหรับสตรีม การเชื่อมต่อจึงโปร่งใสจากมุมมองของโปรแกรม ส่วนถัดไปจะอธิบายวิธีที่ stream_select มัลติเพล็กซ์ทำการคำนวณในเครื่อง

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

นอกจากนี้ stream_select ดูเหมือนจะมีปัญหา อย่างน้อยใน PHP V5.1.2 ที่สำคัญที่สุด ค่าส่งคืนของฟังก์ชันไม่สามารถเชื่อถือได้ แม้ว่าฉันจะยังไม่ได้ดีบักการใช้งาน แต่ประสบการณ์ของฉันได้แสดงให้เห็นว่าสามารถทดสอบจำนวนได้อย่างปลอดภัย (อ่าน $) เช่นเดียวกับในรายการ 1 แต่นั่นใช้ไม่ได้กับค่าส่งคืนของ stream_select เอง แม้จะมีเอกสารประกอบอย่างเป็นทางการก็ตาม

PHP Local Concurrency

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

เกิดอะไรขึ้นถ้าการชะลอตัวเกิดขึ้นใกล้เข้ามา? มีวิธีเพิ่มความเร็วในการรับผลลัพธ์ใน PHP เมื่อประมวลผลในเครื่องหรือไม่? มีไม่กี่อย่าง สิ่งเหล่านี้อาจเป็นที่รู้จักน้อยกว่าวิธีที่เน้นซ็อกเก็ตในรายการ 1 มีเหตุผลหลายประการ ได้แก่:

  • ส่วนใหญ่หน้า PHP จะเร็วพอ ประสิทธิภาพที่ดีขึ้นอาจเป็นข้อได้เปรียบ แต่ไม่เพียงพอที่จะพิสูจน์การลงทุนในโค้ดใหม่
  • การใช้ PHP ในหน้าเว็บอาจทำให้การเร่งโค้ดบางส่วนไม่เกี่ยวข้อง การแจกจ่ายการคำนวณซ้ำเพื่อให้ได้ผลลัพธ์ระดับกลางเร็วขึ้นนั้นไม่เกี่ยวข้องเมื่อเกณฑ์เดียวคือความเร็วในการส่งหน้าเว็บโดยรวม
  • ปัญหาคอขวดในเครื่องบางส่วนถูกควบคุมโดย PHP ผู้ใช้อาจบ่นว่าต้องใช้เวลา 8 วินาทีในการดึงข้อมูลบัญชี แต่นั่นอาจเป็นการจำกัดการประมวลผลของฐานข้อมูลหรือทรัพยากรอื่นๆ ภายนอก PHP แม้ว่าคุณจะลดเวลาในการประมวลผล PHP เป็นศูนย์ แต่ก็ยังต้องใช้เวลามากกว่า 7 วินาทีในการค้นหา
  • แม้แต่ข้อจำกัดที่น้อยลงก็ทำให้การประมวลผลแบบคู่ขนานกัน สมมติว่าหน้าใดหน้าหนึ่งคำนวณราคาแนะนำสำหรับหุ้นสามัญจดทะเบียน และการคำนวณนั้นซับซ้อนเพียงพอและใช้เวลาหลายวินาทีกว่าจะเสร็จสมบูรณ์ การคำนวณสามารถเป็นแบบต่อเนื่องได้ ไม่มีวิธีที่ชัดเจนในการเผยแพร่เพื่อ "การทำงานร่วมกัน"
  • โปรแกรมเมอร์ PHP ไม่กี่คนที่เข้าใจศักยภาพของ PHP สำหรับการประมวลผลแบบขนาน เมื่อพูดถึงความเป็นไปได้ของการทำให้ขนานกัน โปรแกรมเมอร์ส่วนใหญ่ที่ฉันพบเพียงแค่ยกวลี "PHP ไม่ทำงานกับเธรด" และกลับไปที่โมเดลการคำนวณที่กำหนดไว้

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

ในโลกของการคำนวณ PHP ตัวอย่างดังกล่าวหาได้ยาก อย่างไรก็ตาม เนื่องจากฉันไม่พบคำอธิบายที่แน่ชัดในที่อื่น ฉันต้องการยกตัวอย่างของการเร่งความเร็วดังกล่าวที่นี่

array ("pipe", "r"), 1 => array ("pipe", "w"), 2 => array ("file", $ error_log, "w")); $ cmd = "นอน" $ ล่าช้า "; echo" เสร็จสิ้นโดยมีดีเลย์เป็น ". $ delay." "."; $ จัดการ [$ id] = proc_open ($ cmd, $ descriptorspec, $ pips); $ สตรีม [$ id] = $ ท่อ; $ all_pipes [$ id] = $ ท่อ; $ ล่าช้า - = 2; ) ในขณะที่ (นับ ($ สตรีม)) ($ read = $ streams; stream_select ($ read, $ w = null, $ e = null, $ timeout); foreach ($ อ่านเป็น $ r) ($ id = array_search ($ r, $ streams); echo stream_get_contents ($ all_pipes [$ id]); if (feof ($ r)) (fclose ($ all_pipes [$ id]); fclose ($ all_pipes [$ id]); $ return_value = proc_close ($ handles [$ id]); unset ($ streams [$ id]);)))?>

โปรแกรมนี้จะแสดงข้อมูลดังต่อไปนี้:

โปรแกรมเริ่มเวลา 10:28:41 น. เสร็จสิ้นด้วยความล่าช้า 1 เสร็จสิ้นด้วยความล่าช้า 3

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

สรุป

PHP รองรับการทำงานหลายอย่างพร้อมกัน PHP ไม่สนับสนุนการประมวลผลแบบสตรีมในลักษณะที่ภาษาโปรแกรมอื่นๆ เช่น Java หรือ C ++ ทำ แต่ตัวอย่างข้างต้นแสดงให้เห็นว่า PHP มีศักยภาพในการเร่งความเร็วได้สูงกว่าที่คนส่วนใหญ่คิด


ดังนั้น เพื่อน ๆ ถ้าคุณได้เรียนบทเรียนนี้แล้ว คุณก็สามารถติดตั้งเซิร์ฟเวอร์ในเครื่องหรือซื้อโฮสติ้งที่คุณสามารถใช้งาน PHP ได้ ขอแสดงความยินดี - นี่เป็นขั้นตอนใหญ่!

ฉันจะพูดสั้น ๆ เกี่ยวกับ PHP - ภาษาการเขียนโปรแกรมนี้ใช้ทั่วโลกและคุณสามารถสร้างไซต์ที่มีความซับซ้อนทุกระดับตั้งแต่ไซต์นามบัตรไปจนถึงพอร์ทัลขนาดใหญ่ ฉันคิดว่ามันไม่ใช่ความลับอีกต่อไปสำหรับหลาย ๆ คนแล้วที่เครือข่ายโซเชียลที่ใหญ่ที่สุด facebook.com(ตั้งแต่เริ่มต้นจนถึง php) และ vk.com(เอ็นจิ้น php) เขียนด้วย PHP ดังนั้นเราจึงสรุปและเริ่มทำงาน!)

รหัสทำงานอย่างไร

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

โค้ด PHP มีลักษณะอย่างไรและจะแทรกได้ที่ไหน

สามารถฝังโค้ด PHP ลงใน HTML ได้โดยตรง โค้ด PHP ถูกฝังในหน้า HTML โดยใช้วงเล็บเหลี่ยมและเครื่องหมายคำถาม อย่างไรก็ตาม คุณสามารถจำกัดตัวเองให้อยู่ในวงเล็บด้วยเครื่องหมายคำถาม ... คุณจะต้องเปลี่ยนนามสกุลไฟล์เท่านั้น ตัวอย่างเช่น จาก .htmlบน .php

รหัส PHP(ไฟล์ index.php)



ตัวอย่างการใช้งาน PHP


echo "สวัสดีชาวโลก!";
?>



สาธิต ดาวน์โหลดแหล่งที่มา
ผลลัพธ์ของรหัสจะเป็นผลลัพธ์ของข้อความธรรมดา สวัสดีชาวโลก!... ถามว่าทำไมต้องเขียนโค้ด php เพื่อแสดงข้อความธรรมดา? คำสั่งเสียงสะท้อนซึ่งเราจะพูดถึงในภายหลัง ไม่จำเป็นสำหรับการแสดงข้อความเท่านั้น บ่อยครั้ง echo ถูกใช้เพื่อแสดงผลงานของฟังก์ชันบางอย่างที่คำนวณหรือเอาข้อมูลจากฐานข้อมูล (ฐานข้อมูลคืออะไร?) นั่นคือสำหรับ การแสดงข้อมูลแบบไดนามิก.

คำสั่ง echo ใน PHP

ตามที่คุณเข้าใจแล้ว โอเปอเรเตอร์ เสียงก้องที่จำเป็นสำหรับการส่งออกข้อมูล เรานำเนื้อหา (ในกรณีของเรา เฉพาะข้อความเท่านั้น) ใน คำพูดและสุดท้ายเราใส่เครื่องหมายอัฒภาค ; นี่เป็นการสิ้นสุดงานของผู้ปฏิบัติงาน

ในการเขียนโปรแกรม เมื่อสร้างหน้าแรก เป็นเรื่องปกติที่จะใช้วลี สวัสดีชาวโลก!- นั่นคือ สวัสดีชาวโลก!นี่คือสิ่งที่เราใช้ เราจะไม่ใช้ html ในตัวอย่าง เนื่องจากไม่จำเป็น

รหัส PHP

echo "สวัสดีชาวโลก!";
?>
โปรแกรมจะออก สวัสดีชาวโลก!.
ในตัวอย่างแรก เราแทรกโค้ด php ขนาดเล็กลงใน html ในทางกลับกัน เรามาใส่องค์ประกอบ html ลงในโค้ด php กัน

รหัส PHP

เสียงสะท้อน " ";
เสียงสะท้อน " ";
เสียงสะท้อน " สคริปต์ PHP ตัวแรกของฉัน";
เสียงสะท้อน "";
เสียงสะท้อน " ";
เสียงสะท้อน "

สวัสดีชาวโลก!

";
เสียงสะท้อน "";
?>
เป็นผลให้เราได้รับหน้าว่างที่มีชื่อเรื่อง สวัสดีชาวโลก!

คำสั่งพิมพ์ PHP

แตกต่างจากคำสั่ง echo การพิมพ์ข้อมูลเอาต์พุตรวมถึงการเว้นวรรคและยัติภังค์ มีข้อ จำกัด บางประการ - คุณสามารถใช้อาร์กิวเมนต์ได้เพียงอาร์กิวเมนต์เดียว หลายอาร์กิวเมนต์ ยาวนานกว่าเสียงสะท้อน ต่อไปนี้ เราจะใช้ตัวดำเนินการนี้ในการเขียนฟังก์ชัน

พิมพ์ "สวัสดีชาวโลก!
ข้อความบรรทัดที่สอง "; // ผลลัพธ์จะแสดงเป็นสองบรรทัด
?>
ข้อความจะแสดงตามที่เขียน

คำสั่งเอาต์พุต - PHP heredoc syntax

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

เสียงก้อง<<

ตัวอย่าง


ตัวอย่างการแสดงข้อความจำนวนมากโดยใช้ html


ย่อหน้าที่สองของข้อความจำนวนมากเดียวกัน


ที่นี่;
?>

บันทึกบทเรียน

รหัส PHP สามารถ:

1. ไม่มีองค์ประกอบ html ใด ๆ หน้าและข้อความจะยังคงแสดงอยู่ html จำเป็นสำหรับมาร์กอัปเนื้อหาที่ดี

2. รวมอยู่ในโค้ด html และบรรจุไว้ในคำสั่งเอาต์พุตของตนเอง (echo พิมพ์ ฯลฯ ) สิ่งสำคัญคือต้องไม่ลืมการออกแบบ

3. หน้าที่มีรหัส php ต้องมีนามสกุลที่เหมาะสม: .php .phtml

จากบทเรียนต่อไป เราจะพูดถึงพื้นฐานของการสร้างเว็บไซต์ใน php ซึ่งคุณจะเห็นข้อดีทั้งหมดของการใช้ภาษานี้!

ขอบคุณสำหรับความสนใจ!

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

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

แต่ก่อนอื่น เพื่อที่จะเข้าใจว่าทำไมเราถึงต้องการเซสชัน เรามาเริ่มกันที่ต้นทาง - ไปที่โปรโตคอล HTTP

โปรโตคอล HTTP

โปรโตคอล HTTP คือ HyperText Transfer Protocol - เช่น อันที่จริงมันเป็นโปรโตคอลข้อความและจะเข้าใจได้ไม่ยาก

ในขั้นต้น สันนิษฐานว่าจะส่งเฉพาะ HTML ผ่านโปรโตคอลนี้ จากสถานที่และชื่อ แต่ตอนนี้ สิ่งที่พวกเขาไม่ส่ง (_ ㅅ _) = ^. ^ =

เพื่อไม่ให้เอาชนะปัญหา ให้ฉันยกตัวอย่างของการสื่อสารผ่านโปรโตคอล HTTP ต่อไปนี้คือคำขอที่เบราว์เซอร์ของคุณส่งเมื่อคุณขอหน้า http://example.com:

GET / HTTP / 1.1 โฮสต์: example.com ยอมรับ: ข้อความ / html ... สตริงว่าง ...

และนี่คือตัวอย่างคำตอบ:

HTTP / 1.1 200 ตกลง ความยาวเนื้อหา: 1983 ประเภทเนื้อหา: ข้อความ / html; ชุดอักขระ = utf-8 ... ...

นี่เป็นตัวอย่างที่ง่ายมาก แต่ที่นี่ คุณสามารถดูว่าคำขอ HTTP และการตอบสนองประกอบด้วยอะไร:

  1. เส้นเริ่มต้น- สำหรับคำขอมีวิธีการและเส้นทางของหน้าที่ร้องขอ สำหรับการตอบกลับ - รุ่นโปรโตคอลและรหัสตอบกลับ
  2. พาดหัวข่าว- มีรูปแบบคีย์-ค่าที่คั่นด้วยเครื่องหมายทวิภาค แต่ละส่วนหัวใหม่จะถูกเขียนขึ้นในบรรทัดใหม่
  3. เนื้อหาข้อความ- HTML โดยตรงหรือข้อมูลถูกแยกจากส่วนหัวด้วยตัวแบ่งบรรทัดสองบรรทัด อาจไม่มีอยู่ดังในคำขอที่ให้ไว้

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

  1. เมื่อให้สิทธิ์ผู้ใช้ เซิร์ฟเวอร์จะสร้างและจดจำคีย์เฉพาะ - ตัวระบุเซสชัน และแจ้งเบราว์เซอร์
  2. เบราว์เซอร์จะเก็บคีย์นี้ไว้ และในคำขอที่ตามมาแต่ละครั้ง มันก็จะส่งไป

ในการใช้กลไกนี้ (คุกกี้ คุกกี้) ได้ถูกสร้างขึ้น - ไฟล์ข้อความธรรมดาในคอมพิวเตอร์ของคุณ หนึ่งไฟล์สำหรับแต่ละโดเมน (แม้ว่าเบราว์เซอร์บางตัวจะล้ำหน้ากว่าและใช้ฐานข้อมูล SQLite สำหรับการจัดเก็บ) ในขณะที่เบราว์เซอร์กำหนดขีดจำกัดจำนวน ของระเบียนและขนาดของข้อมูลที่เก็บไว้ (สำหรับเบราว์เซอร์ส่วนใหญ่ มีขนาด 4096 ไบต์ ดู RFC 2109 ของปี 1997)

เหล่านั้น. หากคุณขโมยคุกกี้จากเบราว์เซอร์ของคุณ เป็นไปได้ไหมที่จะไปที่หน้า Facebook ของคุณแทนคุณ? อย่าตกใจไป มันไม่สามารถทำได้ อย่างน้อยกับ facebook แล้วฉันจะสอนวิธีที่คุณสามารถป้องกันตัวเองจากการโจมตีประเภทนี้กับผู้ใช้ของคุณ

ตอนนี้เรามาดูกันว่าคำขอ-การตอบกลับของเราจะเปลี่ยนไปอย่างไร ไม่ว่าจะมีการอนุญาตหรือไม่:

POST / ล็อกอิน / HTTP / 1.1 โฮสต์: example.com ยอมรับ: ข้อความ / ล็อกอิน html = ชื่อผู้ใช้ & รหัสผ่าน = Userpass

วิธีการของเราเปลี่ยนเป็น POST และในเนื้อหาของคำขอ ชื่อผู้ใช้และรหัสผ่านจะถูกส่งไป (หากคุณใช้วิธี GET สตริงคำขอจะมีชื่อผู้ใช้และรหัสผ่าน และอาจบันทึกไว้ในเซิร์ฟเวอร์พร็อกซีกลางบางตัว ซึ่ง แย่มาก)

HTTP / 1.1 200 ตกลง ประเภทเนื้อหา: ข้อความ / html; charset = utf-8 Set-Cookie: KEY = VerySecretUniqueKey ... ...

การตอบสนองของเซิร์ฟเวอร์จะมีส่วนหัว Set-Cookie: KEY = VerySecretUniqueKey ซึ่งจะบังคับให้เบราว์เซอร์บันทึกข้อมูลนี้ลงในคุกกี้ และครั้งต่อไปที่มีการเข้าถึงเซิร์ฟเวอร์ เซิร์ฟเวอร์จะส่งและรับรู้ข้อมูลเหล่านี้:

GET / HTTP / 1.1 โฮสต์: example.com ยอมรับ: ข้อความ / html คุกกี้: KEY = VerySecretUniqueKey ... สตริงว่าง ...

อย่างที่คุณเห็น ส่วนหัวที่ส่งโดยเบราว์เซอร์ (ส่วนหัวของคำขอ) และเซิร์ฟเวอร์ (ส่วนหัวของการตอบกลับ) นั้นต่างกัน แม้ว่าจะมีส่วนหัวทั่วไปสำหรับทั้งคำขอและการตอบกลับ (ส่วนหัวทั่วไป)

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

PHP และเซสชัน

ฉันหวังว่าคุณจะติดตั้ง PHP บนคอมพิวเตอร์ของคุณแล้วตั้งแต่ ต่อไปฉันจะยกตัวอย่างและพวกเขาจะต้องดำเนินการ

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

ก่อนอื่นคุณต้อง "เริ่ม" เซสชัน - สำหรับสิ่งนี้เราจะใช้ฟังก์ชัน session_start () สร้างไฟล์ session.start.phpโดยมีเนื้อหาดังนี้

Session_start ();

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

โดยรวมแล้ว เรามี - ทฤษฎีที่ใกล้เคียงกับการปฏิบัติ และนั่นก็ใช้ได้

ขั้นตอนต่อไปคือการบันทึกค่าตามอำเภอใจในเซสชันสำหรับสิ่งนี้ PHP ใช้ตัวแปร super-global $ _SESSION เราจะประหยัดเวลาปัจจุบันโดยการเรียกใช้ฟังก์ชัน date ()

Session_start (); $ _SESSION ["time"] = วันที่ ("H: i: s"); echo $ _SESSION ["เวลา"];

เราอัปเดตหน้าและดูเวลาเซิร์ฟเวอร์อัปเดตอีกครั้ง - และเวลาได้รับการอัปเดตแล้ว ตอนนี้มาทำให้เวลาที่ตั้งไว้ไม่เปลี่ยนแปลงทุกครั้งที่รีเฟรชหน้า:

Session_start (); if (! isset ($ _ SESSION ["time"])) ($ _SESSION ["time"] = date ("H: i: s");) echo $ _SESSION ["time"];

เราอัปเดต - เวลาไม่เปลี่ยนแปลง สิ่งที่จำเป็น แต่ในขณะเดียวกัน เราจำได้ว่า PHP กำลังจะตาย ซึ่งหมายความว่าจะเก็บเซสชันนี้ไว้ที่ใดที่หนึ่ง และเราจะพบที่นี่ ...

ความลับทั้งหมดจะชัดเจน

ตามค่าเริ่มต้น PHP จะจัดเก็บเซสชันในไฟล์ - คำสั่ง session.save_handler รับผิดชอบสิ่งนี้ ค้นหาเส้นทางที่ไฟล์ถูกบันทึกในคำสั่ง session.save_path หรือใช้ฟังก์ชัน session_save_path () เพื่อรับเส้นทางที่ต้องการ

ในการกำหนดค่าของคุณ อาจไม่ระบุพาธไปยังไฟล์ จากนั้นไฟล์เซสชันจะถูกเก็บไว้ในไฟล์ชั่วคราวในระบบของคุณ - เรียกใช้ฟังก์ชัน sys_get_temp_dir () และค้นหาตำแหน่งที่ซ่อนอยู่นี้

ดังนั้นเราจึงไปตามเส้นทางนี้และค้นหาไฟล์เซสชันของคุณ (ฉันมีไฟล์นี้ sess_dap83arr6r3b56e0q7t5i0qf91) เปิดในโปรแกรมแก้ไขข้อความ:

เวลา | s: 8: "16:19:51";

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

เวลา | s: 13: "\ m / (@ [ป้องกันอีเมล]) \ NS / ";

ในการแปลงสตริงนี้เป็นอาร์เรย์ คุณต้องใช้ฟังก์ชัน session_decode () สำหรับการแปลงย้อนกลับ - session_encode () - สิ่งนี้เรียกว่าการทำให้เป็นอันดับ แต่เฉพาะใน PHP สำหรับเซสชัน - เป็นพิเศษ แม้ว่าคุณจะสามารถใช้การทำให้เป็นอนุกรม PHP มาตรฐานได้ - เขียนลงใน configuration directive session .serialize_handler php_serialize value และคุณจะมีความสุข และ $ _SESSION สามารถใช้ได้โดยไม่มีข้อจำกัด - ตอนนี้คุณสามารถใช้ตัวเลขและอักขระพิเศษเป็นดัชนี | และ! ในนาม (ตลอด 10+ ของการทำงาน ฉันไม่เคยทำ :)

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

$ _SESSION ["integer var"] = 123; $ _SESSION ["float var"] = 1.23; $ _SESSION ["octal var"] = 0x123; $ _SESSION ["string var"] = "สวัสดีชาวโลก"; $ _SESSION ["array var"] = ["หนึ่ง", "สอง",]; $ วัตถุ = stdClass ใหม่ (); $ object-> foo = "บาร์"; $ object-> arr = ["สวัสดี", "โลก"]; $ _SESSION ["วัตถุ var"] = $ วัตถุ; $ _SESSION ["จำนวนเต็มอีกครั้ง"] = 42;

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

Javascript: (ฟังก์ชัน () (document.cookie = "PHPSESSID = dap83arr6r3b56e0q7t5i0qf91; path = /;"; window.location.reload ();)) ()

ตอนนี้คุณมีทั้งเบราว์เซอร์ที่กำลังดูเซสชันเดียวกัน ฉันได้กล่าวไว้ข้างต้นว่าฉันจะพูดถึงวิธีการป้องกัน พิจารณาวิธีที่ง่ายที่สุด - เราจะผูกเซสชันกับเบราว์เซอร์ให้แม่นยำยิ่งขึ้นกับวิธีที่เบราว์เซอร์ปรากฏบนเซิร์ฟเวอร์ - เราจะจำ User-Agent และตรวจสอบทุกครั้ง:

Session_start (); if (! isset ($ _ SESSION ["time"])) ($ _SESSION ["ua"] = $ _SERVER ["HTTP_USER_AGENT"]; $ _SESSION ["time"] = date ("H: i: s") ; ) if ($ _SESSION ["ua"]! = $ _SERVER ["HTTP_USER_AGENT"]) (ตาย ("เบราว์เซอร์ผิด");) echo $ _SESSION ["เวลา"];

สิ่งนี้ปลอมได้ยากกว่า แต่ก็ยังเป็นไปได้ เพิ่มที่นี่เพื่อบันทึกและตรวจสอบ $ _SERVER ["REMOTE_ADDR"] และ $ _SERVER ["HTTP_X_FORWARDED_FOR"] และดูเหมือนว่าจะมีการป้องกันมากหรือน้อยจากผู้บุกรุกที่บุกรุก "คุกกี้" ของเรา

คำสำคัญในย่อหน้าที่แล้ว มันดูเหมือนในโครงการจริง คุกกี้ทำงานบนโปรโตคอล HTTPS มานานแล้ว ดังนั้นจึงไม่มีใครสามารถขโมยคุกกี้ได้หากไม่มีการเข้าถึงคอมพิวเตอร์หรือสมาร์ทโฟนของคุณ

ออกกำลังกาย
เพิ่มการตรวจสอบ IP ของผู้ใช้ลงในโค้ด หากการตรวจสอบล้มเหลว ให้ลบเซสชันที่ถูกบุกรุก

เป็นขั้นเป็นตอน

และตอนนี้ฉันจะอธิบายทีละขั้นตอนเกี่ยวกับวิธีการทำงานของเซสชันใน PHP โดยใช้ตัวอย่างของรหัสต่อไปนี้ (การตั้งค่าเริ่มต้น):

Session_start (); $ _SESSION ["id"] = 42;

  1. หลังจากเรียก session_start () PHP จะค้นหาตัวระบุเซสชันในคุกกี้ตามชื่อที่ระบุใน session.name - นี่คือ PHPSESSID
  2. หากไม่มีตัวระบุ ระบบจะสร้าง (ดู session_id ()) และสร้างไฟล์เซสชันว่างตามเส้นทาง session.save_path ด้วยชื่อ sess_ (session_id ()) ส่วนหัวจะถูกเพิ่มในการตอบกลับของเซิร์ฟเวอร์เพื่อตั้งค่า คุกกี้ (session_name ()) = (session_id ())
  3. หากมีตัวระบุ แสดงว่าเรากำลังค้นหาไฟล์เซสชันในโฟลเดอร์ session.save_path:
    • ไม่พบ - สร้างไฟล์เปล่าชื่อ sess _ ($ _ COOKIE) (ตัวระบุสามารถมีได้เฉพาะอักขระจากช่วง a-z, A-Z, 0-9, เครื่องหมายจุลภาคและเครื่องหมายลบ)
    • ค้นหา อ่านไฟล์และแกะข้อมูล (ดู session_decode ()) ลงในตัวแปร super-global $ _SESSION
  4. เมื่อสคริปต์ทำงานเสร็จแล้ว ข้อมูลทั้งหมดจาก $ _SESSION จะถูกบรรจุโดยใช้ session_encode () ลงในไฟล์ตามเส้นทาง session.save_path ชื่อ sess_ (session_id ())

ออกกำลังกาย
ตั้งค่าคุกกี้ชื่อ PHPSESSID ในเบราว์เซอร์ของคุณให้เป็น 1234567890 รีเฟรชหน้า ตรวจสอบว่าคุณได้สร้างไฟล์ใหม่แล้ว sess_1234567890

มีชีวิตที่ปราศจากคุกกี้หรือไม่?

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

และถ้าคุณต้องการเก็บเซสชั่นในฐานข้อมูล?

ในการจัดเก็บเซสชันในฐานข้อมูล คุณต้องเปลี่ยนที่จัดเก็บเซสชันและบอกวิธีใช้งาน PHP เพื่อจุดประสงค์นี้ อินเทอร์เฟซ SessionHandlerInterface และฟังก์ชัน session_set_save_handler ได้ถูกสร้างขึ้น

แยกจากกัน ฉันทราบว่าคุณไม่จำเป็นต้องเขียนตัวจัดการเซสชันของคุณเองสำหรับ redis และ memcache - เมื่อคุณติดตั้งส่วนขยายเหล่านี้ ตัวจัดการที่เกี่ยวข้องจะเข้ากันได้ ดังนั้น RTFM คือทุกอย่างของเรา ใช่ ต้องระบุตัวจัดการก่อนเรียก session_start ();)

ออกกำลังกาย
ใช้ SessionHandlerInterface เพื่อจัดเก็บเซสชัน MySQL ทดสอบว่าใช้งานได้หรือไม่
นี่คือการกำหนดเครื่องหมายดอกจันสำหรับผู้ที่คุ้นเคยกับฐานข้อมูลอยู่แล้ว

เซสชันจะตายเมื่อใด

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

การรวบรวมขยะสามารถเปิดใช้งานได้เมื่อมีการเรียกใช้ฟังก์ชัน session_start () ความน่าจะเป็นของการเปิดตัวขึ้นอยู่กับสองคำสั่ง session.gc_probability และ session.gc_divisor อันแรกทำหน้าที่เป็นเงินปันผล อันที่สองเป็นตัวหาร และโดยปริยายค่าเหล่านี้ ​คือ 1 และ 100 นั่นคือ e ความน่าจะเป็นที่ตัวรวบรวมจะเปิดตัวและไฟล์เซสชันจะถูกลบออกประมาณ 1%

ออกกำลังกาย
เปลี่ยนค่าของคำสั่ง session.gc_divisor เพื่อให้ตัวรวบรวมขยะเริ่มทำงานทุกครั้ง ตรวจสอบว่านี่คือสิ่งที่เกิดขึ้น

ความผิดพลาดเล็กน้อยที่สุด

ข้อผิดพลาดที่มีผลการค้นหาของ Google มากกว่าครึ่งล้านรายการ:

ไม่สามารถส่งคุกกี้เซสชัน - ส่งส่วนหัวแล้วโดย
ไม่สามารถส่งตัวจำกัดแคชเซสชัน - ส่งส่วนหัวแล้ว

หากต้องการรับ ให้สร้างไฟล์ session.error.phpโดยมีเนื้อหาดังนี้

Echo str_pad ("", ini_get ("output_buffering")); session_start ();

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

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

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

Require_once "รวม / sess.php"; sess_start (); if (isset ($ _ SESS ["id"])) (echo $ _SESS ["id"];) else ($ _SESS ["id"] = 42;)

เพื่อให้บรรลุสิ่งนี้ คุณต้องมีฟังก์ชัน register_shutdown_function ()

ในที่สุด

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

ป.ล. หากคุณได้เรียนรู้สิ่งใหม่จากบทความ - ขอบคุณผู้เขียน - แบ่งปันบทความในโซเชียลเน็ตเวิร์ก;)

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

ไวยากรณ์ PHP

รหัสสคริปต์ PHP เริ่มต้นหลังจากเปิดแท็ก... ข้อความระหว่างสองแท็กนี้อ่านโดยโปรแกรมบนเซิร์ฟเวอร์ และผลลัพธ์จะถูกส่งออกไปยังเอกสาร HTML ลองมาดูตัวอย่าง:



ตัวอย่าง

รวม ("sidebar.htm");
?>


หากเราต้องการแทรกบางสิ่งลงในโค้ด html ของหน้า เราต้องใช้คำสั่ง include ต่อไปเราจะระบุที่อยู่ไฟล์และบรรทัดจะสิ้นสุดลงเช่นเดียวกับ CSS

แทรกโค้ด HTML ลงในหน้าเว็บไซต์

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

.....
และ สามารถวางในหน้า htm แยกกัน "sidebar.htm" และ "footer.htm" และแทรกลงในหน้าเว็บไซต์โดยใช้คำสั่ง include หากในเวลาเดียวกันเนื้อหาหลักถูกถ่ายโอนไปยังไฟล์แยกต่างหาก -
.....
จากนั้นรหัสของหน้าของเราจะมีลักษณะดังนี้:



ตัวอย่าง

รวม ("sidebar.htm");
รวม ("content.htm");
รวม ("footer.htm");
?>


sidebar.htm เนื้อหา


ที่นี่
เนื้อหา
ของเขา
แถบด้านข้าง

ในทำนองเดียวกันกับไฟล์ content.htm และ footer.htm

ด้วยหน้าเว็บรุ่นนี้ คุณเพียงแค่ต้องเปลี่ยนแปลงไฟล์ "sidebar.htm" ไฟล์เดียวเพื่อเปลี่ยนหน้าทั้งหมดของเว็บไซต์ ซึ่งจะสะดวกมากหากไซต์ของคุณประกอบด้วยหน้าหลายร้อยหรือหลายพันหน้า

PHP บนคอมพิวเตอร์ของคุณ

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

เพื่อให้โค้ด PHP ทำงานในหน้า HTML คุณต้องเปิดไฟล์ .htaccessในโปรแกรมแก้ไขข้อความและเขียนสิ่งต่อไปนี้:

แอปพลิเคชัน AddHandler / x-httpd-php .html

รายการนี้อนุญาตให้เรียกใช้สคริปต์ PHP ในหน้า HTML

หรือเปลี่ยนนามสกุลไฟล์. htmlบน. php

คุณสมบัติของ PHP

PHP มีความสามารถมากกว่าแค่การแสดง HTML ความสามารถของ PHP รวมถึงการสร้างภาพ PDF และแม้แต่ภาพยนตร์ Flash (โดยใช้ libswf และ Ming) ที่สร้างขึ้นได้ทันที PHP ยังสามารถให้บริการข้อมูลข้อความใด ๆ เช่น XHTML และไฟล์ XML อื่น ๆ PHP สามารถสร้างไฟล์ดังกล่าวได้โดยอัตโนมัติและจัดเก็บไว้ในระบบไฟล์ของเซิร์ฟเวอร์ของคุณ แทนที่จะให้บริการกับไคลเอ็นต์ จึงเป็นการจัดแคชของเนื้อหาไดนามิกฝั่งเซิร์ฟเวอร์

ข้อดีอย่างหนึ่งที่สำคัญของ PHP คือการรองรับฐานข้อมูลที่หลากหลาย กล่าวโดยย่อ PHP มีหลายสิ่งให้คุณ! สามารถดูรายละเอียดเพิ่มเติมเกี่ยวกับประโยชน์ของ PHP ได้ที่ www.php.su

1 กุมภาพันธ์ 2558


เมื่อเริ่มเขียนโปรแกรมสำหรับเว็บ โปรแกรมเมอร์มือใหม่จำนวนมากพบข้อผิดพลาดนี้ พวกเขามองว่าระบบเบราว์เซอร์-เซิร์ฟเวอร์เป็นแอปพลิเคชันปกติ เชิงโต้ตอบ. ฉันกดปุ่ม - ระบบตอบสนอง ฉันวาดมันด้วยเมาส์ - มันตอบสนอง ข้อมูลทั้งหมดที่ลูกค้าสามารถใช้ได้ก็มีอยู่ในโปรแกรมเช่นกัน โปรแกรมจะอยู่ในหน่วยความจำตลอดเวลา
ดังนั้น ในการเขียนโปรแกรมเว็บ นี่ไม่เป็นความจริง!.
ในขณะที่ผู้ใช้เห็นหน้าเว็บและเริ่มดำเนินการบางอย่างกับมัน PHP ได้ออกแล้ว! และผู้ใช้ไม่ได้โต้ตอบกับสคริปต์ PHP แต่กับหน้า HTML ของเขาซึ่งเขาได้รับในเบราว์เซอร์ ในกรณีส่วนใหญ่ ผลลัพธ์ของสคริปต์ PHP จะเป็นข้อความธรรมดา ข้อความหน้า HTML ซึ่งมอบให้กับเบราว์เซอร์และแสดงเป็น HTML ปกติ ดูเอาเองได้ในบท
"เฮ้, วาสยา!" ; ?> ;
จากนั้นโดยการดูข้อความต้นฉบับของหน้าผลลัพธ์ในเบราว์เซอร์ ไม่มีแท็ก PHP อยู่ที่นั่น! เท่านั้น
เฮ้, วาสยา!
เพราะ PHP ถูกรันบนเซิร์ฟเวอร์!

เซิร์ฟเวอร์และเบราว์เซอร์สื่อสารกันโดยส่งคำขอถึงกันโดยใช้โปรโตคอลพิเศษ - HTTP เฉพาะเบราว์เซอร์เท่านั้นที่สามารถเริ่มต้นการเชื่อมต่อได้ ส่งคำขอไปยังเซิร์ฟเวอร์เพื่อแสดงไฟล์ดังกล่าว เซิร์ฟเวอร์ส่งไฟล์ไปยังไคลเอนต์
นี่เป็นวิธีเดียวที่จะเกิดขึ้น ลูกค้าร้องขอ - เซิร์ฟเวอร์ให้ไป และลืมลูกค้าทันที จากที่นี่จะเป็นที่ชัดเจนคำตอบสำหรับคำถามที่ว่าเป็นไปได้หรือไม่ที่จะทราบจำนวนผู้ใช้ที่อยู่บนไซต์ในขณะนี้ เป็นสิ่งต้องห้าม เพราะไม่มี "ในไซต์" เดียว พวกเขาเชื่อมต่อ ขอหน้า และยกเลิกการเชื่อมต่อ ไม่มีการเชื่อมต่อถาวรกับเซิร์ฟเวอร์ เช่น ผู้เล่น Kwaku คุณสามารถค้นหาข้อมูลโดยประมาณได้โดยการบันทึกเวลาของการเชื่อมต่อแต่ละครั้งและเลือกบันทึกในช่วงระยะเวลาหนึ่งเท่านั้น

ตัวอย่างการสื่อสารระหว่างเบราว์เซอร์และเซิร์ฟเวอร์:
ผู้ใช้คลิกที่ลิงค์ เบราว์เซอร์ส่งคำขอไปยังเซิร์ฟเวอร์และรอการตอบกลับ:
เบราว์เซอร์ -> PHP
PHP รันสคริปต์ ส่งผลไปยังเบราว์เซอร์และออก:
PHP -> เบราว์เซอร์
เบราว์เซอร์แสดงหน้า "กำลังสแกน" เพื่อค้นหาลิงก์ที่ต้องขอจากเซิร์ฟเวอร์ (แท็ก ,