PHP中的multithreading

我正在尝试创build一个multithreading的PHP应用程序。 我已经阅读了大量的文章,解释了如何创buildmultithreading。 所有这些例子都是build立在对不同工作PHP文件进行潜水的基础上的。 当然,这也是我想要做的,但有一个问题:)

甚至在30秒内(即执行时间限制)分割的作业太多,

我们在本地networking上使用多服务器环境来完成这些进程,因为进程之间没有链接或共享相同的内存。 我们只需要开火,让他们在准确的时间工作。 每个过程的工作时间为0.5秒,但有可能工作30秒。

大多数的例子激发了PHP的等待结果。 但不幸的是,在我的情况下,我不需要期望线程的结果。 我只需要它执行命令并将结果写入自己的数据库。

我怎样才能达到启动phps并等待他们为10000个进程工作?

附加信息:我知道PHP既没有multithreadingfunction,也没有为之而build。 但是我们必须创build一个方法来使用它,例如我们可以发送请求到http://server1/dothis.php?jobid = 5,但是标准的方法使我们等待结果。 如果我们可以设法发送请求到这个服务器,而不等待结果它会解决我们的问题,我想或者我们将需要完全不同的方法,如与c + +或qt的进程分隔器。

正如已经指出的,php不支持多线程。 然而,正如tomaszsobczak提到,有一个库,它会让你创建“线程”并让它们运行,并通过其他脚本重新连接它们来检查它们的状态,称为“ Gearman ”。

在项目主页上:“Gearman提供了一个通用的应用程序框架,可以将工作分配给更适合于工作的其他机器或进程, 它允许您并行执行工作,进行负载均衡处理以及在语言间调用函数它可以用于从高可用性网站到传输数据库复制事件的各种应用程序,换句话说,它是分布式处理通信的神经系统。

Rasmus的博客在这里有一个很好的写作: 与gearman和你的情况,这可能只是解决方案,虽然我还没有深入的测试案例阅读…有兴趣知道虽然,所以如果你最终使用这个,请回报!

正如评论所说,多线程在PHP中是不可能的。 但根据你的评论:

如果我们可以设法发送请求到这个服务器,而不等待结果它会解决我们的问题,我想

您可以使用exec()启动PHP脚本以在后台运行,将脚本的输出重定向到其他地方(例如/dev/null )。 我认为这是你会得到的最好的。 从手册:

注意:如果一个程序是用这个函数启动的,为了继续在后台运行,程序的输出必须被重定向到一个文件或者另一个输出流。 如果不这样做将导致PHP挂起,直到程序执行结束。

用户贡献的注释中有几个注释和指针,例如这个代码片段允许在Windows和Linux平台上进行后台执行。

当然,这个PHP脚本不会共享你正在运行的PHP脚本的状态或者任何数据。 你将不得不初始化后台脚本,就像你正在做一个全新的请求一样。

由于PHP没有能力支持多线程,我不知道如何建议你。 每次加载一个新脚本时,都会加载一个新的PHP实例,所以如果您的服务器可以处理X个PHP实例,那么您可以按照自己的想法进行操作。

但是,这是一些东西:

代码为后台执行

  <?php function execInBackground($cmd) { if (substr(php_uname(), 0, 7) == "Windows"){ pclose(popen("start /B ". $cmd, "r")); } else { exec($cmd . " > /dev/null &"); } } ?> 

http://php.net/manual/en/function.exec.php#86329找&#x5230;

你真的想在PHP中使用多线程吗?

或者你只是想每秒执行一个PHP脚本? 对于后一种情况,通过linux控制台工具的cronjob-like“每秒执行一次这个文件”方法应该足够了。

如果你的任务是做大量的HTTP请求,你可以使用curl multi。 有一个很好的图书馆: http : //code.google.com/p/rolling-curl/

正如所有人已经提到的,PHP本身不支持多线程,解决方法是,解决方法是…

这就是说,你有没有听说过Facebook的PHP编译器 ? 基本上它把你的PHP编译成高度优化的C ++,并使用g ++来编译它。 这开创了一个机会的世界,包括但不限于多线程!

该项目是开源的,并在github上

如果你只是想发布一个HTTP请求,只需要使用PHP CURL lib。 它会解决你的问题。