钱柜777老虎机scrapy假死是怎么回事?

( 钱柜777老虎机 )

http://news.ifeng.com/listpage/11502/20150924/1/rtlist.shtml
我爬的是上面凤凰网的链接,链接里的日期通过循环来变,但是运行一段时间后,scrapy就停止爬取了,但还在运行,而且python进程占用cpu过高,到百分之三四十。
下面是log信息截图:

10:35时候停止抓取了,12点38我把它关了。

下面是代码:

    def parse(self, response):
        div = response.xpath('//div[@class="newsList"]')
        #这个是获得新闻的链接
        for ul in div.xpath('ul'):
            for li in ul.xpath('li'):
                url = li.xpath('a/@href')[0].extract()
                yield scrapy.Request(url, callback=self.parse_detail)

        spans = response.xpath('//div[@class="m_page"]')

        #这个是获得翻页链接的
        for span in spans.xpath('span'):
            url = span.xpath('a/@href')[0].extract()
            yield scrapy.Request(url, callback=self.parse)

scrapy没有设置默认的timeout,应该是服务器没有响应吧,请求超时,可以在settings.py中进行设置

(看完/读完)这篇文章有何感想! 钱柜777老虎机的分享…

钱柜娱乐777关于pygame中一个类的特性问题?

( 钱柜娱乐777 )

图一用help()查这个类是有image和rect这两个特性的,但是图二中却说没有这个两个特性。是我哪里出问题了吗?恳请各位指点

这是实例属性。。

你类都没实例化当然访问不到咯

(看完/读完)这篇文章有何感想! 钱柜娱乐777的分享…

钱柜777老虎机Python 爬虫

( 钱柜777老虎机 )

新手学习爬虫

有没有系统性的资料或者教程?

因为网上的资料都是针对性的,但我希望系统性的全面学习这方面的知识。

各位大神有没有推荐?

学习scrapyBeautifulSoup的使用,不知道scrapy现在支不支持python3,但BeautifulSoup是肯定支持3的,这两个东东能满足你爬虫的一些基本需求了。

要是需要往大了做,会遇着一些比较恶心的东西,例如所谓的爬虫,反爬虫,反反爬虫……这些东西就是另外一个故事了。

如果有兴趣的话,请移步知乎,参考一下别人的答案点这里

你想做什么 通用爬虫有现成的可以用 其余的都是解决各种恶心的东西
准确点说难点不在爬虫上 爬虫大了有规模了是难点 然后页面解析 各种识别参数模拟登陆这种才是真正要学的地方
另外有个经验 优先爬移动版
我知道有个scrapy 但是我们做项目的时候还是自己写了绝大多数框架 因为要做动态页面

scrapy满足你一切需求。开源。

去吧这个博客看了吧:https://segmentfault.com/a/1190000005155826

(看完/读完)这篇文章有何感想! 钱柜777老虎机的分享…

钱柜777OS下pip安装web.py、urlparse时出现错误?

( 钱柜777 )

1. 描述你的问题
pip 安装包web.py时出现错误

  1. 贴上相关代码

  2. 贴上报错信息

  3. 贴上相关截图

  4. 已经尝试过哪些方法仍然没解决(附上相关链接)

web.py目前应该还不支持Python3,urlparse是Python2的标准模块,Python3中改名为urllib.parse。

(看完/读完)这篇文章有何感想! 钱柜777的分享…

钱柜娱乐777多线程self.queue = queue这样写有什么好处?

( 钱柜娱乐777 )

代码
https://github.com/ring04h/dirfuzz/blob/master/dirfuzz.py

self.queue = queue
为什么不直接使用全局的queue变量(global queue)呢

这样有利于封装,虽然有时候全局变量也行,但却不够优雅,也不能体现面向对象的优点

(看完/读完)这篇文章有何感想! 钱柜娱乐777的分享…

钱柜777单机版的 pyspider工程 部署到 Pass平台上,能运行起来么?

( 钱柜777 )

手上现在用 pyspider 框架在做个爬虫项目,现在只是在单机上实现了爬取。
请问:

  1. 单机版的 pyspider工程 可以部署到 Paas平台上么?能运行起来么?

  2. 烦请各位推荐下 pyspider 分布式部署的教程,最好中文的。

谢了!

如果 PAAS 不限制多进程,允许后台进程常驻的话,可能可以。

(看完/读完)这篇文章有何感想! 钱柜777的分享…

钱柜777抓取图片时如何判断图片已经下载完毕了

( 钱柜777 )

  1. 初学 Python,通过尝试抓取网页内容来当突破口。

  2. 目前的方法是:

    1. 从列表页获取页内所有的详情页地址;

    2. 从详情页地址中获取所有的图片地址,并以详情页 url 的最后一段作为文件夹的名称;

    3. 每个图片地址起一个线程,拿到图片内容并存下来,用 url 的最后一段作为文件名;

    4. 环境是 win10 + python3,用到的库主要是 PyQuery、requests,抓的是 lofter 的网页。

  3. 目前遇到的问题是:下载下来的图片很可能只有一半,上半截是图片,下半截是红蓝绿交替

  4. 尝试过每抓一张图片就 sleep2 秒钟,并没有效果。

  5. 想请问有啥办法判断图片是否下载完成么?我现在想到的一个办法是根据图片大小来判断,但是召回和准确难以兼顾。

