首先..
不,根据 CS 定义,它们不是真正的线程,但您确实无法区分其中的区别。我会这样说 - 这个库比麦当劳新的“McPlant”汉堡肉饼与牛肉更接近真正的螺纹感觉。 ?
如果您像我一样,您就会喜欢PHP!你喜欢语言的灵活性和力量——编写草率代码的自由(我不提倡,但我将誓死捍卫编写草率代码的权利),或者创造无可争议的美丽逻辑艺术作品!现在,对于我所有的 C(我猜还有 C++)程序员来说,您拥有的库不仅可以真正展示 PHP 的强大功能,还可以为您的下一个项目提供支持!
该库允许您以非常非常类似于 POSIX 多线程的方式非常高效地并行处理。您可以在所有phpthreads之间共享全局变量,在创建时将值/对象/数组传递给 PHPTHread,在运行的phpthreads之间轻松共享值/对象/数组,并在每个 PHPThread 通过phpthread_join()
终止时接收 PHPThread 退出值/对象/数组函数族。
我设计这个库是因为我想编写一个高性能的 WebSocket 服务器来轻松处理数千个同时连接,通过这些连接可以快速传输大量数据(例如图像或视频)。是的,从根本上来说,它是一个fork()
服务器,但是顶部的 PHPThread 层使其超级易于部署,同时提供了一种简单(和线程式)IPC 的机制。我本可以使用 C 语言并获得更好的性能,但对我来说,随着服务器的启动,这似乎更便携且易于部署,所以现在就是这样。
对于技术人员来说,这个库不会因为需要使用“ticks”而暂时受到阻碍。这就是它如此之快的部分原因。该库在内部使用信号(例如 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);