我在php上写了一个服务。它以URL的形式接收客户端的请求,将其插入Mysql DB
并将响应作为successfull
或failure
提供给客户端。网址如下:
mysite.com/index.php?user=1234&&tokenid="wdsavdcsvc"
问题是tokenid
是由另一个外部可执行文件生成的,它需要大约3秒才能完成,它使我的应用程序(请求处理和响应基本上)变慢。
我正在使用$tokenid = shell_exec application arguments
最糟糕的是,我无法对可执行文件进行任何更改。
我以为我应该将可执行文件作为后台进程运行。但我不确定这是不是一个正确的选择。
有没有办法调整应用程序,以便在一秒钟内收到1000个请求。
编辑:
我根本不需要向用户返回令牌,我可以生成令牌并稍后插入。这完全是出于我们的目的。
答案 0 :(得分:2)
<强>更新
OP已经明确表示他们不需要立即返回令牌ID,他们真正想要的是一个有效的排队系统来处理令牌ID作为后台任务。这里的解决方案是创建一个名为“pending_token_generation”的数据库表,其中包含用户信息,可能作为“用户”表中的外键。
然后,您应该设置一个每分钟运行一次的Cron作业(根据您的需要)从该表中提取一行或多行,并使用您的可执行文件生成令牌。生成令牌时,从“pending_token_generation”中删除该行,并在任何需要的地方插入令牌 - 也许在“users”表中?
这应该包含在交易中,以避免出现问题。
旧答案
如果您的脚本依赖于该可执行文件,并且该可执行文件总是需要三秒钟才能完成,那么您可以做很多事情。如果您乐意做大量的工作,那么解决方案就是让您的脚本立即响应一个票号,客户端可以在五秒钟后用它来重新查询您的服务器。
如果你想沿着这条路走下去,这就是它的样子:
1)用户要求提供令牌ID。
2)你的服务器说:“我听到你了;这是一张票号,5秒后再问我一次。”
3)服务器然后启动令牌生成可执行文件,并将其结果存储在票号旁边的临时表中。
4)客户端接收并存储票号,然后在5秒内将其发送回服务器:“我要求提供令牌ID;这是我的票号。”
5)服务器在表中查找票号,在其旁边找到令牌ID,然后将其返回给客户端。
答案 1 :(得分:1)
您正在执行的任务需要3秒钟,我假设是同步的,一个令牌大部分时间都与身份验证有关。
只要你不能改变3秒的任务,就没有办法加快速度...... 第三方是问题,而不是php / mysql / apache的问题。
如果你想更好地概述你的PHP代码在这3秒内所做的事情,请安装xdebug php扩展,它用于分析。
您可以使用WinCacheGrind(widows)或kcachegrind(linux)读取cachegrind文件。
在Windows上没有安装xdebug的经验,但在Linux上只是一个yum / apt-get install php-xdebug并配置它。
可以在the xdebug website或wincachegrind website
上找到更多信息编辑
我看到你用你如何获得令牌来更新你的帖子,一个shell_exec是一个坏主意,永远不会扩展或足够可靠。 如果我是你,我会更好地了解你为什么需要令牌,自己动手(如果它像auth一样)或者如果它不是身份验证则使用不同的解决方案。
如果您需要更多帮助,您必须向我们提供有关shell_exec原因和内容的更多信息,因为该问题与Web请求无关。
答案 2 :(得分:0)
性能调优就是找到系统中最慢的部分,并修复这些部分。
听起来您已经确定了系统的缓慢部分 - 生成令牌的外部可执行文件。这是缓慢的部分,所以这就是你需要解决的问题。
你是否可以这样做,或者如何去做,对我来说是不可能帮助的,因为你没有在问题中提供任何关于它的线索。但是,如果它需要3秒钟,那么你可以用你的PHP代码来加速它,除了更快地换掉缓慢的组件。