http response头域里头有Content-Length 根据这个判断是否和下载下来的大小一样 ,这个可以解决上面正常下面交替或者白板的问题,但是解决不了左右错误问题。左右错位问题有人用图像识别去做

(看完/读完)这篇文章有何感想! 钱柜777的分享…

钱柜777python访问次数过于频繁被域名限制访问

( 钱柜777 )

今天学习Python爬虫的时候,对于某个的域名访问次数有点多,到最后导致整个公司ping这个域名都出现超时(一个科技资讯网站,我也是非恶意)。想了解是否我的访问被视为了DDOS攻击而被这个网站限制访问了?能否稍微介绍一下Python爬虫如何避免被视为DDOS攻击?

一般这种情况时,我会先到 VPS 上 ping 一下目标域名,看看是不是他家网站挂了……

如果他确实是把你的 IP 屏了,那你就挂 HTTP 代理去爬吧。HTTP 可以买,也可以到网上找免费的。

控制频率,使用代理

urllib2.HTTPError: HTTP Error 403: Forbidden
类似于这个吗?

都是爬虫高手啊,借帖子问一下其他同仁,有遇到过加代理后和本地一样的都是403错误么,目标地址是HTTPS的。

(看完/读完)这篇文章有何感想! 钱柜777的分享…

钱柜777Flask修改APPLICATION_ROOT无效

( 钱柜777 )

我的Flask项目运行在一个临时目录下,项目的静态文件和模版都是放在其他地方的。因为Flask的模版目录和静态目录都是记录的相对路径,所以其实我只要修改项目的根路径。

我已经通过配置文件指定了APPLICATION_ROOT

app.config.from_pyfile(CONFIG_FILE, silent=True)

print app.config.get('APPLICATION_ROOT')
R:\abc

print app.root_path
C:\Users\Administrator\AppData\Local\Temp

但当我访问http://127.0.0.1:5050/static/doc.html的时候Flask还是从C:\Users\Administrator\AppData\Local\Temp读取文件。

请问是我哪里没弄对?APPLICATION_ROOT是假的么?

可以使用 Flask 的 template_folder static_folder 参数。

app/app.py 内容如下:

from flask import Flask, render_template

app = Flask(__name__,
            static_folder='/path/to/instance/static',
            template_folder='/path/to/instance/templates')


@app.route('/')
def index():
    return render_template('index.html')


if __name__ == '__main__':
    app.run(debug=True)

/path/to/instance/templates/index.html 内容如下:

<script src="/static/index.js"></script>

/path/to/instance/static/index.js 内容如下:

document.write('Hello, world!');

启动测试服:

python app/app.js

在浏览器中访问:


另,APPLICATION_ROOT 指的是应用程序的根 URL,只和 session 的 cookie 设置有关,不是用于解决你遇到的问题的。


参考:

(看完/读完)这篇文章有何感想! 钱柜777的分享…

钱柜娱乐777python 在powershell中运行中文乱码时有时无怎么办?

( 钱柜娱乐777 )

# -*- coding:utf-8 -*-
from sys import exit
from random import randint

class Scene(object):

    def enter(self):
        #pass
        print "This scene is not yet configured. Subclass it and implement enter()."
        exit(1)
        
    def fight(self):
        print "战斗开始!"
        print "--------------------"
        player_hp = 100
        Gthon_hp = 100
        winer = "none"
        first = randint(1, 2)
        if first == 1:
            first_man = "player"
        else:
            first_man = "Gthon"
        if first_man == "player":
            while player_hp > 0 and Gthon_hp > 0:
                Gthon_minus_hp = randint(0, 20)
                Gthon_hp -= Gthon_minus_hp
                if Gthon_minus_hp == 0:
                    print "你攻击了哥顿人,不过被他躲开了。"
                else:
                    print "你攻击了顿人,他掉了%d滴血。" % Gthon_minus_hp
                if Gthon_hp == 0:
                    winer = "player"
                    break
                else:
                    pass
                player_minus_hp = randint(0, 20)
                player_hp -= player_minus_hp
                if player_minus_hp == 0:
                    print "哥顿人攻击了人,你巧妙的躲开了。"
                else:
                    print "哥顿人攻击了你,你掉了%d滴血。" % player_minus_hp
                if player_hp == 0:
                    winer = "Gthon"
                    break
                else:
                    pass
        else:
            while player_hp > 0 and Gthon_hp > 0:
                player_minus_hp = randint(0, 20)
                player_hp -= player_minus_hp
                if player_minus_hp == 0:
                    print "哥顿人攻击了你,你巧妙的躲开了。"
                else:
                    print "哥顿人攻击了你,你掉了%d滴血。" % player_minus_hp
                if player_hp == 0:
                    winer = "Gthon"
                    break
                else:
                    pass
                Gthon_minus_hp = randint(0, 20)
                Gthon_hp -= Gthon_minus_hp
                if Gthon_minus_hp == 0:
                    print "你攻击了哥顿人,哥顿人躲开了。"
                else:
                    print "你攻击了哥顿人,哥顿人掉了%d滴血。" % Gthon_minus_hp
                if Gthon_hp == 0:
                    winer = "Gthon"
                    break
                else:
                    pass
        print "--------------------"
        return winer
                

class Engine(object):
    
    def __init__(self, scene_map):
        #pass
        self.scene_map = scene_map
        
    def play(self):
        #pass
        current_scene = self.scene_map.opening_scene()
        last_scene = self.scene_map.next_scene('finished')
        
        while current_scene != last_scene:
            print "\n--------"
            next_scene_name = current_scene.enter()
            current_scene = self.scene_map.next_scene(next_scene_name)
            
        # be sure to print out the last scene
        current_scene.enter()
        
