在4.4
以前的版本中,Swoole
一直不支持CURL
協程化,在代碼中沒法使用curl
。因爲curl
使用了libcurl
庫實現,沒法直接hook
它的socket
,4.4
版本使用Swoole\Coroutine\Http\Client
模擬實現了curl
的API
,並在底層替換了curl_init
等函數的C Handler
。php
CURL Hook
的特性尚處於試驗階段,請勿在生產環境中直接使用CURL Multi
curl
,請務必安裝curl
擴展
通過驗證
Guzzle CURL
徹底能夠使用
使用Runtime::enableCoroutine
來開啓CURL Hook
。shell
默認不開啓
CURL Hook
Swoole\Runtime::enableCoroutine(SWOOLE_HOOK_ALL); Swoole\Runtime::enableCoroutine(SWOOLE_HOOK_CURL);
$n = 10; while($n--) { go(function () { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://www.xinhuanet.com/"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); $output = curl_exec($ch); if ($output === FALSE) { echo "CURL Error:" . curl_error($ch); } curl_close($ch); echo strlen($output) . " bytes\n"; }); }
要將上面兩段代碼合併到一個文件中執行
htf@LAPTOP-0K15EFQI:~/swoole-src/examples$ time php curl.php 177173 bytes 177173 bytes 177173 bytes 177173 bytes 177173 bytes 177173 bytes 177173 bytes 177173 bytes 177173 bytes 177173 bytes real 0m0.534s user 0m0.031s sys 0m0.297s
能夠看到整個程序是並行的,進程沒有任何阻塞。swoole
使用strace
跟蹤發現,全部系統調用均變成epoll
+socket
的異步非阻塞調用了。curl
epoll_create(512) = 3 mmap(NULL, 258048, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc038a50000 mmap(NULL, 2101248, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc028910000 socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC, IPPROTO_IP) = 4 fcntl(4, F_GETFL) = 0x80002 (flags O_RDWR|O_CLOEXEC) fcntl(4, F_SETFL, O_RDWR|O_NONBLOCK|O_CLOEXEC) = 0 setsockopt(4, SOL_TCP, TCP_NODELAY, [1], 4) = 0 pipe([5, 6]) = 0 fcntl(5, F_GETFL) = 0 (flags O_RDONLY) fcntl(5, F_SETFL, O_RDONLY|O_NONBLOCK) = 0 fcntl(6, F_GETFL) = 0x1 (flags O_WRONLY) fcntl(6, F_SETFL, O_WRONLY|O_NONBLOCK) = 0 epoll_ctl(3, EPOLL_CTL_ADD, 5, {EPOLLIN, {u32=5, u64=34359738373}}) = 0 mmap(NULL, 8392704, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fc028100000 mprotect(0x7fc028101000, 8388608, PROT_READ|PROT_WRITE) = 0 clone(child_stack=0x7fc0288ffb70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fc0289009d0, tls=0x7fc028900700, child_tidptr=0x7fc0289009d0) = 55 mmap(NULL, 8392704, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fc0237f0000 mprotect(0x7fc0237f1000, 8388608, PROT_READ|PROT_WRITE) = 0 clone(child_stack=0x7fc023fefb70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fc023ff09d0, tls=0x7fc023ff0700, child_tidptr=0x7fc023ff09d0) = 56 mmap(NULL, 8392704, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fc022fe0000 mprotect(0x7fc022fe1000, 8388608, PROT_READ|PROT_WRITE) = 0 clone(child_stack=0x7fc0237dfb70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fc0237e09d0, tls=0x7fc0237e0700, child_tidptr=0x7fc0237e09d0) = 57 mmap(NULL, 8392704, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fc0227d0000 mprotect(0x7fc0227d1000, 8388608, PROT_READ|PROT_WRITE) = 0 clone(child_stack=0x7fc022fcfb70, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fc022fd09d0, tls=0x7fc022fd0700, child_tidptr=0x7fc022fd09d0) = 58 futex(0x7fffd9e01ce0, FUTEX_WAKE_PRIVATE, 1) = 1 clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=513190000}) = 0 clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=513408000}) = 0 mmap(NULL, 2101248, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc0225c0000 socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC, IPPROTO_IP) = 8 fcntl(8, F_GETFL) = 0x80002 (flags O_RDWR|O_CLOEXEC) fcntl(8, F_SETFL, O_RDWR|O_NONBLOCK|O_CLOEXEC) = 0 setsockopt(8, SOL_TCP, TCP_NODELAY, [1], 4) = 0 futex(0x7fffd9e01ce0, FUTEX_WAKE_PRIVATE, 1) = 1 clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=514359000}) = 0 mmap(NULL, 2101248, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc0223b0000 socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC, IPPROTO_IP) = 10 fcntl(10, F_GETFL) = 0x80002 (flags O_RDWR|O_CLOEXEC) fcntl(10, F_SETFL, O_RDWR|O_NONBLOCK|O_CLOEXEC) = 0 setsockopt(10, SOL_TCP, TCP_NODELAY, [1], 4) = 0 futex(0x7fffd9e01ce0, FUTEX_WAKE_PRIVATE, 1) = 1 clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=515961000}) = 0 mmap(NULL, 2101248, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc0221a0000 socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC, IPPROTO_IP) = 9 fcntl(9, F_GETFL) = 0x80002 (flags O_RDWR|O_CLOEXEC) fcntl(9, F_SETFL, O_RDWR|O_NONBLOCK|O_CLOEXEC) = 0 setsockopt(9, SOL_TCP, TCP_NODELAY, [1], 4) = 0 futex(0x7fffd9e01ce4, FUTEX_WAKE_PRIVATE, 1) = 1 clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=517822000}) = 0 mmap(NULL, 2101248, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc021f90000 socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC, IPPROTO_IP) = 7 fcntl(7, F_GETFL) = 0x80002 (flags O_RDWR|O_CLOEXEC) fcntl(7, F_SETFL, O_RDWR|O_NONBLOCK|O_CLOEXEC) = 0 setsockopt(7, SOL_TCP, TCP_NODELAY, [1], 4) = 0 clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=520138000}) = 0 mmap(NULL, 2101248, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc021b60000 socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC, IPPROTO_IP) = 11 fcntl(11, F_GETFL) = 0x80002 (flags O_RDWR|O_CLOEXEC) fcntl(11, F_SETFL, O_RDWR|O_NONBLOCK|O_CLOEXEC) = 0 setsockopt(11, SOL_TCP, TCP_NODELAY, [1], 4) = 0 clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=521400000}) = 0 mmap(NULL, 2101248, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc021950000 socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC, IPPROTO_IP) = 12 fcntl(12, F_GETFL) = 0x80002 (flags O_RDWR|O_CLOEXEC) fcntl(12, F_SETFL, O_RDWR|O_NONBLOCK|O_CLOEXEC) = 0 setsockopt(12, SOL_TCP, TCP_NODELAY, [1], 4) = 0 clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=523446000}) = 0 mmap(NULL, 2101248, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc021530000 socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC, IPPROTO_IP) = 17 fcntl(17, F_GETFL) = 0x80002 (flags O_RDWR|O_CLOEXEC) fcntl(17, F_SETFL, O_RDWR|O_NONBLOCK|O_CLOEXEC) = 0 setsockopt(17, SOL_TCP, TCP_NODELAY, [1], 4) = 0 clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=524631000}) = 0 mmap(NULL, 2101248, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc021320000 socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC, IPPROTO_IP) = 18 fcntl(18, F_GETFL) = 0x80002 (flags O_RDWR|O_CLOEXEC) fcntl(18, F_SETFL, O_RDWR|O_NONBLOCK|O_CLOEXEC) = 0 setsockopt(18, SOL_TCP, TCP_NODELAY, [1], 4) = 0 clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=525903000}) = 0 mmap(NULL, 2101248, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc021110000 socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC, IPPROTO_IP) = 19 fcntl(19, F_GETFL) = 0x80002 (flags O_RDWR|O_CLOEXEC) fcntl(19, F_SETFL, O_RDWR|O_NONBLOCK|O_CLOEXEC) = 0 setsockopt(19, SOL_TCP, TCP_NODELAY, [1], 4) = 0 clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=527295000}) = 0 epoll_wait(3, [{EPOLLIN, {u32=5, u64=34359738373}}], 4096, 1000) = 1 read(5, "0T\340\331\377\177\0\0", 1024) = 8 time(NULL) = 1559698600 (2019-06-05T09:36:40+0800) connect(8, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("123.125.76.136")}, 16) = -1 EINPROGRESS (Operation now in progress) clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=636297000}) = 0 epoll_ctl(3, EPOLL_CTL_ADD, 8, {EPOLLOUT, {u32=8, u64=38654705672}}) = 0 clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=638815000}) = 0 time(NULL) = 1559698600 (2019-06-05T09:36:40+0800) brk(0x7fffd9e19000) = 0x7fffd9e19000 epoll_wait(3, [{EPOLLIN, {u32=5, u64=34359738373}}], 4096, 875) = 1 read(5, "\0u\333\331\377\177\0\0\20g\341\331\377\177\0\0\200W\340\331\377\177\0\0", 1024) = 24 time(NULL) = 1559698600 (2019-06-05T09:36:40+0800) connect(4, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("123.125.76.136")}, 16) = -1 EINPROGRESS (Operation now in progress) clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=643393000}) = 0 epoll_ctl(3, EPOLL_CTL_ADD, 4, {EPOLLOUT, {u32=4, u64=38654705668}}) = 0 time(NULL) = 1559698600 (2019-06-05T09:36:40+0800) connect(9, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("123.125.76.136")}, 16) = -1 EINPROGRESS (Operation now in progress) clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=647077000}) = 0 epoll_ctl(3, EPOLL_CTL_ADD, 9, {EPOLLOUT, {u32=9, u64=38654705673}}) = 0 time(NULL) = 1559698600 (2019-06-05T09:36:40+0800) connect(10, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("123.125.76.136")}, 16) = -1 EINPROGRESS (Operation now in progress) clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=648967000}) = 0 epoll_ctl(3, EPOLL_CTL_ADD, 10, {EPOLLOUT, {u32=10, u64=38654705674}}) = 0 clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=649672000}) = 0 time(NULL) = 1559698600 (2019-06-05T09:36:40+0800) epoll_wait(3, [{EPOLLOUT, {u32=8, u64=38654705672}}], 4096, 870) = 1 epoll_ctl(3, EPOLL_CTL_DEL, 8, NULL) = 0 getsockopt(8, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 brk(0x7fffd9e49000) = 0x7fffd9e49000 sendto(8, "GET / HTTP/1.1\r\nHost: www.xinhua"..., 90, 0, NULL, 0) = 90 recvfrom(8, 0x7fffd9e28c70, 65536, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable) epoll_ctl(3, EPOLL_CTL_ADD, 8, {EPOLLIN, {u32=8, u64=38654705672}}) = 0 clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=655130000}) = 0 time(NULL) = 1559698600 (2019-06-05T09:36:40+0800) epoll_wait(3, [{EPOLLIN, {u32=5, u64=34359738373}}, {EPOLLOUT, {u32=4, u64=38654705668}}, {EPOLLOUT, {u32=9, u64=38654705673}}], 4096, 865) = 3 read(5, "\360l\341\331\377\177\0\0", 1024) = 8 time(NULL) = 1559698600 (2019-06-05T09:36:40+0800) connect(7, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("123.125.76.136")}, 16) = -1 EINPROGRESS (Operation now in progress) clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=657746000}) = 0 epoll_ctl(3, EPOLL_CTL_ADD, 7, {EPOLLOUT, {u32=7, u64=38654705671}}) = 0 epoll_ctl(3, EPOLL_CTL_DEL, 4, NULL) = 0 getsockopt(4, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 sendto(4, "GET / HTTP/1.1\r\nHost: www.xinhua"..., 90, 0, NULL, 0) = 90 brk(0x7fffd9e79000) = 0x7fffd9e79000 recvfrom(4, 0x7fffd9e48c90, 65536, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable) epoll_ctl(3, EPOLL_CTL_ADD, 4, {EPOLLIN, {u32=4, u64=38654705668}}) = 0 epoll_ctl(3, EPOLL_CTL_DEL, 9, NULL) = 0 getsockopt(9, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 sendto(9, "GET / HTTP/1.1\r\nHost: www.xinhua"..., 90, 0, NULL, 0) = 90 recvfrom(9, 0x7fffd9e68cb0, 65536, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable) epoll_ctl(3, EPOLL_CTL_ADD, 9, {EPOLLIN, {u32=9, u64=38654705673}}) = 0 clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=662268000}) = 0 time(NULL) = 1559698600 (2019-06-05T09:36:40+0800) epoll_wait(3, [{EPOLLIN, {u32=5, u64=34359738373}}, {EPOLLOUT, {u32=10, u64=38654705674}}, {EPOLLOUT, {u32=7, u64=38654705671}}], 4096, 859) = 3 read(5, "P~\341\331\377\177\0\0\320r\341\331\377\177\0\0px\341\331\377\177\0\0", 1024) = 24 time(NULL) = 1559698600 (2019-06-05T09:36:40+0800) connect(17, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("123.125.76.136")}, 16) = -1 EINPROGRESS (Operation now in progress) clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=664547000}) = 0 epoll_ctl(3, EPOLL_CTL_ADD, 17, {EPOLLOUT, {u32=17, u64=38654705681}}) = 0 time(NULL) = 1559698600 (2019-06-05T09:36:40+0800) connect(11, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("123.125.76.136")}, 16) = -1 EINPROGRESS (Operation now in progress) clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=665490000}) = 0 epoll_ctl(3, EPOLL_CTL_ADD, 11, {EPOLLOUT, {u32=11, u64=38654705675}}) = 0 time(NULL) = 1559698600 (2019-06-05T09:36:40+0800) connect(12, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("123.125.76.136")}, 16) = -1 EINPROGRESS (Operation now in progress) clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=667097000}) = 0 epoll_ctl(3, EPOLL_CTL_ADD, 12, {EPOLLOUT, {u32=12, u64=38654705676}}) = 0 epoll_ctl(3, EPOLL_CTL_DEL, 10, NULL) = 0 getsockopt(10, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 brk(0x7fffd9ea9000) = 0x7fffd9ea9000 sendto(10, "GET / HTTP/1.1\r\nHost: www.xinhua"..., 90, 0, NULL, 0) = 90 recvfrom(10, 0x7fffd9e88cd0, 65536, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable) epoll_ctl(3, EPOLL_CTL_ADD, 10, {EPOLLIN, {u32=10, u64=38654705674}}) = 0 epoll_ctl(3, EPOLL_CTL_DEL, 7, NULL) = 0 getsockopt(7, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 sendto(7, "GET / HTTP/1.1\r\nHost: www.xinhua"..., 90, 0, NULL, 0) = 90 brk(0x7fffd9ed9000) = 0x7fffd9ed9000 recvfrom(7, 0x7fffd9ea8cf0, 65536, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable) epoll_ctl(3, EPOLL_CTL_ADD, 7, {EPOLLIN, {u32=7, u64=38654705671}}) = 0 clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=670626000}) = 0 time(NULL) = 1559698600 (2019-06-05T09:36:40+0800) epoll_wait(3, [{EPOLLIN, {u32=5, u64=34359738373}}, {EPOLLOUT, {u32=17, u64=38654705681}}, {EPOLLOUT, {u32=11, u64=38654705675}}], 4096, 855) = 3 read(5, "\20\212\341\331\377\177\0\0000\204\341\331\377\177\0\0", 1024) = 16 time(NULL) = 1559698600 (2019-06-05T09:36:40+0800) connect(19, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("123.125.76.136")}, 16) = -1 EINPROGRESS (Operation now in progress) clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=672183000}) = 0 epoll_ctl(3, EPOLL_CTL_ADD, 19, {EPOLLOUT, {u32=19, u64=38654705683}}) = 0 time(NULL) = 1559698600 (2019-06-05T09:36:40+0800) connect(18, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("123.125.76.136")}, 16) = -1 EINPROGRESS (Operation now in progress) clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=672576000}) = 0 epoll_ctl(3, EPOLL_CTL_ADD, 18, {EPOLLOUT, {u32=18, u64=38654705682}}) = 0 epoll_ctl(3, EPOLL_CTL_DEL, 17, NULL) = 0 getsockopt(17, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 sendto(17, "GET / HTTP/1.1\r\nHost: www.xinhua"..., 90, 0, NULL, 0) = 90 recvfrom(17, 0x7fffd9ec8d10, 65536, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable) epoll_ctl(3, EPOLL_CTL_ADD, 17, {EPOLLIN, {u32=17, u64=38654705681}}) = 0 epoll_ctl(3, EPOLL_CTL_DEL, 11, NULL) = 0 getsockopt(11, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 brk(0x7fffd9f09000) = 0x7fffd9f09000 sendto(11, "GET / HTTP/1.1\r\nHost: www.xinhua"..., 90, 0, NULL, 0) = 90 recvfrom(11, 0x7fffd9ee8d30, 65536, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable) epoll_ctl(3, EPOLL_CTL_ADD, 11, {EPOLLIN, {u32=11, u64=38654705675}}) = 0 clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=674303000}) = 0 time(NULL) = 1559698600 (2019-06-05T09:36:40+0800) epoll_wait(3, [{EPOLLOUT, {u32=12, u64=38654705676}}], 4096, 992) = 1 epoll_ctl(3, EPOLL_CTL_DEL, 12, NULL) = 0 getsockopt(12, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 sendto(12, "GET / HTTP/1.1\r\nHost: www.xinhua"..., 90, 0, NULL, 0) = 90 brk(0x7fffd9f39000) = 0x7fffd9f39000 recvfrom(12, 0x7fffd9f08d50, 65536, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable) epoll_ctl(3, EPOLL_CTL_ADD, 12, {EPOLLIN, {u32=12, u64=38654705676}}) = 0 clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=687389000}) = 0 time(NULL) = 1559698600 (2019-06-05T09:36:40+0800) epoll_wait(3, [{EPOLLOUT, {u32=19, u64=38654705683}}, {EPOLLOUT, {u32=18, u64=38654705682}}], 4096, 984) = 2 epoll_ctl(3, EPOLL_CTL_DEL, 19, NULL) = 0 getsockopt(19, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 sendto(19, "GET / HTTP/1.1\r\nHost: www.xinhua"..., 90, 0, NULL, 0) = 90 recvfrom(19, 0x7fffd9f28d70, 65536, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable) epoll_ctl(3, EPOLL_CTL_ADD, 19, {EPOLLIN, {u32=19, u64=38654705683}}) = 0 epoll_ctl(3, EPOLL_CTL_DEL, 18, NULL) = 0 getsockopt(18, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 brk(0x7fffd9f69000) = 0x7fffd9f69000 sendto(18, "GET / HTTP/1.1\r\nHost: www.xinhua"..., 90, 0, NULL, 0) = 90 recvfrom(18, 0x7fffd9f48d90, 65536, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable) epoll_ctl(3, EPOLL_CTL_ADD, 18, {EPOLLIN, {u32=18, u64=38654705682}}) = 0 clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=694225000}) = 0 time(NULL) = 1559698600 (2019-06-05T09:36:40+0800) epoll_wait(3, [{EPOLLIN, {u32=4, u64=38654705668}}], 4096, -1) = 1 epoll_ctl(3, EPOLL_CTL_DEL, 4, NULL) = 0 recvfrom(4, "HTTP/1.1 200 OK\r\nContent-Type: t"..., 65536, 0, NULL, NULL) = 4096 recvfrom(4, 0x7fffd9e48c90, 65536, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable) epoll_ctl(3, EPOLL_CTL_ADD, 4, {EPOLLIN, {u32=4, u64=38654705668}}) = 0 clock_gettime(CLOCK_MONOTONIC, {tv_sec=237, tv_nsec=399093000}) = 0 time(NULL) = 1559698604 (2019-06-05T09:36:44+0800) brk(0x7fffd9f59000) = 0x7fffd9f59000 epoll_wait(3, [{EPOLLIN, {u32=4, u64=38654705668}}], 4096, -1) = 1 epoll_ctl(3, EPOLL_CTL_DEL, 4, NULL) = 0 recvfrom(4, "V{\362b4\236\22\331\350H\357\313\374\314s\372N\3257\324\16\n\257\24H\217y\376\204P\3\206"..., 65536, 0, NULL, NULL) = 8192 recvfrom(4, 0x7fffd9e48c90, 65536, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable) epoll_ctl(3, EPOLL_CTL_ADD, 4, {EPOLLIN, {u32=4, u64=38654705668}}) = 0 clock_gettime(CLOCK_MONOTONIC, {tv_sec=237, tv_nsec=460756000}) = 0 time(NULL) = 1559698604 (2019-06-05T09:36:44+0800) epoll_wait(3, [{EPOLLIN, {u32=4, u64=38654705668}}], 4096, -1) = 1 epoll_ctl(3, EPOLL_CTL_DEL, 4, NULL) = 0 recvfrom(4, "\374\346{V\311\306\246|0F\276\337\0\370`\22\224\7\253\312\306\200\262~\374\250\20'\317\233w\r"..., 65536, 0, NULL, NULL) = 8192 recvfrom(4, 0x7fffd9e48c90, 65536, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable) epoll_ctl(3, EPOLL_CTL_ADD, 4, {EPOLLIN, {u32=4, u64=38654705668}}) = 0 clock_gettime(CLOCK_MONOTONIC, {tv_sec=237, tv_nsec=465855000}) = 0 time(NULL) = 1559698604 (2019-06-05T09:36:44+0800) epoll_wait(3, [{EPOLLIN, {u32=4, u64=38654705668}}], 4096, -1) = 1 epoll_ctl(3, EPOLL_CTL_DEL, 4, NULL) = 0 recvfrom(4, "\3442@o\362\340\10\240#\337=J2=\274\337\201\307=3O\324\342\35s7\\\16\7^\"\23"..., 65536, 0, NULL, NULL) = 19559 brk(0x7fffd9f99000) = 0x7fffd9f99000 close(4) = 0 write(1, "177115 bytes\n", 13) = 13 munmap(0x7fc028910000, 2101248) = 0 clock_gettime(CLOCK_MONOTONIC, {tv_sec=237, tv_nsec=479677000}) = 0 time(NULL) = 1559698604 (2019-06-05T09:36:44+0800) epoll_wait(3, [{EPOLLIN, {u32=9, u64=38654705673}}, {EPOLLIN, {u32=7, u64=38654705671}}, {EPOLLIN, {u32=17, u64=38654705681}}, {EPOLLIN, {u32=11, u64=38654705675}}], 4096, -1) = 4 epoll_ctl(3, EPOLL_CTL_DEL, 9, NULL) = 0 recvfrom(9, "HTTP/1.1 200 OK\r\nContent-Type: t"..., 65536, 0, NULL, NULL) = 4096 recvfrom(9, 0x7fffd9e68cb0, 65536, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable) epoll_ctl(3, EPOLL_CTL_ADD, 9, {EPOLLIN, {u32=9, u64=38654705673}}) = 0 epoll_ctl(3, EPOLL_CTL_DEL, 7, NULL) = 0 recvfrom(7, "HTTP/1.1 200 OK\r\nContent-Type: t"..., 65536, 0, NULL, NULL) = 4096 recvfrom(7, "V{\362b4\236\22\331\350H\357\313\374\314s\372N\3257\324\16\n\257\24H\217y\376\204P\3\206"..., 65536, 0, NULL, NULL) = 4096 recvfrom(7, 0x7fffd9ea8cf0, 65536, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable) epoll_ctl(3, EPOLL_CTL_ADD, 7, {EPOLLIN, {u32=7, u64=38654705671}}) = 0 epoll_ctl(3, EPOLL_CTL_DEL, 17, NULL) = 0 recvfrom(17, "HTTP/1.1 200 OK\r\nContent-Type: t"..., 65536, 0, NULL, NULL) = 8192 recvfrom(17, 0x7fffd9ec8d10, 65536, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable) epoll_ctl(3, EPOLL_CTL_ADD, 17, {EPOLLIN, {u32=17, u64=38654705681}}) = 0 epoll_ctl(3, EPOLL_CTL_DEL, 11, NULL) = 0 recvfrom(11, "HTTP/1.1 200 OK\r\nContent-Type: t"..., 65536, 0, NULL, NULL) = 8192 recvfrom(11, 0x7fffd9ee8d30, 65536, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable) epoll_ctl(3, EPOLL_CTL_ADD, 11, {EPOLLIN, {u32=11, u64=38654705675}}) = 0 clock_gettime(CLOCK_MONOTONIC, {tv_sec=238, tv_nsec=747275000}) = 0 time(NULL) = 1559698606 (2019-06-05T09:36:46+0800) madvise(0x7fffd9dcd000, 61440, MADV_DONTNEED) = 0 madvise(0x7fffd9e39000, 126976, MADV_DONTNEED) = 0 epoll_wait(3, [{EPOLLIN, {u32=8, u64=38654705672}}, {EPOLLIN, {u32=10, u64=38654705674}}, {EPOLLIN, {u32=12, u64=38654705676}}, {EPOLLIN, {u32=19, u64=38654705683}}, {EPOLLIN, {u32=18, u64=38654705682}}, {EPOLLIN, {u32=9, u64=38654705673}}, {EPOLLIN, {u32=7, u64=38654705671}}, {EPOLLIN, {u32=17, u64=38654705681}}], 4096, -1) = 8 epoll_ctl(3, EPOLL_CTL_DEL, 8, NULL) = 0 recvfrom(8, "HTTP/1.1 200 OK\r\nContent-Type: t"..., 65536, 0, NULL, NULL) = 20480 recvfrom(8, 0x7fffd9e28c70, 65536, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable) epoll_ctl(3, EPOLL_CTL_ADD, 8, {EPOLLIN, {u32=8, u64=38654705672}}) = 0 epoll_ctl(3, EPOLL_CTL_DEL, 10, NULL) = 0 recvfrom(10, "HTTP/1.1 200 OK\r\nContent-Type: t"..., 65536, 0, NULL, NULL) = 12288 recvfrom(10, 0x7fffd9e88cd0, 65536, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable) epoll_ctl(3, EPOLL_CTL_ADD, 10, {EPOLLIN, {u32=10, u64=38654705674}}) = 0 epoll_ctl(3, EPOLL_CTL_DEL, 12, NULL) = 0 recvfrom(12, "HTTP/1.1 200 OK\r\nContent-Type: t"..., 65536, 0, NULL, NULL) = 20480 recvfrom(12, 0x7fffd9f08d50, 65536, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable) epoll_ctl(3, EPOLL_CTL_ADD, 12, {EPOLLIN, {u32=12, u64=38654705676}}) = 0 epoll_ctl(3, EPOLL_CTL_DEL, 19, NULL) = 0 recvfrom(19, "HTTP/1.1 200 OK\r\nContent-Type: t"..., 65536, 0, NULL, NULL) = 20480 recvfrom(19, 0x7fffd9f28d70, 65536, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable) epoll_ctl(3, EPOLL_CTL_ADD, 19, {EPOLLIN, {u32=19, u64=38654705683}}) = 0 epoll_ctl(3, EPOLL_CTL_DEL, 18, NULL) = 0 recvfrom(18, "HTTP/1.1 200 OK\r\nContent-Type: t"..., 65536, 0, NULL, NULL) = 20480 recvfrom(18, 0x7fffd9f48d90, 65536, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable) epoll_ctl(3, EPOLL_CTL_ADD, 18, {EPOLLIN, {u32=18, u64=38654705682}}) = 0 epoll_ctl(3, EPOLL_CTL_DEL, 9, NULL) = 0 recvfrom(9, "V{\362b4\236\22\331\350H\357\313\374\314s\372N\3257\324\16\n\257\24H\217y\376\204P\3\206"..., 65536, 0, NULL, NULL) = 29504 recvfrom(9, "\23\1_\243'\240C\301\37649\31\314\255\236\344f\22\305_\357hojll0FS\240\t\254"..., 65536, 0, NULL, NULL) = 6439 close(9) = 0 write(1, "177115 bytes\n", 13) = 13 munmap(0x7fc0221a0000, 2101248) = 0 epoll_ctl(3, EPOLL_CTL_DEL, 7, NULL) = 0 recvfrom(7, "3\231\3\372\375\"\271e\271cZ\343bb\251\331\314\227\323L\257\224\311\324\335\276(D\323\341\242\31"..., 65536, 0, NULL, NULL) = 31847 close(7) = 0 write(1, "177115 bytes\n", 13) = 13 munmap(0x7fc021f90000, 2101248) = 0 epoll_ctl(3, EPOLL_CTL_DEL, 17, NULL) = 0 recvfrom(17, "3\231\3\372\375\"\271e\271cZ\343bb\251\331\314\227\323L\257\224\311\324\335\276(D\323\341\242\31"..., 65536, 0, NULL, NULL) = 31847 close(17) = 0 write(1, "177115 bytes\n", 13) = 13 munmap(0x7fc021530000, 2101248) = 0 clock_gettime(CLOCK_MONOTONIC, {tv_sec=238, tv_nsec=783851000}) = 0 time(NULL) = 1559698606 (2019-06-05T09:36:46+0800) epoll_wait(3, [{EPOLLIN, {u32=11, u64=38654705675}}, {EPOLLIN, {u32=8, u64=38654705672}}, {EPOLLIN, {u32=10, u64=38654705674}}, {EPOLLIN, {u32=12, u64=38654705676}}, {EPOLLIN, {u32=19, u64=38654705683}}, {EPOLLIN, {u32=18, u64=38654705682}}], 4096, -1) = 6 epoll_ctl(3, EPOLL_CTL_DEL, 11, NULL) = 0 recvfrom(11, "3\231\3\372\375\"\271e\271cZ\343bb\251\331\314\227\323L\257\224\311\324\335\276(D\323\341\242\31"..., 65536, 0, NULL, NULL) = 31847 close(11) = 0 write(1, "177115 bytes\n", 13) = 13 munmap(0x7fc021b60000, 2101248) = 0 epoll_ctl(3, EPOLL_CTL_DEL, 8, NULL) = 0 recvfrom(8, "\3442@o\362\340\10\240#\337=J2=\274\337\201\307=3O\324\342\35s7\\\16\7^\"\23"..., 65536, 0, NULL, NULL) = 19559 close(8) = 0 write(1, "177115 bytes\n", 13) = 13 munmap(0x7fc0225c0000, 2101248) = 0 epoll_ctl(3, EPOLL_CTL_DEL, 10, NULL) = 0 recvfrom(10, "\374\346{V\311\306\246|0F\276\337\0\370`\22\224\7\253\312\306\200\262~\374\250\20'\317\233w\r"..., 65536, 0, NULL, NULL) = 27751 close(10) = 0 write(1, "177115 bytes\n", 13) = 13 munmap(0x7fc0223b0000, 2101248) = 0 epoll_ctl(3, EPOLL_CTL_DEL, 12, NULL) = 0 recvfrom(12, "\3442@o\362\340\10\240#\337=J2=\274\337\201\307=3O\324\342\35s7\\\16\7^\"\23"..., 65536, 0, NULL, NULL) = 19559 close(12) = 0 write(1, "177115 bytes\n", 13) = 13 munmap(0x7fc021950000, 2101248) = 0 epoll_ctl(3, EPOLL_CTL_DEL, 19, NULL) = 0 recvfrom(19, "\3442@o\362\340\10\240#\337=J2=\274\337\201\307=3O\324\342\35s7\\\16\7^\"\23"..., 65536, 0, NULL, NULL) = 19559 close(19) = 0 write(1, "177115 bytes\n", 13) = 13 munmap(0x7fc021110000, 2101248) = 0 epoll_ctl(3, EPOLL_CTL_DEL, 18, NULL) = 0 recvfrom(18, "\3442@o\362\340\10\240#\337=J2=\274\337\201\307=3O\324\342\35s7\\\16\7^\"\23"..., 65536, 0, NULL, NULL) = 19559 close(18) = 0 write(1, "177115 bytes\n", 13) = 13 munmap(0x7fc021320000, 2101248) = 0 clock_gettime(CLOCK_MONOTONIC, {tv_sec=238, tv_nsec=802835000}) = 0 time(NULL) = 1559698606 (2019-06-05T09:36:46+0800) futex(0x7fffd9e01ce0, FUTEX_WAKE_PRIVATE, 2147483647) = 4 futex(0x7fffd9e01c90, FUTEX_WAKE_PRIVATE, 1) = 1 futex(0x7fc023ff09d0, FUTEX_WAIT, 56, NULL) = -1 EAGAIN (Resource temporarily unavailable) epoll_ctl(3, EPOLL_CTL_DEL, 5, NULL) = 0 close(5) = 0 close(6) = 0 close(2) = 0 close(1) = 0 close(0) = 0 munmap(0x7fc028fa0000, 2231560) = 0 munmap(0x7fc028d1f000, 2624568) = 0 close(3) = 0