2009-11-15 48 views
1

我是PHP新手。我熟悉支持异步编程的ASP.NET。也就是说,如果一个请求需要做一些I/O工作。建议使用BeginProcess/EndProcess方式对网页进行编程。异步编程是提高可伸缩性的关键。PHP支持异步编程吗?

我想知道PHP世界中是否有异步编程(BeginXXXX/EndXXXX)的对应物。

+0

如果请求正在执行IO,那么IO在进行时还有什么其他功能?为什么不给出一个关于PHP中发生的事情的故事,并了解如何利用它提供的功能来处理它。 – 2009-11-15 15:25:34

+1

在ASP.NET中,每个请求都在一个线程中处理。由于线程作为资源是有限的,我们不希望线程在I/O操作上被阻塞。而且,ASP.NET中的线程池大小总是有限的。所以,开始/结束模式是必要的。 我想这是PHP的不同故事。每个请求在单个进程中处理? fork进程处理请求并不重要。所以,这个开始/结束异步编程模型是没有必要的。 – 2009-11-16 02:12:41

回答

1

在.NET中BeginXXX/EndXXX范式严重依赖于线程,而在PHP中,我不确定你甚至可以启动一个新线程(除了可能是PECL package)。

FastCGI是多数解释语言中多线程的替代方案。它不是产生新的线程,而是使用进程,但是产生一个新的进程很昂贵,它保留了一个可重用的进程池,就像.NET中的ThreadPool一样。

+0

可悲的消息。 那么,我们可以做的是分叉过程? – 2009-11-15 13:25:55

+0

是的,你可以分叉进程,但由于这是一个昂贵的操作,我不确定你会得到很多性能改进。当然,一如往常,你可能不得不测量。 – 2009-11-15 13:27:59

+0

我认为分叉过程应该在* nix OS中加权。 – 2009-11-15 13:28:57

1

如果I/O与插座或文件执行的,你应该使用分别stream_socket_select()或stream_select()(类似于系统调用C/C++)。

下面是用PHP做了一个简单的命令行聊天教程: Simple PHP socket-based terminal chat

注:这不是一般的多线程解决方案,但情况下一个简单的解决方案,你需要“半平行的” I/O

0

PHP没有,但是你可以使用AJAXØ页面已加载,这将允许异步请求。

老实说,没有意义。如果你真的想要重量级的后端,你最好写一个独立的程序来完成繁重的任务。就我所知,PHP模块是用纯C编写的,所以你应该可以使用它,然后从PHP调用你自己的自定义函数。

0

使用stream_select可以通过HTTP请求创建子进程。检查http://drupal.org/project/httprl中的代码,了解如何执行此操作的一些想法。一旦我把它更加打磨,我打算把这个库推到github上;可以在Drupal之外运行的东西。但现在它居住在Drupal的土地上。