class Death(Scene):
    
    quips = [
        "You died. You kinda suck at this.",
        "Your mom would be proud.. if she were smarter.",
        "such a luser.",
        "I have a small puppy that's better a this."
    ]
    
    def enter(self):
        #pass
        print Death.quips[randint(0, len(self.quips) - 1)]
        exit(1)
        
class CentralCorridor(Scene):
    
    def enter(self):
        #pass
        print "The Gothons of Planet Percal #25 have invaded your ship and destroyed"
        print "your entire crew. You are the last surviving member and your last"
        print "mission is to get the neutron destruct bomb from the Weapons Armory,"
        print "put it in the bridge, and blow the ship up after getting into an"
        print "escape pod."
        print "\n"
        print "You're running down the central corridor to the Weapons Armory when"
        print "a Gothon jumps out, red scaly skin, dark grimy teeth, and evil clown costume"
        print "flowing around his hate filled body. He's blocking the door to the"
        print "Armory and about to pull a weapon to blast you."
        
        action = raw_input("> ")
        
        if action == "shoot!":
            winer = super(CentralCorridor, self).fight()
            if winer == "Gthon":
                print "Quick on the draw you yank out your blaster and fire it at the Gothon."
                print "His clown costume is flowing and moving around his body, which throws"
                print "off your aim. Your laser hits his costume but misses him entirely. This"
                print "completely ruins his brand new costume his mother bought him, which"
                print "makes him fly into an insane rage and blast you repeatedly in the face until"
                print "you are dead. Then he eats you."
                return 'death'
            else:
                print "you won in this fight!"
                return "laser_weapon_armory"
        elif action == "dodge!":
            winer = super(CentralCorridor, self).fight()
            if winer == "Gthon":
                print "Like a world class boxer you dodge, weave, slip and slide right"
                print "as the Gothon's blaster cranks a laser past your head."
                print "In the middle of your artful dodge your foot slips and you"
                print "bang your head on the metal wall and pass out."
                print "You wake up shortly after only to die as the Gothon stomps on"
                print "your head and eats you."
                return 'death'
            else:
                print "you won in this fight!"
                return "laser_weapon_armory"
            
        elif action == "tell a joke":
            print "Lucky for you the made you learn Gothon insults in the academy."
            print "You tell the on Gothon joke you know:"
            print "Lbhe zbgur vf fb sng, jura fur fvgf nebhaq gur ubhfr, fur fvgv nebhaq gurubhfr."
            print "The Gothon stops, tries no to laugh, the busts out laughing and can't move."
            print "while he's laughing you run up and shoot him squqre in the head"
            print "putting him down, then jump through the Weapon Armory door."
            return 'laser_weapon_armory'
            
        else:
            print "DOES NOT COMPUTE!"
            return 'central_corridor'
        
class LaserWeaponArmory(Scene):

    def enter(self):
        #pass
        print "You do a dive roll into the Weapon Armory, crouch and scan the room"
        print "for more Gothons that might be hiding. It's dead quiet, too quiet."
        print "You stand up and run to the far side of the room and find the"
        print "neutron bomb in its container. There's a keypad lock on the box"
        print "and you need the code to get the bomb out. If you get the code"
        print "wrong 10 times then the lock closes forever and you can't"
        print "get the bomb. The code is 3 digits."
        code = "%d%d%d" % (randint(1, 9), randint(1, 9), randint(1, 9))
        print code
        guess = raw_input("[keypad]> ")
        guesses = 1
        
        while guess != code and guesses < 10:
            print "BZZZZEDDD!\a"
            guesses += 1
            guess = raw_input("[keypad]> ")
            
        if guess == code:
            print "The container clicks open and the seal breaks, letting gas out."
            print "You grab the neutron bomb and run as fast as you can to the"
            print "bridge where you must place it in the right spot."
            return 'the_bridge'
        else:
            print "The lock buzzes one last time and then you hear a sickening"
            print "melting sound as the mechanism is fused together."
            print "You decide to sit there, and finally the Gothons blow up the"
            print "ship from their ship and you die."
            return 'death'
        
        
class TheBridge(Scene):

    def enter(self):
        #pass
        print "You burst onto the Bridge with the netron destruct bomb"
        print "under your arm and surprise 5 Gothons who are trying to"
        print "take control of the ship. Each of them has an even uglier"
        print "clown costume than the last. They haven't pull ed their"
        print "weapons out yet, as they see the active bomb under your"
        print "arm and don't want to set it off."
        
        action = raw_input("> ")
        
        if action == "throw the bomb":
            print "In a panic you throw the bomb at the group of Gothons"
            print "and make a leap for the door. Right as you drop it a"
            print "Gothon shoots you right in the back killing you."
            print "As you die you see another Gothon frantically try to disarm"
            print "the bomb. You die knowing they will probably blow up when"
            print "it goes off."
            return 'death'
            
        elif action == "slowly place the bomb":
            print "You point your blaster at the bomb under your arm"
            print "and the Gothons put their hands up and start to sweat."
            print "You inch backward to the door, open it, and then carefully"
            print "place the bomb on the floor, pointing your blaster at it."
            print "You then jump back through the door, punch the close button"
            print "and blast the lock so the Gothons can't get out."
            print "Now that the bomb is placed you run to the escape pod to"
            print "get off this tin can."
            return 'escape_pod'
        else:
            print "DOES NOT COMPUTE!"
            return "the_bridge"
            
