>백엔드 개발 >PHP 튜토리얼 >스레드와 httpclient를 사용하여 페이지 조회수를 늘리는 방법

스레드와 httpclient를 사용하여 페이지 조회수를 늘리는 방법

小云云
小云云원래의
2018-03-05 10:50:041845검색

여기서 그냥 리퀘스트를 생각하고 있는데 한번 리퀘스트를 확인하니 조회수가 1씩 늘어나네요. 그래서 F5를 눌러 새로고침을 했는데 실제로는 매번 증가하지 않고 계속 확인해보니 다시 F5를 누르면 1씩 증가하는 것으로 나타났습니다. 이제 기본 기능 분석이 완료되었으니 어떤 아이디어가 있습니까? 페이지를 요청하고 반환된 HTML을 가져온 다음 문자열을 구문 분석하는 이전 크롤러가 생각납니다. 그래서 저도 이 아이디어를 깨닫고 서버를 이용해 링크를 요청하고 남은 시간은 대기 시간입니다. 이를 무시하고 계속 검색하면 악의적인 요청이 의심될 수 있으며 계정이 차단될 수 있습니다. 그렇다면 이 시나리오에 적합한 기술은 무엇인지 생각해 보셨나요? 예, 스레드를 사용하여 각 요청 후 절전 시간을 설정할 수 있습니다.

그러면 일반적인 아이디어는 분명해집니다. httpClient가 요청을 보내고 스레드가 일시 중지 시간을 제어합니다. 더 이상 고민하지 않고 코드를 살펴보겠습니다.

모두가 위의 기본 내용에 익숙해야 합니다. 여기서 제 생각은 스레드 클래스에 세 가지 변수가 있다는 것입니다. new 는 편의상 나중 스레드 실행 방법에 사용됩니다. 멀티스레딩을 구현하는 4가지 방법은 이전에 블로그 게시물에서 언급한 적이 있는 것 같습니다.

멀티스레딩을 구현하는 방법에는 4가지가 있으며, 그 중 대부분은 반환 값이 없는 처음 두 가지 방법입니다.

1. Thread 클래스를 상속하여 스레드를 생성합니다.

Thread 클래스는 본질적으로 Runnable 인터페이스를 구현하는 인스턴스이며 스레드의 인스턴스를 나타냅니다. 스레드를 시작하는 유일한 방법은 Thread 클래스의 start() 인스턴스 메서드를 사용하는 것입니다. start() 메서드는 새 스레드를 시작하고 run() 메서드를 실행하는 기본 메서드입니다. 이러한 방식으로 멀티스레딩을 구현하는 것은 매우 간단합니다. 자신의 클래스를 통해 Thread를 직접 확장하고 run() 메서드를 재정의하면 새 스레드를 시작하고 자신이 정의한 run() 메서드를 실행할 수 있습니다. 예:

public class MyThread extends Thread { public void run() { System.out.println("MyThread.run()") } } MyThread myThread1 = new MyThread myThread2 = new MyThread(); myThread1 .start(); myThread2.start();

2. Runnable 인터페이스를 구현하여 스레드 생성

클래스가 다른 클래스를 확장한 경우 현재로서는 Runnable 인터페이스를 직접 구현할 수 없습니다.

public class MyThread는 OtherClass를 구현합니다. Runnable { public void run() { System.out.println("MyThread.run()") } }

MyThread를 시작하려면 먼저 스레드하고 자신의 MyThread 인스턴스를 전달합니다.

MyThread myThread = new MyThread(); Thread thread = new Thread(myThread); thread.start(); 실제로 Runnable 대상 매개변수가 Thread에 전달되면, Thread의 run() 메소드인 target.run()이 호출됩니다. JDK 소스 코드를 참조하세요:

public void run() {  if (target != null) {   target.run();   } }

3. FutureTask 래퍼를 통한 Callable 인터페이스 스레드 스레드 만들기

Callable 인터페이스(또한 하나의 메서드만 있음)는 다음과 같이 정의됩니다.

