资讯专栏INFORMATION COLUMN

Swoole 4.4:支持 CURL 协程化

RobinTang / 1782人阅读

摘要:在之前的版本中,一直不支持协程化,在代码中无法使用。由于使用了库实现,无法直接它的,版本使用模拟实现了的,并在底层替换了等函数的。跟踪使用跟踪发现,所有系统调用均变成的异步非阻塞调用了。

4.4之前的版本中,Swoole一直不支持CURL协程化,在代码中无法使用curl。由于curl使用了libcurl库实现,无法直接hook它的socket4.4版本使用SwooleCoroutineHttpClient模拟实现了curlAPI,并在底层替换了curl_init等函数的C Handler

提示

CURL Hook的特性尚处于试验阶段,请勿在生产环境中直接使用

暂不支持文件上传、CURL Multi

仍然需要依赖curl,请务必安装curl扩展

支持的特性列表

GET/POST

Header

Cookie

Https

</>复制代码

  1. 经过验证Guzzle CURL完全可以使用
开启

使用Runtime::enableCoroutine来开启CURL Hook

</>复制代码

  1. 默认不开启CURL Hook

</>复制代码

  1. SwooleRuntime::enableCoroutine(SWOOLE_HOOK_ALL);
  2. SwooleRuntime::enableCoroutine(SWOOLE_HOOK_CURL);
使用

</>复制代码

  1. $n = 10;
  2. while($n--) {
  3. go(function () {
  4. $ch = curl_init();
  5. curl_setopt($ch, CURLOPT_URL, "http://www.xinhuanet.com/");
  6. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  7. curl_setopt($ch, CURLOPT_HEADER, 0);
  8. $output = curl_exec($ch);
  9. if ($output === FALSE) {
  10. echo "CURL Error:" . curl_error($ch);
  11. }
  12. curl_close($ch);
  13. echo strlen($output) . " bytes
  14. ";
  15. });
  16. }

</>复制代码

  1. 要将上面两段代码合并到一个文件中执行
运行结果

</>复制代码

  1. htf@LAPTOP-0K15EFQI:~/swoole-src/examples$ time php curl.php
  2. 177173 bytes
  3. 177173 bytes
  4. 177173 bytes
  5. 177173 bytes
  6. 177173 bytes
  7. 177173 bytes
  8. 177173 bytes
  9. 177173 bytes
  10. 177173 bytes
  11. 177173 bytes
  12. real 0m0.534s
  13. user 0m0.031s
  14. sys 0m0.297s

可以看到整个程序是并行的,进程没有任何阻塞。

strace 跟踪

使用strace跟踪发现,所有系统调用均变成epoll+socket的异步非阻塞调用了。