class EscapePod(Scene):

    def enter(self):
        #pass
        print "You rush through the ship desperately trying to make it to"
        print "the escape pod before the whole ship explodes. It seems like"
        print "hardly any Gothons are on the ship, so your run is clear of"
        print "interference. You get to the chamber with the escape pods, and"
        print "now need to pick one to take. Some of them could be damaged"
        print "but you don't have time to look. There's 5 pods,which one"
        print "do you take?"
        
        good_pod = randint(1, 5)
        print good_pod
        guess = raw_input("[pod #]> ")
        
        if int(guess) != good_pod:
            print "You jump into pod %s and hit the eject button. " % guess
            print "The pod escapes out into the void of space, the"
            print "implodes as the hull ruptures, crushing your body"
            print "into jam jelly."
            return 'death'
        else:
            print "You jump into pod %s and hit the eject button." % guess
            print "The pod easily slides out into space heading to"
            print "the planet below. As it flies to the planet, you look"
            print "back and see your ship implode then explode like a"
            print "bright star, taking out the Gothon ship at the same"
            print "time, You won!"
            
            return 'finished'
class Finished(Scene):
    
    def enter(self):
        print "You won! Good job."
        #return 'finished'
        
class Map(object):

    scenes = {
        'central_corridor' : CentralCorridor(),
        'laser_weapon_armory' : LaserWeaponArmory(),
        'the_bridge' : TheBridge(),
        'escape_pod' : EscapePod(),
        'death' : Death(),
        'finished' : Finished()
    }

    def __init__(self, start_scene):
        #pass
        self.start_scene = start_scene
        
    def next_scene(self, scene_name):
        #pass
        val = Map.scenes.get(scene_name)
        return val
        
    def opening_scene(self):
        #pass
        return self.next_scene(self.start_scene)
        
a_map = Map('central_corridor')
a_game = Engine(a_map)
a_game.play()

这段代码在powershell中运行的话,会出现这种乱码问题:

但是以下这段代码就不会出现乱码问题:

# -*- coding:utf-8 -*-
print '我想在这里%r输出一个单引号' % "'"
print "我想在这里%r输出一个双引号" % "\""
print '我想在这里%s输出一个单此号' % '\''
print "我想在这里%s输出一个双引号" % "\""

运行结果:

起初我以为是因为编辑的时候保存的编码格式不一样的问题。我就按第二个的改了一下

但是还是不行啊,求解~跪求。。。。。。。。。。。。。。。。。。

尝试用Python3.x,或者修改Powershell的字体吧。

把文件编码改成UTF-8试试?

我会说我把你这个游戏玩了一遍吗!哈哈哈</h3>

(看完/读完)这篇文章有何感想! 钱柜娱乐777的分享…

钱柜娱乐777关于豆瓣爬虫在ubuntu系统与windows上不同的问题。

( 钱柜娱乐777 )

在学习爬虫过程中我发现了一个问题。
我使用的系统是windows10,虚拟机用的ubuntu15.10。开始学习requests库
代码:

# coding:utf-8

import requests

r = requests.get("http://movie.douban.com/subject/24751756/")
print(r.text)

在ubuntu下会正常的出现当前的界面,windows下是403错误。

我觉得在ubuntu下不正常,因为我没有填加http的头。
希望大家可以帮忙解释一下。

import requests
import httplib

httplib.HTTPConnecttion.debuglevel=1

r = requests.get("http://movie.douban.com/subject/24751756/")
print r.text

在我的机器下(OS X)跑,也是403,

由send的header头里面可以看出来User-Agent是python-requests,所以把User-Agent改成

headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKi \
                    t/537.36 (KHTML, like Gecko) Chrome/47.0.2526.73 Safari/537.36'
}

r = requests.get("http://movie.douban.com/subject/24751756/", headers=headers)

再次请求就成功了。

试着用httplib打印出调试信息,对比下两个平台的发送请求的数据是否一样

(看完/读完)这篇文章有何感想! 钱柜娱乐777的分享…

钱柜777老虎机用PyV8来将js转python时,如何提取js中的json数据

( 钱柜777老虎机 )

当拿取jsObject中的json数据时(var_scene1.bgAudio),拿到的信息为空(希望拿到{“url”:”a/b/c/d/e.mp3″,”name”:”aaa.mp3″})。
应该用什么办法获取?
谢谢

import PyV8

str_scene2 = """
var scene = {id:123321,bgAudio:{"url":"a/b/c/d/e.mp3","name":"aaa.mp3"}};
"""

s1 = str_scene2.decode('utf-8')
with PyV8.JSContext() as env1:
    env1.eval(s1)
    vars = env1.locals
    var_scene1 = vars.scene
    print var_scene1.id

    print var_scene1.bgAudio  # it shows [object Object]
    print type(var_scene1.bgAudio)  # it shows <class '_PyV8.JSObject'>

(看完/读完)这篇文章有何感想! 钱柜777老虎机的分享…

钱柜娱乐777iter迭代无线循环错误

( 钱柜娱乐777 )

我在阅读werkzeug中实现的flask Header类的时候,碰到了这个装饰器。

