2011-11-02 160 views
3

我想运行一个PHP脚本,每秒运行一次以更新MySQL表。PHP可以同时或一个一个地处理多个请求吗?

假设该脚本需要0.99秒,这将阻止网站访问者在脚本执行时访问网站吗?他们会收到超时/内部服务器错误? 如果是这样,有没有办法解决这个问题,或许使用某种多线程选项?

为了给出更多的细节,我试图创建一个角色扮演游戏,其中有怪物。这些怪物存储在一个名为rpg_monsters的表中。怪物表有一个ID,目标,x和y场,并且需要看他们是否在对方的范围内攻击可能的敌方。 如果他们在彼此的范围内,他们需要将他们的目标更新为该怪物ID。今天我仍然有很少的怪物,但是这个数字将来会增加,从而增加剧本的执行时间。

我知道在正常情况下,您需要专门的服务器来完成这种紧张的工作。但是,我想看看在变得过载之前我能推多少PHP/MySQL。

预先感谢您!

+4

简答题;没有。多个用户可以一次访问脚本/页面。想象一下,有多少人在Facebook上加载相同的文件。 – OptimusCrime

+0

永远不要做这样的假设:D(0,99秒的跑步) – dynamic

+0

我建议你使用AJAX来填补这个目的。例如,您可以每秒更新一次AJAX调用PHP文件来更新MySQL表,然后让它检查最后更新的字段,以便如果多个用户发送AJAX请求,则每1秒只允许更新一次。无论是或者您可以使用Cron选项卡或计划任务,他们在那里独立于客户端请求执行这些操作。漫漫漫步漫步...... – ShadowScripter

回答

2

简答题:没有。

每一个新的PHP脚本调用都会创建一个新的PHP实例(通常是一个新的进程,在某些情况下它只是在新线程下运行,但这不会影响您的问题),并且多个实例独立运行其他。

作为外壳点,尝试运行此脚本:

<?php 

    sleep(20); 

?> 

...并发送一个新的请求/在运行时启动另一个实例。你会看到这个不会以任何方式影响另一个。

要添加更多有关线程元素的信息:PHP本身不能是多线程的。如果你在最近的IIS中运行它作为一个IIS模块(关闭我的头顶,我不记得这是从什么时候开始的),PHP实例将在IIS进程的一个新线程下运行 - 但是你不能开始一个新的从PHP内部线程。在其他每个设置(AFAIK)中,每个新的PHP实例都会创建一个新进程。

+0

当php脚本完成执行时,该进程会发生什么?一次有多少人可以访问该网站? –

+0

@D_Vaibhav这个答案很糟糕,但我没有时间重写它。这一切都依赖于所谓的SAPI--一些SAPI(我认为mod_php?)为每个请求分配一个新进程,并在请求结束时死掉。 FPM拥有一个一次处理一个请求的进程池,但进程是循环使用的。一些SAPI使用线程模型,其中创建新线程来处理请求并在之后终止。我不确定现有的SAPI是否可以执行此操作,但您也可以维护一个线程池并回收它们。什么适用于您取决于您​​正在使用哪个SAPI。 – DaveRandom

3

人们仍然可以访问您的网站。通常你要做的是用php脚本更新crontab中的数据库,然后让apache为web请求提供服务。 Apache通常会限制它可以拥有的并发连接数量,因此这将成为您同时访问该网站的人数的限制。

您可能遇到的唯一问题是锁定表的SQL查询,以便脚本对同一个表运行查询,并且必须等待第一个查询完成。正确地构造更新查询应该可以避免这种情况。

相关问题