2011-01-04 4 views
0

저는 PHP OOP의 초보자입니다. 이런 종류의 응용 프로그램을 어떻게 구성 할 수 있는지 얻으려고합니다. 이 응용 프로그램은 약 100 개의 다른 웹 사이트를 긁어 모으기위한 것입니다.PHP에서 OOP 응용 프로그램 설계. 어떻게?

나는 모든 다른 웹 사이트의 전역 메서드를 처리하는 "스크랩"이라는 메인 클래스가 있으며, "스크립트"폴더 안에는 내가 고치고있는 웹 사이트의 특정 측면을 처리하기위한 클래스가 있습니다. 외부 라이브러리를 포함하는 "Lib"이라는 다른 폴더가 있습니다. 다음

- Scrap.php 
+ Scripts 
       - Google.php 
       - Yahoo.php 
       - Stackoverflow.php 
+ Lib 
    + libScrap 
       - LIB_parse.php 
    + phpQuery 
       - phpQuery.php 
       - others files and folder... 

Scrap.php 포함 : :이 파일 스키마를

을 :

<?php 

// Includes 
require('/lib/libScrap/LIB_parse.php'); 
require('/lib/phpQuery/phpQuery.php'); 

// Testing Scrap 
$testing = new Scrap; 
$testing->teste = $testing->getPage('http://www.yahoo.com','','off'); 
echo $testing->teste; 


class Scrap { 

    public function __construct() { 
     // do things! 
    } 

    /* 
    * This method grabs the entire page(HTML) on given URL 
    * Ex: $htmlgrab->teste = $htmlgrab->getPage('http://testing.com/ofertas/','','off'); 
    * Returns, the HTML of given URL 
    */ 
    public function getPage($site, $proxy, $proxystatus) { 
     $ch = curl_init(); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
     if ($proxystatus == 'on') { 
      curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); 
      curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, TRUE); 
      curl_setopt($ch, CURLOPT_PROXY, $proxy); 
     } 
     curl_setopt($ch, CURLOPT_COOKIEFILE, "cookie.txt"); 
     curl_setopt($ch, CURLOPT_URL, $site); 
     ob_start();  // prevent any output 
     return curl_exec ($ch); // execute the curl command 
     ob_end_clean(); // stop preventing output 
     curl_close ($ch); 
    } 

    /* 
    * 
    * 
    */ 
    public function getLinks() { 
     // do things! 
    } 

    /* 
    * This method grabs the page title. 
    * Ex: <title>This is the page title</title> 
    * Returns, "This is the page title" 
    */ 
    public function getTitle() { 
     // do things! 
    } 

} 
?> 

을 그리고 폴더 안에 "스크립트"나는 것이다

저를 시각적으로 설명하게 다음과 같은 파일이 있습니다.

<?php 
require('../Scrap.php'); 

class Yahoo extends Scrap { 

    public function doSomething() { 
     // do things! 
    } 

} 
?> 

끝점 : 웹 사이트를 스크랩하기 위해 "스크립트"폴더에 생성 된 모든 클래스를 호출하거나 인스턴스화해야합니다. 내 의심은 약 100 개의 클래스를 인스턴스화하는 가장 좋은 방법에 관한 것입니다.

당신이 나에게 이것을 디자인하는 방법에 대한 단서를 줄 수 있다면.

최고 감사합니다.

죄송합니다.

+0

