2011-01-04 2 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! 
    } 

} 
?> 

End note:ウェブサイトをスクラップするには、 "Scripts"フォルダ内に作成されたすべてのクラスをコール/インスタンス化する必要があります。私の疑問は、約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オブジェクトも取得します。

ya dig?

+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/*ディレクトリ内

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

すべてのクラスは、クラスScrapを拡張し、この1つのだけ特定の方法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のようなものを調べて、同じスクリプトではなく、異なるプロセスでこれらを非同期で実行することをお勧めします。メインスクリプトは必要なワーカーを適切な設定で作成し、バックグラウンドプロセスで実行させます。 があり、ここにはanother one from the same site as the benchmarking article

関連する問題