gyhhi 发表于 2015-11-13 20:56:38

【已解决】我的post抢票程序,循环速度很慢是怎么回事?(无验证码)

本帖最后由 gyhhi 于 2015-12-17 17:57 编辑

内部的一个小网站,我做了个很简单的抢票程序,每天8点整网站开始放票,若还没到8点就抢票,网页会返回“尚未开始”的提示,下面的POST程序保证没问题,返回值正常,可以读到“尚未开始”,与httpwatch截获的内容一致。
为保证能抢到,我是7点59分就开始不停地post数据,for循环速度只有可怜的3~4次每秒,也就是相当于250毫秒才能提交一次,这速度有时候还不如手工···{:1_521:}

关键程序在下面,不过只能在我们的内网使用,大家应该是运行不了。就是想让大伙看看,为什么循环的速度这么慢?????
(抢票时不需要验证码);前面是用POST登陆网站,内容略去,大家只看下面
MsgBox(0,"ok","登陆成功")
;登陆成功,下面开始抢票
$PostPage='http://XXXXXXXXX已隐藏xxxx';抢票的post URL
$PostData='Command=GetTickets&Code=2&DateType=Today&TimeType=ALL&DeptID=1'        ;post内容是明文,而且是固定的

For $ii=1 To 100000        
        $xmlhttp.open("POST", $PostPage, True);异步模式->不用等待网站的回应。用同步模式会更慢
        $xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');头信息
        $xmlhttp.send($PostData);抢票
;~         $bodytext = BinaryToString($xmlhttp.responseBody, 4);
;~         ConsoleWrite($bodytext&@CR)
        ToolTip($ii);显示循环次数,用来观察抢票的速度
Next

gyhhi 发表于 2015-11-14 10:04:08

快来人那,大家帮我看看{:face (297):}

gyhhi 发表于 2015-11-14 21:29:36

还没有人啊,a大大在哪里

tank 发表于 2015-11-15 13:14:15

要是后台不限制同一IP或用户名的连接数的话,你用多线程去抢比较合适。
另外这些抢票不用提前太多时间POST,提前一两秒就可以了。
至于你程序慢的原因,一般应该是网络阻塞和后台服务器响应慢,换成winhttp试试。

gyhhi 发表于 2015-11-16 08:56:17

回复 4# tank

应该不是这个你说的这个原因,不知道不写cookie是不是会导致变慢?或者说我的程序的连接不能保持keep-active?每次post都得在他们服务器那里验证?
另外,确定不是网络阻塞,也不是服务器慢,因为没有验证码,我用_IEImgClick模拟点击,并检测返回值是否成功,发现速度能达到50+次/s。

wql8549 发表于 2015-11-16 12:26:27

回复 1# gyhhi


    可以在你07至14行代码间 增加时间输出;看下 是那一步满了;
应该和你每次post都创建连接有关

wql8549 发表于 2015-11-16 12:28:21

可以把连接 放在循环体外面,循环体内增加连接状态检测,发现超时或断开再重新连接

user030 发表于 2015-11-18 09:01:26

想问下LZ,你不用创建对象? $xmlhttp=ObjCreate("MSXML2.XMLHTTP") ?
个人看法,照7L说的去试试,看你语句,就只有连接会相对耗时,其他的都不会有很大的时间延迟。

gyhhi 发表于 2015-11-20 09:26:01

回复 7# wql8549


    如果放到外面,第10行的$xmlhttp.send($PostData)语句会出错,你的没问题吗?

gyhhi 发表于 2015-11-20 09:28:22

回复 8# user030


    上面只贴出了关键语句,创建对象在前面,没贴上来。。
把连接语句放到循环外面,第10行的send语句会出错,不知道什么原因,你知道吗?是因为连接断开了吗?如果是的话,如何保持连接状态呢?需要自己写cookie还是?

gto250 发表于 2015-11-20 20:44:43

使用ObjCreate("winhttp.winhttprequest.5.1")试试
还有$xmlhttp.open("POST", $PostPage, True) ture的时候是同步,false才是异步
cookie程序自己会处理

gyhhi 发表于 2015-11-23 11:56:49

回复 11# gto250


你弄错了吧,那个标志位名字叫“是否异步”,所以,true=异步,false=同步。
另外winhttp.winhttprequest.5.1对象不也是基于微软那个对象,然偶自己封装的吗,winhttp的头文件里应该能查到

gyhhi 发表于 2015-12-17 17:58:52

速度慢确实是因为网站响应慢导致的,不是程序问题。
不限制同一IP连接数,最后用多进程UDF实现了提速。结贴
页: [1]
查看完整版本: 【已解决】我的post抢票程序,循环速度很慢是怎么回事?(无验证码)