12

我知道 PHP 是单线程的,所以我想知道,这是否意味着如果我foo.php在浏览器选项卡中运行说,然后打开另一个浏览器选项卡并运行相同的文件,如果foo.php仍在另一个浏览器选项卡中运行,它还会运行吗? ?

如果没有,您如何一次运行相同的脚本?您是否只是将脚本重命名为其他名称,然后您可以同时运行两者?...还是我在这里感到困惑?

4

2 回答 2

19

PHP本质上不是单线程的。

http://php.net/线程

然而,在 unix 系统上最常见的 PHP 安装是单线程设置,最常见的 Apache 安装也是如此,而 nginx 没有任何基于线程的架构。

在这个最常见的 unix 设置中,每个接受请求的 http 服务器进程都可以执行以下操作之一:

  • 生成一个 php 解释器进程(cgi - 通用 CGI 网关)
  • 操作解释器的进程内实例(mod_php5 - Apache 特定的 PHP 模块,服务于 Apache 的 mpm 和 worker 安装)
  • 与 FCGI 进程通信(php-fpm - 常与 nginx 一起使用,一些 apache 使用仍在继续......)

在最常见的 Windows 设置和一些更高级的 unix 设置中,PHP 可以并且确实在一个进程中操作多个解释器线程。

在任何情况下,解释器的每个实例,无论是在另一个进程中还是在另一个线程中,都可以访问脚本的唯一表示,这是将 PHP 脚本编译为操作码以供 Zend 执行的结果。

这是设计使然,它被称为无共享架构,它允许您创建同一脚本的数百/数千/数百万个实例,这些实例在很大程度上不会相互干扰。

即使 PHP 在执行的编译阶段使用操作码缓存来节省资源,解释器的两个实例也不会访问相同的物理内存。

值得注意的是:PHP 在任何设置中都不是完全没有并发执行的影响,这是现代计算的本质;例如,如果您的脚本编辑了一个文本文件,并且 1000 个客户端同时出现,您认为该文本文件会发生什么?

于 2013-10-20T19:49:38.367 回答
4

PHP 的单线程特性意味着 PHP 没有任何内置支持在脚本执行期间生成新线程。

但是,这并不意味着您不能同时执行同一个脚本的两次。

在最常见的设置中,您的网站由 Apache HTTPD 提供服务。当针对特定脚本的 HTTP 请求进入时(例如/news.php,Apache 执行脚本并返回结果。虽然脚本本身无法启动新线程,但 Apache 本身很乐意派生全新的进程来同时为多个 HTTP 请求提供服务。

更新

请参阅乔·沃特金斯的回答。看来 PHP 确实支持在执行期间创建线程。但是,这并没有改变您可以同时执行同一脚本的事实。

于 2013-10-19T21:23:07.370 回答