def native_itermethods(names):

    def setmethod(cls, name):
        itermethod = getattr(cls, name)
        setattr(cls, 'iter%s' % name, itermethod)
        listmethod = lambda self, *a, **kw: list(itermethod(self, *a, **kw))
        listmethod.__doc__ = \
            'Like:py:meth:`iter%s`, but returns a list.' % name
        setattr(cls, name, listmethod)

    def wrap(cls):
        for name in names:
            setmethod(cls, name)
        return cls
    return wrap

这部分代码会对该类下创建一个iter开头的方法。比如get会创建出一个iterget。并把原来的get的返回值改为迭代iterget的列表。这是我理解的如果有错误请指正。

我想要对上边的装饰器进行测试验证以下是我的代码

iterget = lambda d, *arg, **kw: d.iterget(*arg, **kw)

@native_itermethods(['get'])
class A(object):

    def __init__(self):
        self._names = [('mink', '123'), ('kk', '1211')]

    def __iter__(self):
        yield iter(self._names)

    def get(self, name):
        for key, value in iterget(self):
            if key == name:
                yield key, value
                
if __name__ == '__main__':
    a = A()
    print dir(a)
    print a.get('mink')

按照我的理解上面装饰器的结果应该返回一个元组列表,但是会爆出以下错误

是我例子写错了么还是,我对上述代码没有理解对。

首先是这个不是无限循环,而是递归超过了栈深度。

在 native_itermethods 里面,会把外面的A.get放在作为A对象iterget方法,并且用list(A.iterget)覆盖原来的A.get。在你的A.get定义里面,由于A.get已经调用了A.iterget,这其实就会是自身调用自身,会无限的递归下去,从而导致栈溢出错误。

这个函数的目的主要是方便把对象里原来的迭代器方法的名字变成itername,然后让原来的名字返回一个list后的结果。

(看完/读完)这篇文章有何感想! 钱柜娱乐777的分享…

钱柜娱乐777flask views的问题

( 钱柜娱乐777 )

flask 里面一个页面就要写一个view 函数来处理 有没有好的办法省略些,不用写那么多的view处理函数

使用变量路由规则, 自己内部增加判断

通过把 URL 的一部分标记为 <variable_name> 就可以在 URL 中添加变量。标记的 部分会作为关键字参数传递给函数。通过使用 <converter:variable_name> ,可以 选择性的加上一个转换器,为变量指定规则。请看下面的例子:

@app.route('/user/<username>')
def show_user_profile(username):
    # show the user profile for that user
    return 'User %s' % username

@app.route('/post/<int:post_id>')
def show_post(post_id):
    # show the post with the given id, the id is an integer
    return 'Post %d' % post_id
    
现有的转换器有:
int    接受整数
float  接受浮点数
path   和缺省情况相同,但也接受斜杠

楼上的方法只是说,相同的需求让你通过动态url来操作函数去拿到这个请求然后处理。
的确可以达到少写view函数的目的。

楼主问题并不是很清楚。

(看完/读完)这篇文章有何感想! 钱柜娱乐777的分享…

钱柜777写代码为什么总是出现这种奇怪的现象?

( 钱柜777 )

之前代码里有一句alert(发布成功)这样的话 我明明已经删除了 为什么还是弹出来这个呢
还有我写好的页面为了备份 把写好的1.php和2.php的代码都复制出来然后再新建5.php和6.php文件复制进去 为什么6.php里面我写的跳转页面还是跳到1.php里面呢 我明明写的是跳转到5.php啊 这是为什么啊 老是这样 真是气死了 谁能帮帮我啊

代码如下 我电脑上还有一个3.php 明明5.php和6.php和3.php没任何关系啊 为什么提交内容后却总是跳转到3.php上 我把3.php的页面删除了 却又跳转到blog.php的地址上
而且我提交内容后再去数据库查看 并没有显示有数据插入
5.php如下

<?php
header ( " Pragma: no-cache " );
$pdo=new PDO("mysql:host=localhost;dbname=t1","root","");
 $sth=$pdo->query('select * from blog2');
 $result = $sth->fetchall(PDO::FETCH_ASSOC);
 foreach($result as $v){
    echo $v['type'];
    echo $v['content'];
 };
?>
<html>
<head>
<style type="text/css">
</style>
</head>
<body>
    <div id="main">
            <form action="blog.php" method="post">
                <select name="select">
                  <option>请选择</option>
                  <option>111</option>
                  <option>222</option>
                  <option>333</option>
                  <option>444</option>
                </select>
                <input type="text" name="name">
                <input type="text" name="num">
                <textarea id="txt1" name="content" style="width: 200px;height: 200px">        
                </textarea><br />
                <button type="submit">提交</button>
            </form>
    </div>
</body>
</html>

6.php如下


<?php
header ( " Pragma: no-cache " );
 $pdo=new PDO("mysql:host=localhost;dbname=t1","root","");
 $pdo->exec("INSERT INTO blog2 (type,name,num,content)  VALUES ('$_POST[select]','$_POST[name]','$_POST[num]','$_POST[content]')");
 header("location:http://localhost/blog5.php");
?>

alert那个应该是浏览器缓存的原因

之前代码里有一句alert(发布成功)这样的话 我明明已经删除了 为什么还是弹出来这个呢

是因为你没刷新浏览器么?

还有我写好的页面为了备份 把写好的1.php和2.php的代码都复制出来然后再新建5.php和6.php文件复制进去 为什么6.php里面我写的跳转页面还是跳到1.php里面呢 我明明写的是跳转到5.php啊 这是为什么啊 老是这样 真是气死了 谁能帮帮我啊

