当多个用户同时请求PHP页面时,该页面是否会被中断?

当多个用户同时请求PHP页面时,该页面是否会被中断?,php,wamp,Php,Wamp,例如,如果我们在服务器getProducts.php上有一个特定的php文件。当多个用户同时请求时,它是否会被中断? 例如,如果一个用户询问产品a的详细信息,另一个用户询问产品B,另一个用户询问产品C等等,php会被中断吗?或者它是一个自行生成的线程系统,可以根据每个请求工作和响应 谢谢大家! 如果您使用的是apache,那么它是一个并发系统。这意味着每个请求都将被并行处理,这样您的php脚本就不会被中断。出乎意料的是,这与php几乎没有关系。回答用户请求的不是PHP,而是web服务器。例如Ap

例如,如果我们在服务器
getProducts.php
上有一个特定的php文件。当多个用户同时请求时,它是否会被中断? 例如,如果一个用户询问产品a的详细信息,另一个用户询问产品B,另一个用户询问产品C等等,php会被中断吗?或者它是一个自行生成的线程系统,可以根据每个请求工作和响应


谢谢大家!

如果您使用的是apache,那么它是一个并发系统。这意味着每个请求都将被并行处理,这样您的php脚本就不会被中断。

出乎意料的是,这与php几乎没有关系。回答用户请求的不是PHP,而是web服务器。例如Apache、NginX、IIS等等

然后,web服务器将调用路由到一个PHP实例,该实例通常独立于此时满足的任何其他请求。并发请求的数量取决于服务器配置、体系结构和平台功能。所谓的“C10K”服务器设计为同时提供多达一万个连接

但是在从“GET/index.PHP”到一堆HTML的过程中,PHP并不是唯一的因素;任何活动页面(PHP、ASP或Python等)都可能从数据库请求进一步的资源。在这种情况下,会出现并发问题,每当两个用户需要获取相同的资源(数据表中的一行、整个表、一个日志文件…)时,某种信号系统就会这样做,以便一次只有其中一个用户可以获取该特定资源的“锁”,而所有其他用户都必须等待轮到他们,即使覆盖的web服务器能够处理数百或数千个并发连接

性能问题更新:在PHP中,类似的情况也会发生在会话中。假设您有一个用户请求一个页面,而该页面有代码生成十个以上的调用(对图像、弹出窗口、广告、AJAX…)。第一个请求打开一个会话,这是一组必须保持一致的数据。因此,当其他十个调用出现时,所有调用都绑定到同一个会话,PHP无法知道这些调用中是否有任何一个想要修改会话数据——在第一个调用释放会话锁之前,PHP没有办法,第二个调用将阻止第三个调用,依此类推。要点:避免
会话\u start()
如果不需要它(例如,用加密的强GET令牌替换它或完全不使用),或者在修改完
会话\u commit()
的值后立即调用
会话\u commit()
将大大提高性能。(使用更快的会话管理器或不进行粗锁的会话管理器也会如此:例如,
redis

例如,在图像生成中:

session_start();
// This does the magic.
session_commit();
// We can still read session. We just can't write it anymore.

// That's why we needed a session.
if (!isset($_SESSION['authorized'])) {
    Header('HTTP/1.1 403 Forbidden');
    die();
}
// Here the code that generates an image *and sends* it. The session
// lock, if we hadn't committed, will *not* expire until the request
// has been processed by the *client* with network slowness. (Things
// go much better if you use the CGI interface instead of module).
在您的示例中,看到了“WAMP”标记,您有一个Windows Apache服务于PHP从MySQL检索的数据,并服务于产品上的请求

Apache服务器将接收数百个连接,激活数百个PHP模块实例(它们将共享大部分代码,因此内存占用不会急剧增加),然后所有这些实例都会问MySQL,“那么产品XYZ呢?”。用MySQL的说法,他们将尝试获得一个
读锁
。Read lock的意思是“我正在读这个东西,所以请你们在我读完之前不要在上面写字”。但他们都只是在读书,所以他们都会同时成功

所以不,就在那时,不会停下来

但假设您还想更新产品视图的计数器。然后,每个PHP实例还需要一个
写锁
,这意味着,“我想写这个东西,所以在我完成之前,你们都不会读,否则你们会冒着读不完整数据的风险,当然,在我写的时候,你们也不会在这里写”

此时,表类型将起作用。MyISAM表有:如果更新产品A统计数据的实例正在
产品视图上写入
,那么其他实例将无法对整个表执行任何操作。他们都会排队等候。如果表是
InnoDB
,则锁位于行级别-更新产品A的所有实例将依次排队,与更新产品B、C、D等的实例并行。因此,如果所有实例都写入不同的记录,它们将并行运行

这就是为什么在这些情况下您真的希望使用InnoDB表


当然,如果你有“页面访问”这样的记录,并且他们都在更新“product page.php”的行,那么你就有一个瓶颈,如果你是一个高流量的站点,如果你设计了其他的方式来编写这些信息,你会做得很好(许多解决方法之一是将其存储在共享内存位置;访问它的许多实例中,不时会有一个实例接收将信息保存到数据库的任务。这些实例仍在竞争内存锁定,但这比竞争数据库事务快几个数量级).

不,在任何给定时间,您的站点上只能有一个访问者。还删除了java和android标记,因为问题与java或android无关。您使用什么web服务器来为php代码提供服务器?请注意,php是单线程的。如果您想同时处理多个请求,则需要在中使用web服务器PHP前端,分叉或使用线程。@sberry wamp服务器。好的,那么我应该怎么做来解决我的问题??:SThanks Nathan!我很感激!!我不知道确切的答案,我尝试了“不太技术化”的方法。如果我猜错了或者需要澄清/进一步的信息,请随时纠正我。