</>复制代码

  1. epoll_create(512) = 3
  2. mmap(NULL, 258048, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc038a50000
  3. mmap(NULL, 2101248, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc028910000
  4. socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC, IPPROTO_IP) = 4
  5. fcntl(4, F_GETFL) = 0x80002 (flags O_RDWR|O_CLOEXEC)
  6. fcntl(4, F_SETFL, O_RDWR|O_NONBLOCK|O_CLOEXEC) = 0
  7. setsockopt(4, SOL_TCP, TCP_NODELAY, [1], 4) = 0
  8. pipe([5, 6]) = 0
  9. fcntl(5, F_GETFL) = 0 (flags O_RDONLY)
  10. fcntl(5, F_SETFL, O_RDONLY|O_NONBLOCK) = 0
  11. fcntl(6, F_GETFL) = 0x1 (flags O_WRONLY)
  12. fcntl(6, F_SETFL, O_WRONLY|O_NONBLOCK) = 0
  13. epoll_ctl(3, EPOLL_CTL_ADD, 5, {EPOLLIN, {u32=5, u64=34359738373}}) = 0
  14. mmap(NULL, 8392704, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fc028100000
  15. mprotect(0x7fc028101000, 8388608, PROT_READ|PROT_WRITE) = 0
  16. 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
  17. mmap(NULL, 8392704, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fc0237f0000
  18. mprotect(0x7fc0237f1000, 8388608, PROT_READ|PROT_WRITE) = 0
  19. 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
  20. mmap(NULL, 8392704, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fc022fe0000
  21. mprotect(0x7fc022fe1000, 8388608, PROT_READ|PROT_WRITE) = 0
  22. 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
  23. mmap(NULL, 8392704, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fc0227d0000
  24. mprotect(0x7fc0227d1000, 8388608, PROT_READ|PROT_WRITE) = 0
  25. 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
  26. futex(0x7fffd9e01ce0, FUTEX_WAKE_PRIVATE, 1) = 1
  27. clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=513190000}) = 0
  28. clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=513408000}) = 0
  29. mmap(NULL, 2101248, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc0225c0000
  30. socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC, IPPROTO_IP) = 8
  31. fcntl(8, F_GETFL) = 0x80002 (flags O_RDWR|O_CLOEXEC)
  32. fcntl(8, F_SETFL, O_RDWR|O_NONBLOCK|O_CLOEXEC) = 0
  33. setsockopt(8, SOL_TCP, TCP_NODELAY, [1], 4) = 0
  34. futex(0x7fffd9e01ce0, FUTEX_WAKE_PRIVATE, 1) = 1
  35. clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=514359000}) = 0
  36. mmap(NULL, 2101248, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc0223b0000
  37. socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC, IPPROTO_IP) = 10
  38. fcntl(10, F_GETFL) = 0x80002 (flags O_RDWR|O_CLOEXEC)
  39. fcntl(10, F_SETFL, O_RDWR|O_NONBLOCK|O_CLOEXEC) = 0
  40. setsockopt(10, SOL_TCP, TCP_NODELAY, [1], 4) = 0
  41. futex(0x7fffd9e01ce0, FUTEX_WAKE_PRIVATE, 1) = 1
  42. clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=515961000}) = 0
  43. mmap(NULL, 2101248, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc0221a0000
  44. socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC, IPPROTO_IP) = 9
  45. fcntl(9, F_GETFL) = 0x80002 (flags O_RDWR|O_CLOEXEC)
  46. fcntl(9, F_SETFL, O_RDWR|O_NONBLOCK|O_CLOEXEC) = 0
  47. setsockopt(9, SOL_TCP, TCP_NODELAY, [1], 4) = 0
  48. futex(0x7fffd9e01ce4, FUTEX_WAKE_PRIVATE, 1) = 1
  49. clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=517822000}) = 0
  50. mmap(NULL, 2101248, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc021f90000
  51. socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC, IPPROTO_IP) = 7
  52. fcntl(7, F_GETFL) = 0x80002 (flags O_RDWR|O_CLOEXEC)
  53. fcntl(7, F_SETFL, O_RDWR|O_NONBLOCK|O_CLOEXEC) = 0
  54. setsockopt(7, SOL_TCP, TCP_NODELAY, [1], 4) = 0
  55. clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=520138000}) = 0
  56. mmap(NULL, 2101248, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc021b60000
  57. socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC, IPPROTO_IP) = 11
  58. fcntl(11, F_GETFL) = 0x80002 (flags O_RDWR|O_CLOEXEC)
  59. fcntl(11, F_SETFL, O_RDWR|O_NONBLOCK|O_CLOEXEC) = 0
  60. setsockopt(11, SOL_TCP, TCP_NODELAY, [1], 4) = 0
  61. clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=521400000}) = 0
  62. mmap(NULL, 2101248, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc021950000
  63. socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC, IPPROTO_IP) = 12
  64. fcntl(12, F_GETFL) = 0x80002 (flags O_RDWR|O_CLOEXEC)
  65. fcntl(12, F_SETFL, O_RDWR|O_NONBLOCK|O_CLOEXEC) = 0
  66. setsockopt(12, SOL_TCP, TCP_NODELAY, [1], 4) = 0
  67. clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=523446000}) = 0
  68. mmap(NULL, 2101248, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc021530000
  69. socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC, IPPROTO_IP) = 17
  70. fcntl(17, F_GETFL) = 0x80002 (flags O_RDWR|O_CLOEXEC)
  71. fcntl(17, F_SETFL, O_RDWR|O_NONBLOCK|O_CLOEXEC) = 0
  72. setsockopt(17, SOL_TCP, TCP_NODELAY, [1], 4) = 0
  73. clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=524631000}) = 0
  74. mmap(NULL, 2101248, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc021320000
  75. socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC, IPPROTO_IP) = 18
  76. fcntl(18, F_GETFL) = 0x80002 (flags O_RDWR|O_CLOEXEC)
  77. fcntl(18, F_SETFL, O_RDWR|O_NONBLOCK|O_CLOEXEC) = 0
  78. setsockopt(18, SOL_TCP, TCP_NODELAY, [1], 4) = 0
  79. clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=525903000}) = 0
  80. mmap(NULL, 2101248, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc021110000
  81. socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC, IPPROTO_IP) = 19
  82. fcntl(19, F_GETFL) = 0x80002 (flags O_RDWR|O_CLOEXEC)
  83. fcntl(19, F_SETFL, O_RDWR|O_NONBLOCK|O_CLOEXEC) = 0
  84. setsockopt(19, SOL_TCP, TCP_NODELAY, [1], 4) = 0
  85. clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=527295000}) = 0
  86. epoll_wait(3, [{EPOLLIN, {u32=5, u64=34359738373}}], 4096, 1000) = 1
  87. read(5, "0T340331377177", 1024) = 8
  88. time(NULL) = 1559698600 (2019-06-05T09:36:40+0800)
  89. 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)
  90. clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=636297000}) = 0
  91. epoll_ctl(3, EPOLL_CTL_ADD, 8, {EPOLLOUT, {u32=8, u64=38654705672}}) = 0
  92. clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=638815000}) = 0
  93. time(NULL) = 1559698600 (2019-06-05T09:36:40+0800)
  94. brk(0x7fffd9e19000) = 0x7fffd9e19000
  95. epoll_wait(3, [{EPOLLIN, {u32=5, u64=34359738373}}], 4096, 875) = 1
  96. read(5, "u33333137717720g341331377177200W340331377177", 1024) = 24
  97. time(NULL) = 1559698600 (2019-06-05T09:36:40+0800)
  98. 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)
  99. clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=643393000}) = 0
  100. epoll_ctl(3, EPOLL_CTL_ADD, 4, {EPOLLOUT, {u32=4, u64=38654705668}}) = 0
  101. time(NULL) = 1559698600 (2019-06-05T09:36:40+0800)
  102. 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)
  103. clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=647077000}) = 0
  104. epoll_ctl(3, EPOLL_CTL_ADD, 9, {EPOLLOUT, {u32=9, u64=38654705673}}) = 0
  105. time(NULL) = 1559698600 (2019-06-05T09:36:40+0800)
  106. 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)
  107. clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=648967000}) = 0
  108. epoll_ctl(3, EPOLL_CTL_ADD, 10, {EPOLLOUT, {u32=10, u64=38654705674}}) = 0
  109. clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=649672000}) = 0
  110. time(NULL) = 1559698600 (2019-06-05T09:36:40+0800)
  111. epoll_wait(3, [{EPOLLOUT, {u32=8, u64=38654705672}}], 4096, 870) = 1
  112. epoll_ctl(3, EPOLL_CTL_DEL, 8, NULL) = 0
  113. getsockopt(8, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
  114. brk(0x7fffd9e49000) = 0x7fffd9e49000
  115. sendto(8, "GET / HTTP/1.1
  116. Host: www.xinhua"..., 90, 0, NULL, 0) = 90
  117. recvfrom(8, 0x7fffd9e28c70, 65536, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
  118. epoll_ctl(3, EPOLL_CTL_ADD, 8, {EPOLLIN, {u32=8, u64=38654705672}}) = 0
  119. clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=655130000}) = 0
  120. time(NULL) = 1559698600 (2019-06-05T09:36:40+0800)
  121. epoll_wait(3, [{EPOLLIN, {u32=5, u64=34359738373}}, {EPOLLOUT, {u32=4, u64=38654705668}}, {EPOLLOUT, {u32=9, u64=38654705673}}], 4096, 865) = 3
  122. read(5, "360l341331377177", 1024) = 8
  123. time(NULL) = 1559698600 (2019-06-05T09:36:40+0800)
  124. 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)
  125. clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=657746000}) = 0
  126. epoll_ctl(3, EPOLL_CTL_ADD, 7, {EPOLLOUT, {u32=7, u64=38654705671}}) = 0
  127. epoll_ctl(3, EPOLL_CTL_DEL, 4, NULL) = 0
  128. getsockopt(4, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
  129. sendto(4, "GET / HTTP/1.1
  130. Host: www.xinhua"..., 90, 0, NULL, 0) = 90
  131. brk(0x7fffd9e79000) = 0x7fffd9e79000
  132. recvfrom(4, 0x7fffd9e48c90, 65536, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
  133. epoll_ctl(3, EPOLL_CTL_ADD, 4, {EPOLLIN, {u32=4, u64=38654705668}}) = 0
  134. epoll_ctl(3, EPOLL_CTL_DEL, 9, NULL) = 0
  135. getsockopt(9, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
  136. sendto(9, "GET / HTTP/1.1
  137. Host: www.xinhua"..., 90, 0, NULL, 0) = 90
  138. recvfrom(9, 0x7fffd9e68cb0, 65536, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
  139. epoll_ctl(3, EPOLL_CTL_ADD, 9, {EPOLLIN, {u32=9, u64=38654705673}}) = 0
  140. clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=662268000}) = 0
  141. time(NULL) = 1559698600 (2019-06-05T09:36:40+0800)
  142. epoll_wait(3, [{EPOLLIN, {u32=5, u64=34359738373}}, {EPOLLOUT, {u32=10, u64=38654705674}}, {EPOLLOUT, {u32=7, u64=38654705671}}], 4096, 859) = 3
  143. read(5, "P~341331377177320r341331377177px341331377177", 1024) = 24
  144. time(NULL) = 1559698600 (2019-06-05T09:36:40+0800)
  145. 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)
  146. clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=664547000}) = 0
  147. epoll_ctl(3, EPOLL_CTL_ADD, 17, {EPOLLOUT, {u32=17, u64=38654705681}}) = 0
  148. time(NULL) = 1559698600 (2019-06-05T09:36:40+0800)
  149. 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)
  150. clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=665490000}) = 0
  151. epoll_ctl(3, EPOLL_CTL_ADD, 11, {EPOLLOUT, {u32=11, u64=38654705675}}) = 0
  152. time(NULL) = 1559698600 (2019-06-05T09:36:40+0800)
  153. 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)
  154. clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=667097000}) = 0
  155. epoll_ctl(3, EPOLL_CTL_ADD, 12, {EPOLLOUT, {u32=12, u64=38654705676}}) = 0
  156. epoll_ctl(3, EPOLL_CTL_DEL, 10, NULL) = 0
  157. getsockopt(10, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
  158. brk(0x7fffd9ea9000) = 0x7fffd9ea9000
  159. sendto(10, "GET / HTTP/1.1
  160. Host: www.xinhua"..., 90, 0, NULL, 0) = 90
  161. recvfrom(10, 0x7fffd9e88cd0, 65536, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
  162. epoll_ctl(3, EPOLL_CTL_ADD, 10, {EPOLLIN, {u32=10, u64=38654705674}}) = 0
  163. epoll_ctl(3, EPOLL_CTL_DEL, 7, NULL) = 0
  164. getsockopt(7, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
  165. sendto(7, "GET / HTTP/1.1
  166. Host: www.xinhua"..., 90, 0, NULL, 0) = 90
  167. brk(0x7fffd9ed9000) = 0x7fffd9ed9000
  168. recvfrom(7, 0x7fffd9ea8cf0, 65536, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
  169. epoll_ctl(3, EPOLL_CTL_ADD, 7, {EPOLLIN, {u32=7, u64=38654705671}}) = 0
  170. clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=670626000}) = 0
  171. time(NULL) = 1559698600 (2019-06-05T09:36:40+0800)
  172. epoll_wait(3, [{EPOLLIN, {u32=5, u64=34359738373}}, {EPOLLOUT, {u32=17, u64=38654705681}}, {EPOLLOUT, {u32=11, u64=38654705675}}], 4096, 855) = 3
  173. read(5, "20212341331377177000204341331377177", 1024) = 16
  174. time(NULL) = 1559698600 (2019-06-05T09:36:40+0800)
  175. 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)
  176. clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=672183000}) = 0
  177. epoll_ctl(3, EPOLL_CTL_ADD, 19, {EPOLLOUT, {u32=19, u64=38654705683}}) = 0
  178. time(NULL) = 1559698600 (2019-06-05T09:36:40+0800)
  179. 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)
  180. clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=672576000}) = 0
  181. epoll_ctl(3, EPOLL_CTL_ADD, 18, {EPOLLOUT, {u32=18, u64=38654705682}}) = 0
  182. epoll_ctl(3, EPOLL_CTL_DEL, 17, NULL) = 0
  183. getsockopt(17, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
  184. sendto(17, "GET / HTTP/1.1
  185. Host: www.xinhua"..., 90, 0, NULL, 0) = 90
  186. recvfrom(17, 0x7fffd9ec8d10, 65536, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
  187. epoll_ctl(3, EPOLL_CTL_ADD, 17, {EPOLLIN, {u32=17, u64=38654705681}}) = 0
  188. epoll_ctl(3, EPOLL_CTL_DEL, 11, NULL) = 0
  189. getsockopt(11, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
  190. brk(0x7fffd9f09000) = 0x7fffd9f09000
  191. sendto(11, "GET / HTTP/1.1
  192. Host: www.xinhua"..., 90, 0, NULL, 0) = 90
  193. recvfrom(11, 0x7fffd9ee8d30, 65536, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
  194. epoll_ctl(3, EPOLL_CTL_ADD, 11, {EPOLLIN, {u32=11, u64=38654705675}}) = 0
  195. clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=674303000}) = 0
  196. time(NULL) = 1559698600 (2019-06-05T09:36:40+0800)
  197. epoll_wait(3, [{EPOLLOUT, {u32=12, u64=38654705676}}], 4096, 992) = 1
  198. epoll_ctl(3, EPOLL_CTL_DEL, 12, NULL) = 0
  199. getsockopt(12, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
  200. sendto(12, "GET / HTTP/1.1
  201. Host: www.xinhua"..., 90, 0, NULL, 0) = 90
  202. brk(0x7fffd9f39000) = 0x7fffd9f39000
  203. recvfrom(12, 0x7fffd9f08d50, 65536, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
  204. epoll_ctl(3, EPOLL_CTL_ADD, 12, {EPOLLIN, {u32=12, u64=38654705676}}) = 0
  205. clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=687389000}) = 0
  206. time(NULL) = 1559698600 (2019-06-05T09:36:40+0800)
  207. epoll_wait(3, [{EPOLLOUT, {u32=19, u64=38654705683}}, {EPOLLOUT, {u32=18, u64=38654705682}}], 4096, 984) = 2
  208. epoll_ctl(3, EPOLL_CTL_DEL, 19, NULL) = 0
  209. getsockopt(19, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
  210. sendto(19, "GET / HTTP/1.1
  211. Host: www.xinhua"..., 90, 0, NULL, 0) = 90
  212. recvfrom(19, 0x7fffd9f28d70, 65536, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
  213. epoll_ctl(3, EPOLL_CTL_ADD, 19, {EPOLLIN, {u32=19, u64=38654705683}}) = 0
  214. epoll_ctl(3, EPOLL_CTL_DEL, 18, NULL) = 0
  215. getsockopt(18, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
  216. brk(0x7fffd9f69000) = 0x7fffd9f69000
  217. sendto(18, "GET / HTTP/1.1
  218. Host: www.xinhua"..., 90, 0, NULL, 0) = 90
  219. recvfrom(18, 0x7fffd9f48d90, 65536, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
  220. epoll_ctl(3, EPOLL_CTL_ADD, 18, {EPOLLIN, {u32=18, u64=38654705682}}) = 0
  221. clock_gettime(CLOCK_MONOTONIC, {tv_sec=232, tv_nsec=694225000}) = 0
  222. time(NULL) = 1559698600 (2019-06-05T09:36:40+0800)
  223. epoll_wait(3, [{EPOLLIN, {u32=4, u64=38654705668}}], 4096, -1) = 1
  224. epoll_ctl(3, EPOLL_CTL_DEL, 4, NULL) = 0
  225. recvfrom(4, "HTTP/1.1 200 OK
  226. Content-Type: t"..., 65536, 0, NULL, NULL) = 4096
  227. recvfrom(4, 0x7fffd9e48c90, 65536, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
  228. epoll_ctl(3, EPOLL_CTL_ADD, 4, {EPOLLIN, {u32=4, u64=38654705668}}) = 0
  229. clock_gettime(CLOCK_MONOTONIC, {tv_sec=237, tv_nsec=399093000}) = 0
  230. time(NULL) = 1559698604 (2019-06-05T09:36:44+0800)
  231. brk(0x7fffd9f59000) = 0x7fffd9f59000
  232. epoll_wait(3, [{EPOLLIN, {u32=4, u64=38654705668}}], 4096, -1) = 1
  233. epoll_ctl(3, EPOLL_CTL_DEL, 4, NULL) = 0
  234. recvfrom(4, "V{362b423622331350H357313374314s372N325732416
  235. 25724H217y376204P3206"..., 65536, 0, NULL, NULL) = 8192
  236. recvfrom(4, 0x7fffd9e48c90, 65536, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
  237. epoll_ctl(3, EPOLL_CTL_ADD, 4, {EPOLLIN, {u32=4, u64=38654705668}}) = 0
  238. clock_gettime(CLOCK_MONOTONIC, {tv_sec=237, tv_nsec=460756000}) = 0
  239. time(NULL) = 1559698604 (2019-06-05T09:36:44+0800)
  240. epoll_wait(3, [{EPOLLIN, {u32=4, u64=38654705668}}], 4096, -1) = 1
  241. epoll_ctl(3, EPOLL_CTL_DEL, 4, NULL) = 0
  242. recvfrom(4, "374346{V311306246|0F276337370`222247253312306200262~37425020"317233w
  243. "..., 65536, 0, NULL, NULL) = 8192
  244. recvfrom(4, 0x7fffd9e48c90, 65536, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
  245. epoll_ctl(3, EPOLL_CTL_ADD, 4, {EPOLLIN, {u32=4, u64=38654705668}}) = 0
  246. clock_gettime(CLOCK_MONOTONIC, {tv_sec=237, tv_nsec=465855000}) = 0
  247. time(NULL) = 1559698604 (2019-06-05T09:36:44+0800)
  248. epoll_wait(3, [{EPOLLIN, {u32=4, u64=38654705668}}], 4096, -1) = 1
  249. epoll_ctl(3, EPOLL_CTL_DEL, 4, NULL) = 0
  250. recvfrom(4, "3442@o36234010240#337=J2=274337201307=3O32434235s7167^"23"..., 65536, 0, NULL, NULL) = 19559
  251. brk(0x7fffd9f99000) = 0x7fffd9f99000
  252. close(4) = 0
  253. write(1, "177115 bytes
  254. ", 13) = 13
  255. munmap(0x7fc028910000, 2101248) = 0
  256. clock_gettime(CLOCK_MONOTONIC, {tv_sec=237, tv_nsec=479677000}) = 0
  257. time(NULL) = 1559698604 (2019-06-05T09:36:44+0800)
  258. 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
  259. epoll_ctl(3, EPOLL_CTL_DEL, 9, NULL) = 0
  260. recvfrom(9, "HTTP/1.1 200 OK
  261. Content-Type: t"..., 65536, 0, NULL, NULL) = 4096
  262. recvfrom(9, 0x7fffd9e68cb0, 65536, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
  263. epoll_ctl(3, EPOLL_CTL_ADD, 9, {EPOLLIN, {u32=9, u64=38654705673}}) = 0
  264. epoll_ctl(3, EPOLL_CTL_DEL, 7, NULL) = 0
  265. recvfrom(7, "HTTP/1.1 200 OK
  266. Content-Type: t"..., 65536, 0, NULL, NULL) = 4096
  267. recvfrom(7, "V{362b423622331350H357313374314s372N325732416
  268. 25724H217y376204P3206"..., 65536, 0, NULL, NULL) = 4096
  269. recvfrom(7, 0x7fffd9ea8cf0, 65536, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
  270. epoll_ctl(3, EPOLL_CTL_ADD, 7, {EPOLLIN, {u32=7, u64=38654705671}}) = 0
  271. epoll_ctl(3, EPOLL_CTL_DEL, 17, NULL) = 0
  272. recvfrom(17, "HTTP/1.1 200 OK
  273. Content-Type: t"..., 65536, 0, NULL, NULL) = 8192
  274. recvfrom(17, 0x7fffd9ec8d10, 65536, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
  275. epoll_ctl(3, EPOLL_CTL_ADD, 17, {EPOLLIN, {u32=17, u64=38654705681}}) = 0
  276. epoll_ctl(3, EPOLL_CTL_DEL, 11, NULL) = 0
  277. recvfrom(11, "HTTP/1.1 200 OK
  278. Content-Type: t"..., 65536, 0, NULL, NULL) = 8192
  279. recvfrom(11, 0x7fffd9ee8d30, 65536, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
  280. epoll_ctl(3, EPOLL_CTL_ADD, 11, {EPOLLIN, {u32=11, u64=38654705675}}) = 0
  281. clock_gettime(CLOCK_MONOTONIC, {tv_sec=238, tv_nsec=747275000}) = 0
  282. time(NULL) = 1559698606 (2019-06-05T09:36:46+0800)
  283. madvise(0x7fffd9dcd000, 61440, MADV_DONTNEED) = 0
  284. madvise(0x7fffd9e39000, 126976, MADV_DONTNEED) = 0
  285. 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
  286. epoll_ctl(3, EPOLL_CTL_DEL, 8, NULL) = 0
  287. recvfrom(8, "HTTP/1.1 200 OK
  288. Content-Type: t"..., 65536, 0, NULL, NULL) = 20480
  289. recvfrom(8, 0x7fffd9e28c70, 65536, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
  290. epoll_ctl(3, EPOLL_CTL_ADD, 8, {EPOLLIN, {u32=8, u64=38654705672}}) = 0
  291. epoll_ctl(3, EPOLL_CTL_DEL, 10, NULL) = 0
  292. recvfrom(10, "HTTP/1.1 200 OK
  293. Content-Type: t"..., 65536, 0, NULL, NULL) = 12288
  294. recvfrom(10, 0x7fffd9e88cd0, 65536, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
  295. epoll_ctl(3, EPOLL_CTL_ADD, 10, {EPOLLIN, {u32=10, u64=38654705674}}) = 0
  296. epoll_ctl(3, EPOLL_CTL_DEL, 12, NULL) = 0
  297. recvfrom(12, "HTTP/1.1 200 OK
  298. Content-Type: t"..., 65536, 0, NULL, NULL) = 20480
  299. recvfrom(12, 0x7fffd9f08d50, 65536, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
  300. epoll_ctl(3, EPOLL_CTL_ADD, 12, {EPOLLIN, {u32=12, u64=38654705676}}) = 0
  301. epoll_ctl(3, EPOLL_CTL_DEL, 19, NULL) = 0
  302. recvfrom(19, "HTTP/1.1 200 OK
  303. Content-Type: t"..., 65536, 0, NULL, NULL) = 20480
  304. recvfrom(19, 0x7fffd9f28d70, 65536, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
  305. epoll_ctl(3, EPOLL_CTL_ADD, 19, {EPOLLIN, {u32=19, u64=38654705683}}) = 0
  306. epoll_ctl(3, EPOLL_CTL_DEL, 18, NULL) = 0
  307. recvfrom(18, "HTTP/1.1 200 OK
  308. Content-Type: t"..., 65536, 0, NULL, NULL) = 20480
  309. recvfrom(18, 0x7fffd9f48d90, 65536, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
  310. epoll_ctl(3, EPOLL_CTL_ADD, 18, {EPOLLIN, {u32=18, u64=38654705682}}) = 0
  311. epoll_ctl(3, EPOLL_CTL_DEL, 9, NULL) = 0
  312. recvfrom(9, "V{362b423622331350H357313374314s372N325732416
  313. 25724H217y376204P3206"..., 65536, 0, NULL, NULL) = 29504
  314. recvfrom(9, "231_243"240C3013764931314255236344f22305_357hojll0FS240
  315. 254"..., 65536, 0, NULL, NULL) = 6439
  316. close(9) = 0
  317. write(1, "177115 bytes
  318. ", 13) = 13
  319. munmap(0x7fc0221a0000, 2101248) = 0
  320. epoll_ctl(3, EPOLL_CTL_DEL, 7, NULL) = 0
  321. recvfrom(7, "32313372375"271e271cZ343bb251331314227323L257224311324335276(D32334124231"..., 65536, 0, NULL, NULL) = 31847
  322. close(7) = 0
  323. write(1, "177115 bytes
  324. ", 13) = 13
  325. munmap(0x7fc021f90000, 2101248) = 0
  326. epoll_ctl(3, EPOLL_CTL_DEL, 17, NULL) = 0
  327. recvfrom(17, "32313372375"271e271cZ343bb251331314227323L257224311324335276(D32334124231"..., 65536, 0, NULL, NULL) = 31847
  328. close(17) = 0
  329. write(1, "177115 bytes
  330. ", 13) = 13
  331. munmap(0x7fc021530000, 2101248) = 0
  332. clock_gettime(CLOCK_MONOTONIC, {tv_sec=238, tv_nsec=783851000}) = 0
  333. time(NULL) = 1559698606 (2019-06-05T09:36:46+0800)
  334. 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
  335. epoll_ctl(3, EPOLL_CTL_DEL, 11, NULL) = 0
  336. recvfrom(11, "32313372375"271e271cZ343bb251331314227323L257224311324335276(D32334124231"..., 65536, 0, NULL, NULL) = 31847
  337. close(11) = 0
  338. write(1, "177115 bytes
  339. ", 13) = 13
  340. munmap(0x7fc021b60000, 2101248) = 0
  341. epoll_ctl(3, EPOLL_CTL_DEL, 8, NULL) = 0
  342. recvfrom(8, "3442@o36234010240#337=J2=274337201307=3O32434235s7167^"23"..., 65536, 0, NULL, NULL) = 19559
  343. close(8) = 0
  344. write(1, "177115 bytes
  345. ", 13) = 13
  346. munmap(0x7fc0225c0000, 2101248) = 0
  347. epoll_ctl(3, EPOLL_CTL_DEL, 10, NULL) = 0
  348. recvfrom(10, "374346{V311306246|0F276337370`222247253312306200262~37425020"317233w
  349. "..., 65536, 0, NULL, NULL) = 27751
  350. close(10) = 0
  351. write(1, "177115 bytes
  352. ", 13) = 13
  353. munmap(0x7fc0223b0000, 2101248) = 0
  354. epoll_ctl(3, EPOLL_CTL_DEL, 12, NULL) = 0
  355. recvfrom(12, "3442@o36234010240#337=J2=274337201307=3O32434235s7167^"23"..., 65536, 0, NULL, NULL) = 19559
  356. close(12) = 0
  357. write(1, "177115 bytes
  358. ", 13) = 13
  359. munmap(0x7fc021950000, 2101248) = 0
  360. epoll_ctl(3, EPOLL_CTL_DEL, 19, NULL) = 0
  361. recvfrom(19, "3442@o36234010240#337=J2=274337201307=3O32434235s7167^"23"..., 65536, 0, NULL, NULL) = 19559
  362. close(19) = 0
  363. write(1, "177115 bytes
  364. ", 13) = 13
  365. munmap(0x7fc021110000, 2101248) = 0
  366. epoll_ctl(3, EPOLL_CTL_DEL, 18, NULL) = 0
  367. recvfrom(18, "3442@o36234010240#337=J2=274337201307=3O32434235s7167^"23"..., 65536, 0, NULL, NULL) = 19559
  368. close(18) = 0
  369. write(1, "177115 bytes
  370. ", 13) = 13
  371. munmap(0x7fc021320000, 2101248) = 0
  372. clock_gettime(CLOCK_MONOTONIC, {tv_sec=238, tv_nsec=802835000}) = 0
  373. time(NULL) = 1559698606 (2019-06-05T09:36:46+0800)
  374. futex(0x7fffd9e01ce0, FUTEX_WAKE_PRIVATE, 2147483647) = 4
  375. futex(0x7fffd9e01c90, FUTEX_WAKE_PRIVATE, 1) = 1
  376. futex(0x7fc023ff09d0, FUTEX_WAIT, 56, NULL) = -1 EAGAIN (Resource temporarily unavailable)
  377. epoll_ctl(3, EPOLL_CTL_DEL, 5, NULL) = 0
  378. close(5) = 0
  379. close(6) = 0
  380. close(2) = 0
  381. close(1) = 0
  382. close(0) = 0
  383. munmap(0x7fc028fa0000, 2231560) = 0
  384. munmap(0x7fc028d1f000, 2624568) = 0
  385. close(3) = 0

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/31634.html

相关文章

  • 现有PHP项目引入Swoole4协程支持的流程及难点

    摘要:之后协程化支持已经完善并且支持大量的扩展自动协程化一些基于的框架也蓬勃发展光看着文档就让人跃跃欲试但是对于现有旧项目如何引入并启用协程成了实际场景中的客观问题由于协程性质及生命周期等原因这并非想象的那么容易本文整理了在现有项目中引入并开启协 Swoole4之后,协程化支持已经完善,并且支持大量的PHP扩展自动协程化.一些基于Swoole4的框架也蓬勃发展,光看着文档就让人跃跃欲试.但是...

    高胜山 评论0 收藏0
  • Mix PHP V2 生态:让 Guzzle 支持 Swoole 的 Hook 协程

    摘要:是一个非常流行的的客户端,现在各大厂的也都开始基于开发,因为只支持的协程,而默认是使用扩展的,所以开发了,能在不修改源码的情况下让协程化。 Guzzle 是一个非常流行的 PHP 的 HTTP 客户端,现在各大厂的 SDK 也都开始基于 Guzzle 开发,因为 Swoole 只支持 PHP Stream 的协程 Hook ,而 Guzzle 默认是使用 cURL 扩展的,所以 Mix...

    Flands 评论0 收藏0
  • Swoole 4.4 协程抢占式调度器详解

    摘要:抢占式调度我们在今年年初就计划实现的抢占式调度,以满足实现有些场景下的不均衡调度带来的问题。考虑开线程,负责检查当前执行协程执行时间。达到我们的第二个协程主动抢占第一个协程的效果。 前言 Swoole内核团队开设的专栏,会逐渐投入精力写文章介绍Swoole的开发历程,实现原理,应用实践等,大家可以更好的交流,共同学习,建设PHP生态。 协程调度 去年Swoole推出了4.0版本后,完整...

    Bowman_han 评论0 收藏0
  • Swoole 4.1.0 正式版发布,支持原生 Redis/PDO/MySQLi 程化

    摘要:重大新特性支持从版本开始支持了对原生协程化的支持。可使用将普通的同步阻塞操作变为协程调度的异步非阻塞协程跟踪新版本增加了两个方法用于跟踪协程运行。 重大新特性 支持 Redis/PDO/MySQLi 从4.1.0版本开始支持了对PHP原生Redis、PDO、MySQLi协程化的支持。 可使用SwooleRuntime::enableCorotuine()将普通的同步阻塞Redis、PD...

    chuyao 评论0 收藏0
  • Zend 官方框架增加 Swoole 协程支持

    摘要:结语考虑到在国内的流行度并不高,可能帮不了国内的多少开发者,本文只为做一个引导,有兴趣的可以直接查看官方文档获得更多信息,同时还自行实现了更好支持度的静态资源访问支持,有兴趣的也可以了解一下。 前言 Zend Framework 是 PHP 的官方框架,随着 Zend-Expressive-Swoole 0.2.2 的发布,率先支持了 Swoole 4 的协程功能,现在可以仅通过一个配...

    gaara 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<