正如楼上所说,问题都没描述清除。show me your code

  • 没有代码我也帮不了你。你以为文字可以说明情况,其实并不行

  • 请勿情绪化。这里不欢迎吐槽

该答案已被忽略,原因:宜作评论而非答案

(看完/读完)这篇文章有何感想! 钱柜777的分享…

钱柜777老虎机php redis做mysql的缓存,怎么异步redis同步到mysql数据库?

( 钱柜777老虎机 )

公司做抽奖或者红包活动,总有人恶意大访问量请求,查询mysql去做重复验证在大并发上限制不住,总会有重复插入,会造成多发奖品。
想用redis做mysql的缓存,但是现在遇到的问题是如何把redis的数据写回mysql,不可能每次校验的时候就写回mysql,那样的话根本没有解决问题。
现在的想法是能否利用php,或者其他什么技术,定时将redis中的数据写回mysql。程序只与redis交互。
希望能给出具体的逻辑或者解决方案,网上的回答都太笼统了,根本解决不了问题。

谢谢。

1月16日补充:
我问题描述的不太清晰。
我把遇到的问题详细的说一下吧,并不是发奖时候脏读的问题,而是判断这个人是否有机会抽奖。
有一个抽奖的表,如果这个人抽过奖了,就在表中插入一条记录。
目前的实现方式是:

1.读取抽奖表判断这个人是否抽过奖
2.如果表中有记录,那就是抽过了,直接告诉没机会
3.如果表中没有记录,走抽奖逻辑,然后插入抽奖表

正常情况下是没有问题的,
但是有人用恶意脚本进行刷奖,也就是同一个人发起大量请求,1秒可能一两百的请求甚至更多,而且不只一个人刷奖。
问题出在1这一步
举个例子,假设每人只能抽一次奖,因为请求太快,同一人的a,b两个请求几乎同时来,a走完抽奖逻辑了,并且在抽奖表中插入记录的过程时,因为mysql的性能的问题,b去走1这一步是读不到表中的记录的,因为a的插入根本没有完成。所以b请求会再走一次抽奖逻辑。造成同一人抽奖两次,然后再插入抽奖表。
我关心的是能否a插入抽奖表的瞬间,b就能判断出抽奖表有数据。
所以我觉得问题是mysql写入的不够快,读取的不够快,所以我要采用redis做一层快速缓存。
我们做的抽奖是单一奖品百分之百中奖,只限制奖品数量,所以必须保证每人只能抽一次,而且尽量在程序层面去解决。


1月20日补充
看了大家的回答很受启发,非常感谢。
至于有人提到并发没想象的那么大这件事,是这样的,我们的服务器是阿里云单台的ECS,配置4核8G 独享50m宽带,centos,只做对外活动。

这是12月24号上线的一个不到4小时活动的抽奖活动的浏览量。


这是当时TCP连接数的监控

抽奖不同于网站访问,这些参与者基本绝大多数是同一时间段来访问服务器。我个人觉得在服务器配置不升级的情况下,软件层面的优化完全能扛住这些访问。我目前觉得瓶颈在mysql。

题主你之所以会出现这么多问题,是因为你思路混乱,根本没搞清楚这些问题到底是怎么回事,并且得病后还自己乱下药。

1.【总有人恶意大访问量请求】,这是系统安全问题,你需要做的是防攻击。

2.【查询mysql去做重复验证在大并发上限制不住】:这是功能缺失。既然有缺失,就立即做新功能研发。

3.【总会有重复插入,会造成多发奖品】:这是已有系统的Bug,需要通过调试来修正问题。

综上,这些问题与redis有什么关系?

可以考虑crontab跑定时任务 执行php脚本去写入 或者跑守护进程去写

先简单的意淫一下题主的问题。

查询mysql去做重复验证在大并发上限制不住,总会有重复插入

我想题主这个原因主要是因为,需要把某些信息从数据库查出来,然后再比较,最后插入数据库吧?所以这里有可能出现脏读的问题。所以题主是否可以考虑一下实现方式,通过数据库的乐观锁来控制呢?

想用redismysql的缓存

题主用redis的原因,是因为有数据的重复插入,所以我想题主是想使用redis的原子操作吧?我觉得这个出发点不是很正确,不能因为直接使用数据库有重复数据,就使用redis。因为这个因果关系看上去有点蛋疼,我觉得首先得解决的是为什么会有重复数据插入。至于什么时候要用redis,应该是业务量(QPS)太大导致数据库撑不住才考虑使用缓存。

redis的数据写回mysql

题主想隔断时间把redis的数据更新回mysql,利用@BUBBAK 的方法确实是可行的,通过一个定时任务,定时的把数据刷回数据库。但是假设,仅仅是假设,如果redis挂掉了,恰好数据没有刷回数据库,这就会造成数据丢失(这里并先不考虑redis的持久化)。
还有一种方式就是,直接修改缓存的数据,然后起一个单独的线程去修改数据库的数据,这样的好处就是如果缓存挂掉,数据库的数据还是可靠的,但是这样的缺点是,如果并发量很高,就会起很多子线程把缓存刷回数据库,这样对系统是有开销的而且会造成CPU的负载变高。

最后题主可以参考
如何设计高并发下的抽奖?下我的回答。
如果有什么其它的想法,大家可以一起再讨论讨论。

