ก่อนอื่น..
ไม่ ไม่ใช่เธรด ที่แท้จริง ตามคำจำกัดความของ CS แต่คุณไม่สามารถบอกความแตกต่างได้จริงๆ ฉันจะพูดแบบนี้ - ห้องสมุดนี้ใกล้เคียงกับความรู้สึกของการทำเกลียวอย่างแท้จริงมากกว่าแพตตี้แฮมเบอร์เกอร์ "McPlant" ใหม่ของ McDonalds ที่เป็นเนื้อวัว -
ถ้าคุณเป็นเหมือนฉัน คุณ จะรัก PHP! คุณชอบความยืดหยุ่นและพลังของภาษา - อิสระในการเขียนโค้ดที่เลอะเทอะ (ฉันไม่สนับสนุน แต่ฉันจะปกป้องสิทธิ์ในการเขียนโค้ดที่เลอะเทอะจนตาย) หรือสร้างสรรค์งานศิลปะเชิงตรรกะที่สวยงามอย่างเถียงไม่ได้! ตอนนี้สำหรับโปรแกรมเมอร์ C (และ C++ ฉันเดาว่า) ทุกคน คุณมีไลบรารี่ที่ไม่เพียงแต่แสดงพลังของ PHP อย่างแท้จริงเท่านั้น แต่ยัง เพิ่มพลังให้กับโปรเจ็กต์ต่อไปของคุณอีกด้วย!
ไลบรารีนี้ช่วยให้คุณสามารถประมวลผลแบบขนานได้อย่างมีประสิทธิภาพในลักษณะที่คล้ายกับมัลติเธรด POSIX อย่างใกล้ชิดมาก คุณสามารถแชร์ ตัวแปรส่วนกลาง ระหว่าง phpthreads ทั้งหมด ส่งค่า/วัตถุ/อาร์เรย์ไปยัง PHPTHread ของคุณเมื่อสร้าง แบ่งปันค่า/วัตถุ/อาร์เรย์ได้อย่างง่ายดายระหว่างการทำงาน phpthreads และรับค่าออก PHPThread/วัตถุ/อาร์เรย์เมื่อ PHPThread แต่ละตัวยุติการทำงานผ่านทาง phpthread_join()
ตระกูลของฟังก์ชั่น
ฉันออกแบบไลบรารีนี้เพราะฉันต้องการเขียนเซิร์ฟเวอร์ WebSocket ประสิทธิภาพสูงเพื่อจัดการการเชื่อมต่อพร้อมกันหลายพันรายการได้อย่างง่ายดาย ซึ่งสามารถถ่ายโอนข้อมูลจำนวนมากได้อย่างรวดเร็ว (ลองนึกถึงรูปภาพหรือวิดีโอ) ใช่ โดยพื้นฐานแล้ว มันเป็นเซิร์ฟเวอร์ fork()
ing แต่เลเยอร์ PHPThread ที่อยู่ด้านบนทำให้ง่ายต่อการปรับใช้ อย่างมาก ในขณะเดียวกันก็จัดเตรียมกลไกสำหรับ IPC ที่ง่าย (และเหมือนเธรด) ฉันสามารถใช้ C และได้รับประสิทธิภาพที่ดีขึ้น แต่สำหรับฉัน สิ่งนี้ดูเหมือนจะพกพาสะดวกกว่าและง่ายต่อการปรับใช้เนื่องจากเซิร์ฟเวอร์ถูกแยกส่วน ดังนั้นตอนนี้ก็มาถึงแล้ว
สำหรับผู้ที่เชี่ยวชาญด้านเทคนิค ห้องสมุดนี้ไม่ได้ถูกขัดขวางชั่วคราวโดยความจำเป็นในการใช้ "เห็บ" นั่นเป็นส่วนหนึ่งของสิ่งที่ทำให้มันรวดเร็วมาก ไลบรารีใช้สัญญาณ (เช่น SIGUSR1 และ SIGUSR2) ภายในเพื่อขัดจังหวะการดำเนินการและเปลี่ยนบริบทอย่างลื่นไหล ใช่ เรากำลังใช้งาน SIGUSR1 และ 2 ดังนั้นหากโปรเจ็กต์ของคุณใช้สัญญาณเหล่านั้น ให้ลองใช้ phpthread_send_message()
กับฟังก์ชันตัวจัดการข้อความที่กำหนด (ดู: examples/messages1.php และ examples/messages2.php) ควรเหมาะสมกับจุดประสงค์ของคุณอย่างสมบูรณ์
มีตัวอย่างที่คุณสามารถเรียกใช้ในไดเร็กทอรี "examples" อย่าลังเลที่จะวาง shebang เพื่อให้ดำเนินการได้ง่าย หรือเรียกใช้โดยนำหน้าด้วย php <filename>
ฉันยังทำไม่เสร็จทั้งหมด แต่ฉันทำเสร็จไปจำนวนหนึ่งแล้ว อย่างน้อยก็เพียงพอที่จะทำความเข้าใจความสามารถได้ดี
phpthreads ต้องการส่วนขยาย PHP ต่อไปนี้:
<?php
require_once '../lib/phpthread.php'; /* Use correct path! */
function thread_proc( $thread,
$param)
{
echo "nt[PHPTHREAD] - I've started and have a param: "" . print_r($param, true) . ""!n";
for ($i = 0; $i < 15; $i++) {
usleep(1000000);
echo "t[PHPTHREAD] - Tick!n";
}
$myobj = (object)array(
'seconds_alive'=>$i,
'lucky_number'=>rand(0, 10000)
);
echo "nt[PHPTHREAD] - I'm returning this:n";
print_r($myobj);
echo "n";
echo "<--------------------------------------->nn";
return $myobj;
}
$id = phpthread_create($phpthread, array(), "thread_proc", null, array("this awesome string!"));
for ($i = 0; $i < 5; $i++) {
echo "n[MAIN] - Doing my thing...n";
usleep(1000000);
}
echo "n[MAIN] - Okay, I'm tired. Waiting on child to quit.n";
phpthread_join($id, $retval);
echo "n[MAIN] - Child is done. It returned:n";
print_r($retval);