import socket,struct,time,threading
def enc(p):
    r=b''
    for k,v in p.items():
        for b in (k.encode(),v.encode()):
            if len(b)<128: r+=struct.pack('B',len(b))
            else: r+=struct.pack('!I',len(b)|0x80000000)
        r+=k.encode()+v.encode()
    return r
def req(sf,extra=None):
    p={'GATEWAY_INTERFACE':'CGI/1.1','REQUEST_METHOD':'GET','SCRIPT_FILENAME':sf,'SCRIPT_NAME':'/x.php','REQUEST_URI':'/x.php','QUERY_STRING':'','SERVER_PROTOCOL':'HTTP/1.1','REMOTE_ADDR':'127.0.0.1','SERVER_NAME':'localhost','SERVER_PORT':'80','SERVER_ADDR':'127.0.0.1','REDIRECT_STATUS':'200','DOCUMENT_ROOT':'/','HTTP_HOST':'localhost'}
    if extra: p.update(extra)
    begin=struct.pack('!BBHH',1,1,1,8)+struct.pack('!HB',1,0)+b'\x00'*5
    pd=enc(p)
    out=begin+struct.pack('!BBHH',1,4,1,len(pd))+pd+struct.pack('!BBHH',1,4,1,0)+struct.pack('!BBHH',1,5,1,0)
    s=socket.create_connection(('127.0.0.1',9000),4)
    s.sendall(out)
    s.settimeout(6)
    try:
        data=b''
        while True:
            c=s.recv(65536)
            if not c: break
            data+=c
        print('RESP',repr(sf),'=>',repr(data[:400]))
    except Exception as e:
        print('RESP',repr(sf),'=> EXC',e)
    finally:
        s.close()
def wstat():
    for pid in ['1411','1414','1415','1416','1417','12667']:
        try:
            st=open('/proc/'+pid+'/stat').read().split(')')[1]
            f=st.split()
            print('worker',pid,'state',f[0],'utime',f[11],'kstime',f[12])
        except Exception as e:
            print(pid,e)
print('before:')
wstat()
for sf in ['/tmp/nonexistent.php','/usr/share/phpMyAdmin/index.php','/tmp/t1.php','/var/www/html/index.php']:
    t=threading.Thread(target=req,args=(sf,))
    t.start(); time.sleep(0.8); print('during req',sf); wstat(); t.join()
time.sleep(1); print('after:')
wstat()
