我知道PHP是单线程的,所以我想知道,这是否意味着如果我在浏览器选项卡中运行说foo.php
然后打开另一个浏览器选项卡并运行相同的文件,它是否仍会运行{ {1}}仍然在其他浏览器标签中运行!?
如果没有,您如何一次运行相同的脚本?你只是将脚本重命名为其他内容,然后你可以同时运行这两个脚本吗? ......或者我在这里感到困惑?
答案 0 :(得分:13)
PHP本质上是 NOT 单线程。
然而,在unix系统上最常见的PHP安装是单线程设置,最常见的Apache安装也是如此,而nginx没有基于线程的架构。
在这个最常见的unix设置中,每个接受请求的http服务器进程都可以执行以下操作之一:
在最常见的Windows设置和一些更高级的unix设置中,PHP可以并且确实在一个进程中运行多个解释器线程。
在任何情况下,解释器的每个实例,无论是在另一个进程中还是在另一个线程中,都可以访问脚本的唯一表示形式,该表示形式是将PHP脚本编译为操作码以供Zend执行的结果。
这是设计的,它被称为无共享体系结构,它允许您创建数百/数千/数百万个相同脚本的实例,这些实例在很大程度上不会相互干扰。
即使PHP利用操作码缓存在执行的编译阶段节省资源,解释器的两个实例也不会访问相同的物理内存。
值得注意的是:PHP并不完全没有任何设置中并发执行的影响,这是现代计算的本质;例如,如果您的脚本编辑了一个文本文件,并且一次有1000个客户端,那么您认为该文本文件会发生什么?
答案 1 :(得分:2)
PHP的单线程特性意味着PHP在脚本执行期间没有任何内置支持来生成新线程。
但是,这并不意味着您不能同时执行相同脚本的两次执行。
在最常见的设置中,您的网站由Apache HTTPD提供服务。当一个特定脚本的HTTP请求进入时(例如/news.php
),Apache执行脚本并返回结果。虽然脚本本身无法启动新线程,但Apache本身很高兴地要求全新的进程同时为多个HTTP请求提供服务。
请看Joe Watkins的回答。看来PHP确实支持在执行期间创建线程。但是,这并没有改变您可以同时执行相同脚本的事实。