wev-server处理一个php请求,是给它一个线程呢?还是一个进程呢?这就要牵扯php本身的一些特性了。
早期版本的x系统,包括linux等,其实不支持线程的。故而:那是为每一个php请求都创建分配了一个进程。 网上也很多人说这个问题,因为php手册上说:php是使用线程的。实际上:此时是用多进程来模拟线程而已。所以你查看线程进程什么的,你会发现每个请求都是一个进程。
到了后期:新版本的系统都支持线程了,windows更不用说了。问题是php本身是线程不安全的。那什么叫:线程不安全呢??举个最简单的例子:多个同样的php请求过来: GET /file/create?name=a; GET /file/create?name=b;
如果每个php请求都是用一个线程会出现什么情况呢?我们都知道:线程是公用进程空间的。这意味着:上述两个请求是公用同一个进程内存空间的。而php收到用户的请求之后,其会将GET参数进程存储。 对上述请求会在superglobal变量 $_GET['name']中存放值。 问题是:
$_GET['name']只能存放唯一一个值(因其共用同一个进程空间,从而只有一个该变量),而这里用户两个请求传入了两次值,此时:$_GET['name']中存放的是a还是b呢?显然:无论怎样,a和b都是只能存一个,不可能两个都保存着,这导致对这个变量空间的使用产生了竞争。 这也就是为什么说:php是线程不安全的原因!! 因为线程的公用内存空间这一特性已经决定了php在使用时是不安全的!!所以:一般每个php请求都是用一个进程来处理的,这样每个都有自己独立的内存空间,这就不会遇到上边所说的问题了,亦即:php是进程安全的,但是线程不安全的。
那很多人会说了:php新版本在windows下就是用线程来处理每一个请求,此时怎么处理的?其实为了实现真正的线程,php内部有一套自己的机制,这就是TSRM (线程安全资源管理器)。这个机制说简单一点就是:每当一个请求到来就会创建一个线程,但是同时会把全局变量拷贝一份存在一块新申请的内存中,而后把这个内存块串联到一个vector中,并最终由zend engine(也就是执行php的虚拟机)来管理 。说白了就是:对于导致产生线程不安全性的全局变量,每一个线程都单独拷贝一份自己使用,通过这种拷贝的方式避免了资源竞争导致的线程不安全性。
分享到:
相关推荐
Fast Route:快速的PHP请求路由器
PHP 请求实例.docx
利用PHP中的 Curl 请求API PHP支持的由Daniel Stenberg创建的libcurl库允许你与各种的服务器使用各种类型的协议进行连接和通讯。 libcurl目前支持http、https、ftp、gopher、telnet、dict、file和ldap协议。libcurl...
PHP构造http头发送请求
NULL 博文链接:https://tw5566.iteye.com/blog/1945002
php 模拟浏览器 请求网页见容
php异步请求,fsockopen实现,亲测可用,分别包含get和post两个方法用于get和pos请求
一个发送POST请求的三种方式的php类,PHP发送POST请求的三种方式 分别使用curl file_get_content fsocket 来实现post提交数据。
php带参数请求别人的接口
详细分析php获取不到自定义header参数的原因,明确设置自定义header参数注意事项以及php获取自定义参数方法
php请求远程地址设置超时时间,主要讲解file_get_contents、fopen、curl这三个简单常用函数设置超时时间的方法,一般情况下建议使用curl,性能最好,效率也最高。 1、file_get_contents 请求超时设置 $timeout = ...
PHP网页的后台OPC客户端通信,实现对PLC数据的读取展示
18年开发的顺丰快递电子面单php版。目前公司已使用3年,有需要的小伙伴可以下载使用。
php相关 图片处理 可以实现两张图片合并 并设置logo 以及合成后的图片的大小以及设置想要显示的文字
该工具仅仅只是对curl的一个基本的封装,主要是为了日常开发时使用http请求更加方便,使得开发者无需过多关注curl需要怎么配置。
php代码-php将所有的请求参数打印记录到日志文件
使用PHP实现一部的HTTP请求,非多进程。
php中http请求封装HttpClient精华中的经典代码。从国外官网直接下的,看看人家怎么封装的,受益匪浅啊,堪称经典。里边有说明和实例
下面小编就为大家带来一篇PHP请求Socket接口测试实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