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的虚拟机)来管理 。说白了就是:对于导致产生线程不安全性的全局变量,每一个线程都单独拷贝一份自己使用,通过这种拷贝的方式避免了资源竞争导致的线程不安全性。
分享到:
相关推荐
在本文档中,我们将深入探讨PHP请求实例,特别是与AJAX(异步JavaScript和XML)的结合使用。AJAX是一种Web开发技术,它允许在不重新加载整个网页的情况下更新部分页面内容,从而实现更流畅、更具交互性的用户体验。 ...
在PHP编程中,过滤请求中的数据是至关重要的一个环节,因为这关系到应用程序的安全性和稳定性。请求数据可能来自用户输入,如表单提交、URL参数、HTTP头等,这些数据未经验证和过滤就直接使用,可能导致SQL注入、跨...
### PHP构造HTTP头发送请求详解 #### 一、概述 在Web开发中,发送HTTP请求是一种常见的需求。PHP作为一种广泛使用的服务器端脚本语言,提供了多种方式来构造和发送HTTP请求。本文档将详细介绍如何使用PHP来构造...
利用PHP中的 Curl 请求API PHP支持的由Daniel Stenberg创建的libcurl库允许你与各种的服务器使用各种类型的协议进行连接和通讯。 libcurl目前支持http、https、ftp、gopher、telnet、dict、file和ldap协议。libcurl...
在PHP开发中,cURL库是一个非常强大的工具,用于处理HTTP和其他协议的网络请求。它允许程序员模拟浏览器的行为,发送GET、POST等不同类型的HTTP请求,甚至可以处理HTTPS、cookies、HTTP头等复杂情况。本篇文章将深入...
在Java编程中,请求JSON接口数据是常见的网络通信任务,主要应用于Web服务的客户端与服务器之间的数据交互。这里我们将深入探讨如何使用Java来获取指定接口的JSON数据,并涉及`HttpServletRquest`类的重要作用。 ...
在PHP编程环境中,HTTP请求工具扮演着至关重要的角色,它们帮助开发者轻松地与远程服务器进行交互,发送GET、POST等不同类型的HTTP请求。本话题主要围绕"PHP中的HTTP请求工具",尤其是对cURL库的基本封装,以实现更...
当我们需要从网页抓取内容,而直接访问又有困难时,可以利用PHP模拟浏览器请求网页内容。这一技术常被称为“网页抓取”或“屏幕抓取”,在数据分析、信息聚合、自动化测试等场景下非常实用。 首先,模拟浏览器请求...
PHP请求Socket接口测试实例的知识点涵盖了使用PHP语言进行Socket通信的过程,以及Java语言编写Socket服务端的基本方法。下面将详细说明这些知识点: 1. PHP和Socket接口: PHP是一种广泛应用于Web开发的脚本语言,...
在PHP编程中,判断请求来源是一项重要的任务,它有助于我们理解用户如何与我们的应用程序交互,以及如何处理不同的请求类型。这个话题主要涉及到Web服务器的工作原理、HTTP协议和PHP中的相关函数。下面我们将深入...
php异步请求,fsockopen实现,亲测可用,分别包含get和post两个方法用于get和pos请求
在PHP中,获取原生请求体(通常是指HTTP请求中的POST数据或PUT数据)是Web开发中的常见操作,尤其在处理API接口时。这涉及到理解PHP的输入处理机制以及如何访问HTTP请求的数据。以下是对这一主题的详细阐述。 首先...
本文将详细探讨标题中的"HTTP的请求处理PHP类",包括GET和POST请求的处理以及如何实现多URL并行请求。 首先,GET和POST是HTTP请求的两种主要方法。GET请求通常用于获取资源,其参数通过URL传递,且对数据长度有限制...
php带参数请求别人的接口
在PHP中,发送POST请求是常见的任务,尤其在与API交互、模拟表单提交或进行自动化测试时。这里我们将详细探讨使用cURL、`file_get_contents`和fsocket三种方法来实现POST请求。 1. cURL(Client URL Library): ...
在PHP编程中,HTTP请求处理是常见的任务,用于与服务器交互获取或发送数据。这个"HTTP请求处理PHP类.zip"包含了一个用CURL库封装的类,方便开发者更高效、简洁地实现GET、POST请求以及多URL并行请求。下面我们将深入...
**mod_php** 是Apache的一个模块,它直接嵌入到Apache中,当接收到PHP请求时,由Apache直接处理和解释PHP代码。 **mod_fastcgi** 则是一种使Apache能够与外部应用程序(如PHP)通过FastCGI协议进行通信的模块。 **...
在PHP开发中,进行HTTP请求是一项常见的任务,例如获取API数据、抓取网页内容等。然而,当需要向多个URL发起请求时,如果一个接一个地处理,可能会导致程序执行效率低下,特别是在处理大量请求时。为了解决这个问题...
在IT行业中,PHP和cURL库常常被用来创建网络爬虫、API接口调用以及其他需要模拟HTTP请求的场景。PHPcurl模拟IP浏览器请求是通过PHP的cURL扩展来实现的,它允许开发者发送HTTP请求,并自定义各种请求头,包括伪装成...
4. **动态加载内容**:如侧边栏的最新消息、评论等,可以使用AJAX定期向PHP请求新内容,保持页面活跃。 5. **异步更新**:用户执行某些操作,如点赞、收藏,AJAX会发送请求到PHP,PHP更新数据库,然后返回新的状态...