* (HTML 관련 구문 분석) * (http://stackoverflow.com/questions/3577641/best-methods-to-parse-html/3577662#3577662)입니다. – Gordon

+0

당신은 항상 페이지에서 같은 것을 긁을 것입니까? 항상 링크, 제목 등? 다양한 고객 (Google, Yahoo, StackOverflow)은 어떤면에서 다른가요? – Gordon

+0

@ Gordon, 특정 정보가있는 페이지가있을 것입니다. 처리 할 방법은 "Scripts"폴더 안에 있습니다. –

답변

0

모든 파일을 스크립트 폴더에 포함하려면 간단한 루프만으로 충분하지 않은 이유는 무엇입니까? 나는 종종 많은 스크립트를 포함하는 프로젝트에서 같은 일을한다.

$arr = glob ('scripts/*.php'); 
foreach ($arr as $script) 
    include_once ($script); 

UPDATE

지금까지 각 개체를 초기화로 ... 최선은 아마 ... 이런 식으로 ... 각 클래스의 내부 객체를 선언하는 것입니다

<?php 
require('../Scrap.php'); 

class Yahoo extends Scrap { 

    public function doSomething() { 
     // do things! 
    } 
} 

$yahooObj = new Yahoo(); //This is the addition 

?> 

이렇게하면 include_once('yahoo.php')을 호출 한 후에 $yahooObj 개체를 얻을 수 있습니다.

예?

+0

답장을 보내 주셔서 감사합니다. 그리고 인스턴스화에 대해? 어떻게 "Scripts"폴더 안에 클래스를 인스턴스화 할 수 있습니까? 감사합니다, –

0

각 클래스에 자체 소스 파일이 있다고 가정하면 'autoloading'으로 간주 할 수 있습니다. 내 자신의 프로젝트에서 나는 __autoload()를 사용하는 대신 이것을 달성하기 위해 spl_autoload_register() 함수를 사용합니다.

0

나는이처럼 스크랩 클래스의 이름을 당신을 제안 :

다음
Scrap_Yahoo 
Scrap_Google 
... 

당신은 Dutchie432 제안 무엇 :

당신의이 배열/공장 원하는대로 당신이 할 수있는 그런
$scraps = array(); 
foreach (glob('scripts/*.php') as $script) { 
    $scrap = 'Scrap_' . pathinfo($script, PATHINFO_FILENAME); 
    require_once($script); 
    $scraps[] = new $scrap(); 
} 

스크랩 :

foreach ($scraps as $scrap) { 
    $scrap->scrap(); 
} 

그런 다음 추상 방법 scrap()을 S 쓰레기 클래스 및 클래스 추상을하는 것을 잊지 마세요 : scripts/* 디렉토리에있는 모든 클래스 클래스 Scrap를 확장하고 그냥이 하나의 특정 방법 scrap()을 정의합니다

// file: Scrap.php 
abstract class Scrap { 
    public abstract scrap(); 
} 

.

더 나아갈 수 있으며 Template Method 디자인 패턴을 구현할 수 있습니다.

+0

안녕하세요, 답장을 보내 주셔서 감사합니다. 다음과 같이 객체를 호출하려고합니다. "$ Scrap_netempregos [0] -> teste = $ Scrap_netempregos [0] -> getPage ('http : //www.yahoo.com',''''off'); " 그러나 작동하지 않습니다. 나에게 "치명적인 오류 : 26 번째 줄의 C : \ xampp \ htdocs \ testes \ scrap \ example_usage.php에있는 비 객체에서 getPage() 함수를 호출하십시오." 나는 잘못된 방식으로 객체를 호출하고 있는가? 감사합니다, –

+0

@Andre 방금 내 대답을 업데이 트했습니다 – yegor256

0

찾고있는 패턴은 Strategy 또는 Command입니다.

스크레이퍼를 설치하는 데는 여러가지 옵션이 있습니다. 스크래퍼의 경로를 주요 Scrape 클래스에 하드 코딩하거나 설정 파일에서로드하거나 자동 로딩 또는 클래스 맵을 사용하거나 팩토리 또는 이들의 조합을 사용할 수 있습니다. 그건 당신에게 달려 있습니다. 응용 프로그램과 잘 작동하는 것을 결정하는 것이 훨씬 더 중요합니다.

이미 자동 로딩을 사용하고 있다면 스크래퍼를 찾을 수 있는지 확인하십시오. 추가 오토로더를 추가하려면 그렇게하십시오. 추가 된 보안 및 속도에 대한 클래스 맵을 선호하는 경우 클래스 맵 등을 사용하십시오. 모든 장단점에 대해 논의하는 것은이 질문의 범위를 벗어납니다. 이것에 관심이 있다면 this blog post about autoloading benchmarks (ZF2이지만 일반적으로 적용 가능)을보십시오.

긁어 모으기 위해 서로 의존하지 않으므로. Gearman 같은 스크립트를 순차적으로 실행하는 대신 다른 프로세스에서 비동기 적으로 실행하는 것이 좋습니다. 기본 스크립트는 적절한 설정으로 필요한 작업자 만 만들고 백그라운드 프로세스에서 실행할 수있게합니다. examples in the manual이 있으며 여기에 another one from the same site as the benchmarking article