php 는 pthreads v3 다 중 스 레 드 를 사용 하여 시 나 닷 컴 뉴스 정 보 를 캡 처 하 는 작업 예 시 를 실현 합 니 다.
우 리 는 pthreads 를 사용 하여 다 중 스 레 드 캡 처 페이지 애플 릿 을 작성 하여 결 과 를 데이터베이스 에 저장 합 니 다.
데이터 테이블 구 조 는 다음 과 같다.
CREATE TABLE `tb_sina` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
`url` varchar(256) DEFAULT '' COMMENT 'url ',
`title` varchar(128) DEFAULT '' COMMENT ' ',
`time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT ' ',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='sina ';
코드 는 다음 과 같 습 니 다:
<?php
class DB extends Worker
{
private static $db;
private $dsn;
private $root;
private $pwd;
public function __construct($dsn, $root, $pwd)
{
$this->dsn = $dsn;
$this->root = $root;
$this->pwd = $pwd;
}
public function run()
{
//
self::$db = new PDO($this->dsn, $this->root, $this->pwd);
// require worker , ,
require './vendor/autoload.php';
}
//
public function getConn()
{
return self::$db;
}
}
class Sina extends Thread
{
private $name;
private $url;
public function __construct($name, $url)
{
$this->name = $name;
$this->url = $url;
}
public function run()
{
$db = $this->worker->getConn();
if (empty($db) || empty($this->url)) {
return false;
}
$content = file_get_contents($this->url);
if (!empty($content)) {
// , ,
$data = QL\QueryList::Query($content, [
'tit' => ['.c_tit > a', 'text'],
'url' => ['.c_tit > a', 'href'],
'time' => ['.c_time', 'text'],
], '', 'UTF-8', 'GB2312')->getData();
//
if (!empty($data)) {
$sql = 'INSERT INTO tb_sina(`url`, `title`, `time`) VALUES';
foreach ($data as $row) {
// , 04-23 15:30
$time = date('Y') . '-' . $row['time'] . ':00';
$sql .= "('{$row['url']}', '{$row['tit']}', '{$time}'),";
}
$sql = rtrim($sql, ',');
$ret = $db->exec($sql);
if ($ret !== false) {
echo " {$this->name} {$ret}
";
} else {
var_dump($db->errorInfo());
}
}
}
}
}
//
$url = 'http://roll.news.sina.com.cn/s/channel.php?ch=01#col=89&spec=&type=&ch=01&k=&offset_page=0&offset_num=0&num=60&asc=&page=';
// pool
$pool = new Pool(5, 'DB', ['mysql:dbname=test;host=192.168.33.226', 'root', '']);
// 100
for ($ix = 1; $ix <= 100; $ix++) {
$pool->submit(new Sina($ix, $url . $ix));
}
// , ,
while ($pool->collect()) ;
$pool->shutdown();
Query List 를 사 용 했 기 때문에 composer 를 통 해 설치 할 수 있 습 니 다.
composer require jaeger/querylist
그러나 설 치 된 버 전 은 3.2 입 니 다.제 phop 7.2 에 문제 가 있 을 수 있 습 니 다.each()가 폐기 되 었 기 때문에 원본 코드 를 수정 하고 each()를 모두 foreach()로 바 꾸 면 됩 니 다.실행 결 과 는 다음 과 같 습 니 다.
데이터 도 데이터베이스 에 저장 되 었 습 니 다.
물론 여러분 도 다시 url 을 통 해 구체 적 인 페이지 내용 을 얻 을 수 있 습 니 다.여 기 는 프레젠테이션 을 하지 않 고 관심 있 는 것 은 스스로 실현 할 수 있 습 니 다.
더 많은 PHP 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.
본 논문 에서 말 한 것 이 여러분 의 PHP 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Laravel - 변환된 유효성 검사 규칙으로 API 요청 제공동적 콘텐츠를 위해 API를 통해 Laravel CMS에 연결하는 모바일 앱(또는 웹사이트) 구축을 고려하십시오. 이제 앱은 CMS에서 번역된 콘텐츠를 받을 것으로 예상되는 다국어 앱이 될 수 있습니다. 일반적으로 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.