thinkphp5.1怎么实现多线程爬虫

来源:undefined 2024-12-29 03:17:35 1007

创建一个cli命令

1

php think make:command Thread thread

登录后复制

测试能否成功执行

1

php think thread

登录后复制
登录后复制
安装Guzzle类库

文档地址:guzzle文档地址(https://guzzle-cn.readthedocs.io/zh_CN/latest/quickstart.html)

实现代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

<?php /**

* Created by.

* User: Jim

* Date: 2020/9/29

* Time: 14:31

*/

namespace appcommand;

use GuzzleHttpClient;

use GuzzleHttpPool;

use thinkconsoleCommand;

use thinkconsoleInput;

use thinkconsoleOutput;

/**

* Guzzle

* Class Thread

* @package appcommand

* 文档地址 https://guzzle-cn.readthedocs.io/zh_CN/latest/quickstart.html

*/

class Thread extends Command

{

/**

* 请求的总次数

* @var int

*/

protected $totalPageCount = 50;

/**

* 当前请求的次数

* @var int

*/

protected static $counter = 1;

/**

* 线程的数量

* @var int

*/

protected $threads = 20;

protected function configure()

{

// 指令配置

$this->setName(thread);

// 设置参数

}

protected function execute(Input $input, Output $output)

{

$client = new Client();

$requests = function ($total) use ($client) {

foreach (range(1, $total) as $r) {

$uri = https://apinew.juejin.im/content_api/v1/short_msg/detail;

yield function () use ($client, $uri) {

return $client-&gt;postAsync($uri, [

verify =&gt; false,

json =&gt; [

msg_id =&gt; 6845185452727599118

]

]);

};

}

};

$pool = new Pool($client, $requests($this-&gt;totalPageCount), [

concurrency =&gt; $this-&gt;threads,

// 请求成功

fulfilled =&gt; function ($response, $index) use ($output) {

$res = $response-&gt;getBody()-&gt;getContents();

$output-&gt;writeln($res);

$output-&gt;writeln("正在执行第{$index}个·····");

if ($this-&gt;checkThreadIsEnd() == true) {

$output-&gt;writeln("------------请求结束---------");

return false;

}

},

// 请求失败

rejected =&gt; function ($reason, $index) use ($output) {

$output-&gt;writeln("执行失败,{$reason}");

},

]);

$promise = $pool-&gt;promise();

$promise-&gt;wait();

}

/**

* 检测任务是否结束

* @return bool

*/

private function checkThreadIsEnd()

{

if (self::$counter totalPageCount) {

self::$counter++;

return false;

} else {

return true;

}

}

}

登录后复制
执行命令

1

php think thread

登录后复制
登录后复制

以上就是thinkphp5.1怎么实现多线程爬虫的详细内容,更多请关注php中文网其它相关文章!

最新文章