public 인터페이스 Callable { V call() throws Exception }

public class SomeCallable< V> 확장 OtherClass 구현 Callable { @ Override public V call() throws Exception { // TODO 자동 생성 메서드 스텁 return null }}

Callable oneCallable = new SomeCallable(); /Callable >Object: FutureTask oneTask = new FutureTask(oneCallable); //참고: FutureTask는 Callable를 허용하여 생성됩니다. ;. Future 및 Runnable 인터페이스를 모두 구현합니다. //FutureTask에서 Thread 객체 생성: Thread oneThread = new Thread(oneTask); //이 시점에서 스레드가 생성됩니다.

4. ExecutorService, Callable 및 Future를 사용하여 결과를 반환하는 스레드를 구현합니다.

ExecutorService, Callable 및 Future의 세 가지 인터페이스는 실제로 Executor 프레임워크에 속합니다. 결과를 반환하는 스레드는 JDK1.5에 도입된 새로운 기능입니다. 이 기능을 사용하면 더 이상 반환 값을 얻기 위해 많은 어려움을 겪을 필요가 없습니다. 그리고 직접 구현한다고 해도 허점이 가득할 수도 있습니다.

값을 반환할 수 있는 작업은 Callable 인터페이스를 구현해야 합니다. 마찬가지로, 값을 반환하지 않는 작업은 Runnable 인터페이스를 구현해야 합니다.

Callable 작업을 실행한 후 Future 개체를 얻을 수 있습니다. 개체에 대해 get을 호출하면 Callable 작업에서 반환된 개체를 얻을 수 있습니다.

참고: get 메서드는 차단됩니다. 즉, 스레드는 결과를 반환하지 않으며 get 메서드는 영원히 기다립니다.

스레드 풀 인터페이스 ExecutorService와 결합하면 결과를 반환하는 전설적인 멀티스레딩을 실현할 수 있습니다.

주제로 다시 돌아가서 값을 반환할 필요가 없기 때문에 여기서는 첫 번째 것을 사용합니다.


여기에 여러 주소를 브러싱하는 아이디어와 홀수 짝수 요청 방법을 추가하여 매번 동일한 요청 방법을 사용하지 않고 악의적인 요청으로 나열될 위험을 방지합니다. 체계. 그리고 메인에서 취침 시간을 설정할 수 있습니다. 새로고침 전 읽기량을 살펴보겠습니다.


어젯밤에 이 글을 쓰고 잠자리에 들었는데, 오늘 밤에 컴퓨터가 몇 번이나 꺼지지 않았는지 살펴보겠습니다.


그런 다음 다음 목록 페이지를 새로 고치고 독서량을 다시 살펴봅니다.


독서량이 원래 300권이 넘었는데 지금은 600권이 넘은 걸 보셨나요?

IP는 항상 그랬기 때문에 중간에 슬립타임이 좀 길어요. 스위칭용 IP도 있고 스위칭 로직도 추가하면 효과는 더 좋을 것 같아요.

이론적으로 클라이언트가 동일한 IP를 여러 번 요청하여 한 번 읽은 것으로 계산하는 등의 엄격한 전략을 구현하지 않는 한, 이 방법을 사용하면 모든 읽기 양을 늘릴 수 있습니다. Baidu Wenku의 해당 기사를 어떻게 훌륭한 문서로 평가할지는 모르겠지만, 요청 횟수와 관련이 있을 것 같습니다. 기회가 있다면 이 아이디어를 시도해 볼 수 있습니다. 이를 수정하여 두 개의 스레드를 만들고 이를 교대로 만들 수 있습니다. 하나의 스레드가 하나의 웹 사이트를 브러시합니다. 하하.
하지만 계정이 금지되어도 저를 비난하지 마세요, 하하.

관련 권장 사항:

thinkPHP+ajax를 사용하여 통계 페이지 PV 조회수를 달성하는 방법

위 내용은 스레드와 httpclient를 사용하여 페이지 조회수를 늘리는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.