우선..
아니요, CS 정의에 따른 실제 스레드는 아니지만 실제로 차이점을 알 수는 없습니다. 이렇게 표현하겠습니다. 이 라이브러리는 McDonald의 새로운 "McPlant" 햄버거 패티가 쇠고기에 대한 것보다 진정한 스레딩 느낌에 더 가깝습니다. ?
당신이 나와 같다면 PHP를 좋아하는 것입니다 ! 당신은 언어의 유연성과 힘, 즉 엉성한 코드를 작성할 자유(나는 그것을 옹호하지는 않지만 엉성한 코드를 작성할 권리를 끝까지 옹호할 것입니다), 또는 의심의 여지 없이 아름다운 논리적 예술 작품을 만들 수 있는 자유를 좋아합니다! 이제 모든 C(및 C++) 프로그래머를 위해 PHP의 강력함을 보여줄 뿐만 아니라 다음 프로젝트에 활력을 불어넣을 라이브러리가 생겼습니다!
이 라이브러리를 사용하면 POSIX 멀티스레딩과 매우 유사한 방식으로 매우 효율적으로 병렬 처리를 수행할 수 있습니다. 모든 phpthreads 간에 전역 변수를 공유하고, 생성 시 값/객체/배열을 PHPTHread에 전달하고, 실행 중인 phpthreads 간에 값/객체/배열을 쉽게 공유하고, 각 PHPThread가 phpthread_join()
을 통해 종료될 때 PHPThread 종료 값/객체/배열을 받을 수 있습니다. 함수 계열.
나는 대량의 데이터(이미지나 비디오 등)를 빠르게 전송할 수 있는 수천 개의 동시 연결을 쉽게 처리할 수 있는 고성능 WebSocket 서버를 작성하고 싶었기 때문에 이 라이브러리를 설계했습니다. 예, 기본적으로는 fork()
서버이지만 맨 위에 있는 PHPThread 레이어를 사용하면 배포가 매우 쉽고 스레드와 유사한 쉬운 IPC를 위한 메커니즘을 제공할 수 있습니다. C를 사용하여 더 나은 성능을 얻을 수도 있었지만, 나에게는 이것이 서버가 가동됨에 따라 더 이식성이 있고 배포하기 쉬워 보였으므로 이제 여기에 있습니다.
좀 더 기술적인 분들을 위해 이 라이브러리는 "틱" 사용의 필요성으로 인해 일시적으로 방해를 받지 않습니다. 이것이 바로 속도를 높이는 이유 중 하나입니다. 라이브러리는 내부적으로 신호(예: SIGUSR1 및 SIGUSR2)를 사용하여 실행을 중단하고 컨텍스트를 매우 유연하게 전환합니다. 예, 우리는 SIGUSR1과 2를 사용하고 있으므로 프로젝트에서 해당 신호를 사용하는 경우 지정된 메시지 처리기 함수에 phpthread_send_message()
사용하는 것을 고려하십시오(예제/messages1.php 및 example/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);