同时运行相同的脚本和PHP的单线程状态

Bre*_*ett 5 php multithreading

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

如果没有,你怎么能一次运行相同的脚本?你只是将脚本重命名为其他内容,然后你可以同时运行这两个脚本吗?......或者我在这里感到困惑?

Joe*_*ins 14

PHP 本质上不是单线程的.

http://php.net/Thread

但是,在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个客户端,您认为文本文件会发生什么?

  • **这是完全错误的,自2000年以来,作为翻译的PHP支持多线程.** (5认同)
  • 是的,作为一名口译员。我们正在谈论不同的事情。你是在告诉我你可以在 php 脚本中 fork 新线程吗? (3认同)
  • PHP 作为一种语言,对多线程的支持为零,因此是单线程的。事实上,您有各种解释器进行多线程请求处理,因为它们对内存很吝啬,但这并不能改变 PHP 在设计上是单线程的事实。我还没有遇到过任何默认运行工作 MPM 的标准主机。 (2认同)

Nie*_* B. 5

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

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

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

更新

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