redis中有个setnx(),这个操作是原子性的。首先可以通过在redis记录每个ip的请求时间,去判断该ip是否请求过快(这种形式又可能误伤,可能某个公司是同一个出口ip)。其次判断每个人是否抽过奖可以存在redis中啊,如果在redis中查不到该用户抽奖的标志就说明没有抽过奖,然后将该用户在redis中标记已经抽过奖了,然后在将该记录插入数据中即可。再说楼主这个只是在公司内部用,这种形式完全撑的住。

我感觉就是读脏数据的问题,楼主希望判断是否抽奖,抽奖逻辑,写抽奖表,这个过程中不能有第二相同用户来抽奖,实际上这个过程中,抽奖逻辑肯定要占大部分时间,至少要执行一次生成随机数的操作吧,在这个过程中,还没写表,所以其他请求读取数据库显示自己还没抽奖能够走抽奖逻辑。我的想法是第一步执行后加一个行锁,第三步执行后再释放这个锁,防止在这个过程中再有请求读取数据。本人愚见,若有错漏,望指点

我有过类似的问题。我的解决办法是:

  1. 用redis存储当前用户的session,包括ip,账号,电邮地址

  2. 在表单里面, 根据当前用户的session,生成一个form的验证码(有时间戳),以type=’hidden’的形式存在。

  3. 在用户提交表单后:

    a) 先验证提交的隐藏验证码是否属于当前用户(不需要连接后台,根据已知的session来判定)
    b) 然后先搜索当前用户的session是否存在抽奖动作(不需要连接后台,根据已知的session来判定)
    c) 如果当前用户通过 a) 的验证后, 在 b)里面没有抽奖动作就证明该用户之前没有抽奖过,那么就添加一个抽奖动作为true. 如果当前用户通过 a) 的验证后,在 b) 里面有发现抽奖动作为true。就返回以抽奖页面。 也就是说c)跟b)是互相定义, 互相监督的。
    
  4. 在通过3的验证后,再开始抽奖程序。

  5. 在抽奖之后可以验证奖品存货量。(这一步可以在开始做,或者不做,看具体情况)

注意:

  1. 个人来说不赞成锁定数据库,这样会让程序变慢,对大多数用户来说不友好。毕竟会有情况真的是大量真实的抽奖请求出现,锁定数据库会让效能大大降低。

  2. 通过1,2,3的设置,可以屏蔽单IP短时间重复抽奖的问题。当然如果对方牛逼到能短时间内换IP+重复更换登陆用户+刷新页面生成不同的session,那你的程序绝对有重大逻辑错误,只能灭了重写了。

抽奖记录表的用户名称即openid和抽奖版本字段做一个uniqu唯一索引不就行了

1.读取抽奖表判断这个人是否抽过奖
2.如果表中有记录,那就是抽过了,直接告诉没机会
3.如果表中没有记录,走抽奖逻辑,然后插入抽奖表

你这里逻辑错了,应该是先执行向抽奖表的插入操作,抽奖表通过唯一索引限制每用户唯一,创建成功在执行实际的发奖动作,失败表示已经抽过奖了,直接返回已抽奖完事。

加 redis 缓存的话可以在 redis 里面增加用户是否已抽奖的标记,实际抽奖流程是:
1.检查 redis 是否有用户已抽奖的标志
2.在 redis 设置用户已抽奖标志
3.插入抽奖记录(通过唯一索引限制每用户唯一),奖项为空
4.插入失败表示已抽过奖,插入成功表示可以抽奖
5.进行抽奖,写入中间结果,发奖

就用redis就行,在redis中存

KEY(用户唯一标识) —-> VALUE(0/1)
0: 未抽奖,1:以抽奖

只要

  1. 判断KEY(用户唯一标识)的VALUE是0还是1

  2. 是0返回,未抽奖,并赋值VALUE为1

  3. 其他返回,以抽奖

以上3步是事务操作/原子操作,管你并发量破亿还是百亿,我们都吼得住。

假使有一个人同时发起了1000个请求1,2,3,…m…,999,1000。其中请求m略快一些被服务器先处理,m在执行上述3步时,其他999个只能眼巴巴的看着,因为是原子操作 等m被处理完了,其他999各只能看到1,即已抽过奖了

那么问题来了,在redis中如何实现上述3步的原子操作那?

答案是:redis的lua脚步,redis规定:redis的lua脚本的执行是原子性的

假使初始化时,所有用户的唯一标示对应的value都是0,下面给一个lua脚本实例

local uid = KEYS[1]
local res = 1
local isDraw = redis.call('get', uid)
if isDraw == 0 then
    res = 0
    redis.call('set', uid, 1)
end
return res

这里只是一个不成熟的简单例子,可以参考 http://www.redis.cn/commands/eval.html 这里看看具体该如何写,思路就是这样

PS:一定记得做好redis的备份工作,要不断电了,就悲哀了呀!!

https://segmentfault.com/a/1190000004136250

利用php redis简单抗高并发。另外,这种情况建议参考我的另一篇文章,防单ip恶意提交攻击,这个可以做个单ip限制。

1.看一下数据,日均流量和峰值流量,不要有迫害妄想症,真是每次搞活动都被人搞的话,呵呵,恭喜了,你们是下一个阿里巴巴。
2.平时有没有反作弊、限流机制,策略是啥,对你解决这个问题有无帮助?
3.为啥用Redis不是memcache之类的?你要用Redis的队列?丰富的数据结构?还是备份?请忽略上面提到的crontab…
4.mysql写入、读取不够快…,你这个结论怎么得出的,预估的每秒读取、写入请求多少?

