ProvinceJob.php 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. <?php
  2. namespace addons\RfDevTool\common\queues;
  3. use Yii;
  4. use yii\base\BaseObject;
  5. use yii\queue\JobInterface;
  6. use common\helpers\StringHelper;
  7. use common\models\common\Provinces;
  8. use linslin\yii2\curl\Curl;
  9. use QL\QueryList;
  10. /**
  11. * Class ProvinceJob
  12. * @package addons\RfDevTool\common\queues
  13. * @author jianyan74 <751393839@qq.com>
  14. */
  15. class ProvinceJob extends BaseObject implements JobInterface
  16. {
  17. /**
  18. * @var string
  19. */
  20. public $baseUrl;
  21. /**
  22. * @var int
  23. */
  24. public $maxLevel;
  25. /**
  26. * @var int
  27. */
  28. public $job_id;
  29. /**
  30. * @param \yii\queue\Queue $queue
  31. * @return mixed|void
  32. */
  33. public function execute($queue)
  34. {
  35. /** @var QueryList $ql */
  36. $ql = QueryList::getInstance();
  37. // 注册一个myHttp方法到QueryList对象
  38. $ql->bind('http', function ($url) {
  39. $curl = new Curl();
  40. $html = $curl->get($url);
  41. $encode = mb_detect_encoding($html, ["ASCII", 'UTF-8', "GB2312", "GBK", 'BIG5']);
  42. $str_encode = mb_convert_encoding($html, 'UTF-8', $encode);
  43. $this->setHtml($str_encode);
  44. return $this;
  45. });
  46. // 切片选择器
  47. $range = 'table.provincetable td';
  48. $data = $ql->rules([
  49. 'title' => ['a', 'text'],
  50. 'link' => ['a', 'href']
  51. ])->http($this->baseUrl . 'index.html')->range($range)->query()->getData()->all();
  52. foreach ($data as &$datum) {
  53. if (empty($datum['text']) && empty($datum['link'])) {
  54. continue;
  55. }
  56. $code = StringHelper::replace('.html', '', $datum['link']);
  57. $datum['code'] = explode('/', $code);
  58. $datum['id'] = $datum['code'][0] . '0000';
  59. $datum['pid'] = 0;
  60. $datum['tree'] = '0-';
  61. $datum['level'] = 1;
  62. $datum['chlidPrefix'] = $datum['code'][0];
  63. $datum['chlidLink'] = $this->baseUrl . $datum['link'];
  64. // 写入数据库
  65. if (!($model = Provinces::findOne(['id' => $datum['id']]))) {
  66. $model = new Provinces();
  67. }
  68. $model->attributes = $datum;
  69. $model->save();
  70. if ($datum['level'] + 1 <= $this->maxLevel) {
  71. $this->createJob($datum);
  72. }
  73. }
  74. }
  75. /**
  76. * @param $datum
  77. * @param $level
  78. */
  79. public function createJob($datum)
  80. {
  81. $queue = new ProvinceChildJob([
  82. 'parent' => $datum,
  83. 'baseUrl' => $this->baseUrl,
  84. 'maxLevel' => $this->maxLevel,
  85. 'job_id' => $this->job_id,
  86. ]);
  87. $messageId = Yii::$app->queue->push($queue);
  88. }
  89. }
粤ICP备19079148号