我想运行一个每秒运行一次的PHP脚本来更新MySQL表。
假设此脚本需要0.99秒,这会阻止网站访问者在脚本执行时访问网站吗?他们会收到超时/内部服务器错误吗? 如果是这样,是否可以使用某种多线程选项?
为了提供更多细节,我正在尝试创建一个有怪物的角色扮演游戏。 这些怪物存储在名为rpg_monsters的表中。怪物表有一个ID,目标,x和y字段,需要查看它们是否在彼此的范围内以攻击可能的敌人。 如果它们在彼此的范围内,则需要将其目标更新为该怪物ID。今天我仍然有很少的怪物,但是这个数字将来会增加,从而增加了剧本的执行时间。
据我所知,在正常情况下,您需要专门的服务器才能完成此类紧张工作。但是,我想看看在过载之前我可以在多大程度上推送PHP / MySQL。
提前谢谢!
答案 0 :(得分:3)
人们仍然可以访问您的网站。您通常要做的是使用php脚本在crontab中更新数据库,然后让apache为Web请求提供服务。 Apache通常会限制它可以拥有的并发连接数,因此这将是您可以同时访问该站点的人数限制。
您可能遇到的唯一问题是锁定表的sql查询,以便脚本针对同一个表运行查询,并且必须等待第一个查询完成。正确构建更新查询应该可以防止这种情况。
答案 1 :(得分:2)
简答:不。
每次对PHP脚本的新调用都会创建一个新的PHP实例(通常是一个新进程,在某些情况下它只是在新线程下运行,但这不会影响您的问题),并且多个实例彼此独立运行
作为套管点,尝试运行此脚本:
<?php
sleep(20);
?>
...并在运行时发送新请求/启动另一个实例。你会看到一个不会以任何方式影响另一个。
添加关于问题的线程元素的更多信息:PHP本身不能是多线程的。如果你在最近的IIS中作为IIS模块运行它(我不记得确切的时候开始)PHP实例将在IIS进程的新线程下运行 - 但是你无法启动它PHP中的线程。在每个其他设置(AFAIK)中,每个新的PHP实例都会创建一个新进程。