可以使用memcache的独占锁

简单点就加锁,虽然会损失点性能

我这边是用redis锁,加一个记录,生存时间5秒,同一用户5秒请求1次. 进来就检测,如果没到时间直接返回一个提示消息就行了.
redis可以保证操作是原子性的,memcache不能.既然已经用了redis,那正好用下去就行了.

我觉得读写都可以在 Redis 中进行,使用 Redis 来维护这个『抽奖记录』。后台使用定时程序(最好不要用 crontab,自己使用定时器更好,有异常也可以有记录、报警),定期将 Redis 的数据备份、存储。此时,要不要入 MySQL,看具体业务上的需要了。

如果对数据可靠性要求很高,或者单表数量非常高,也可以考虑直接使用 MongoDB 来存储这个『抽奖记录』。使用 MongoDB Sharding 的话,10亿条记录以下基本问题不大。而且数据是存储于磁盘的,相比 Redis,健壮性更好。不过,如果使用 sharding 环境(其实千万条记录左右,我以为 Repl 就足够了),最好注意一下唯一性索引的使用。详情可以参考 MongoDB 的官方文档。

ls的应该都说的很清楚了。
1.防攻击:redis枷锁类似防重复提交。
2.加版本号和用户id建唯一索引。不过数据量大数据库应该压力大,频发抛异常
3.将控制用户只抽一次 交给redis,这样还可以通过redis有效期控制抽奖周期。

用乐观锁控制写入mysql,同时写入redis。
为了应对大量的 “新抽奖” ,用队列抗一下。
查询记录首先从redis查询,redis没有再回源到mysql去查。
mysql读写分离。
另外简单的防刷还是要做的,比如用户、ip限制,验证码等等。
恩就这样。

mysql行级锁 不要全表锁

每秒几百个请求mysql就受不了了,我只能说要么机子配置实在是太差,要么代码写得太差

如果有用户ID可以这样做:
1、每人一个key:前缀:用户ID
2、抽奖时incr这个key,返回1则正常执行抽奖,否则中断

调用完redis后,用fastcgi_finish_request()这个函数,后面该怎么写mysql的处理就怎么写,执行完fastcgi_finish_request()后会返回响应的,进程不会结束,会把后面的程序处理完。

楼主应该充分利用redis的优势哦。
阅读完,我觉得楼主的第一步就错了,把是否抽奖放在mysql来读取,这个mysql是扛不住的。用redis的原子操作就轻松搞定了。因为第一步错了,所以后面不得不用很多其他措施来弥补。

要是我 我直接在 NGINX 成面上干掉大部分流量

(看完/读完)这篇文章有何感想! 钱柜777老虎机的分享…

钱柜777老虎机php7.0.2 安装完 pthreads 后报错

( 钱柜777老虎机 )

系统使用的Centos6.6, 除了Mysql都是使用的编译安装
启动php-fpm时候报错如下:

Starting php-fpm [18-Jan-2016 18:09:29] NOTICE: PHP message: PHP Fatal error:  The fpm-fcgi SAPI is not supported by pthreads in Unknown on line 0
[18-Jan-2016 18:09:29] NOTICE: PHP message: PHP Fatal error:  Unable to start pthreads module in Unknown on line 0

The fpm-fcgi SAPI is not supported by pthreads

支持 PHP 7 的 pthreads v3 只支持通过 cli 命令行来调用,不支持其他的 sapi

如何通过cli调用?有例子吗?谢谢

(看完/读完)这篇文章有何感想! 钱柜777老虎机的分享…

钱柜777php7不支持mysql扩展,如何使用mysqlnd?

( 钱柜777 )

我在windows7下使用php7和mysql,启用mysql扩展的时候发现ext下只有php_pdo_mysql和php_mysqli。同时发现没有mysql_*函数,查找资料说是使用mysqlnd驱动。

这样算是已经装好mysqlnd了吗? 然后我该怎么使用。谢谢

首先纠正一个问题,

5.x开始,PHP连接MYSQL无论使用哪种方式都是使用的mysqlnd驱动(当然是在你安装好的时候)。包括mysql_*PDO_MYSQLMYSQLi

--with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd 而不再是 --with-mysqli=/usr/local/mysql

  • PHP7 正式移除了 mysql 扩展

mysqlndmysql mysqli pdo_mysql关系打比方说 mysqlnd金属,而mysql mysqli pdo_mysql只是金属制品而已

使用PDO连接mysql

$pdo = new PDO('mysql:host=localhost;dbname=database_name;port=3306','用户名','密码');
$pdo->exec('set names utf8');

$stmt = $pdo->prepare("select * from table where id =:id");
$stmt->bindValue(':id',1,PDO::PARAM_INT);
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

$rows = $pdo->query("select * from table where id = 1")->fetchAll(PDO::FETCH_ASSOC);

php7中mysql扩展被彻底移除,为了更好的向后兼容性,请使用PDO;
你这意境算是装好了,可以参考手册用PDO连接数据库

请多点使用PDO吧, 里面有面向对象的思想,更好用

本来不想答的。。。。刚刚正愁着怎么把老项目里的mysql换成pdo就看到这个。。。。楼主,PDO你值得拥有

(看完/读完)这篇文章有何感想! 钱柜777的分享…