1

私のプログラムが何をするかから始めましょう。コントローラのインデックス機能は、URLとキーワードの配列を受け取り、それらをDBに保存します。これで、crawlLinkメソッドはすべてのキーワードとURLを取得します。URLですべてのキーワードが検索され、すべてのURLのサブリンクが生成されてDBに再度保存され、キーワードも検索されます。キーワードは、検索方法を使用して各リンクで検索されます。サブリンクは、 extract_links関数を使用してすべてのURLから抽出されます。searchextract_linksの両方に、 cURLを使用してページの完全なコンテンツを取得するget_web_pageというメソッドがあります。get_web_pageはで 1回使用されますウェブページからキーワードを抽出できるようにウェブページのコンテンツを取得する検索機能。また、extract_links関数で、有効なページコンテンツを持つリンクを抽出するために使用されます。

これで、crawlLink検索関数を2回呼び出します。1回目はドメインリンクからキーワードを抽出し、2回目はサブリンクからキーワードを抽出します。したがって、get_web_pageは3回呼び出されます。約150のリンクのコンテンツを取得するのに約5分かかります。また、3回と呼ばれるため、処理時間は15分かかります。その期間中は何もできません。したがって、このプロセスをバックグラウンドで実行し、処理中にそのステータスを表示したいと思います。extract_linksget_web_pageは、include_onceを使用してコントローラーに含まれます。

get_web_page関数は次のとおりです。

function get_web_page( $url )
{
    $options = array(
    CURLOPT_RETURNTRANSFER => true,     // return web page
    CURLOPT_HEADER         => false,    // don't return headers
    CURLOPT_FOLLOWLOCATION => true,     // follow redirects
    CURLOPT_ENCODING       => "",       // handle compressed
    CURLOPT_USERAGENT      => "spider", // who am i
    CURLOPT_AUTOREFERER    => true,     // set referer on redirect
    CURLOPT_CONNECTTIMEOUT => 120,      // timeout on connect
    CURLOPT_TIMEOUT        => 120,      // timeout on response
    CURLOPT_MAXREDIRS      => 10,       // stop after 10 redirects
    );

    $ch      = curl_init( $url );
    curl_setopt_array( $ch, $options );
    $content = curl_exec( $ch );
    $err     = curl_errno( $ch );
    $errmsg  = curl_error( $ch );
    $header  = curl_getinfo( $ch );
    curl_close( $ch );

    $header['errno']   = $err;
    $header['errmsg']  = $errmsg;
    $header['content'] = $content;
    return $header;
}

ユーザーからのURLとキーワードの1回の入力は、タスクと見なすことができます。これで、このタスクを開始でき、バックグラウンドで実行が開始されます。同時に、別のタスクを定義して開始することができます。各タスクには、「To Do」、「In Progress」、「Pending」、「Done」などのステータスがあります。OscarDiasのSimple Task Boardは、タスクを表示する正確な方法です。

私はバックグラウンドで関数を実行するための非常に多くの方法について読んだので、今はどのアプローチを採用するかについてジレンマに陥っています。exec、pcntl_fork、Gearmanなどについて読みましたが、使用したくないCLIが必要です。CygwinでGearmanをインストールしようとしましたが、libeventが見つからないため、Gearmanのインストールでスタックしました。libeventを個別にインストールしましたが、それでも機能しません。そしてGearmanはCLIを必要としているので、それを削除しました。CRONも使いたくないです。自分のシナリオでどのアプローチが最適かを知りたいだけです。

PHP5.3.8を使用しています| Codeigniter 2.1.3 | Apache 2.2.21 | MySQL 5.5.16 | Windows764ビット

4

3 に答える 3

1

あなたの問題は、Windowsです。

Windowsは、バックグラウンドタスクやcronジョブの実行にはあまり適していません。ツールはありますが、制限があります。

しかし、これも必要ですか?ほとんどのサーバーはLinuxなので、Windowsでテストして移行してみませんか。

-

2番目の部分はコマンドラインです-新しいプロセスを開始する場合に必要です(これを実行します)。しかし、tiはそれほど怖いものではありません。CodeIgniterは非常にシンプルです:

http://ellislab.com/codeigniter/user-guide/general/cli.html

于 2013-02-04T06:25:14.830 に答える
0

nohupプロセスまたはcronジョブを使用して実行できます.............以下のリンクを参照してください

nohup:バックグラウンドでPHPプロセスを実行する

Linuxでのphp5バックグラウンドプロセスの実行

https://nsaunders.wordpress.com/2007/01/12/running-a-background-process-in-php/

于 2013-02-04T06:23:32.617 に答える
0

私が達成しようとしていた上記のアプローチは、Windowsでは実装できないようでした。質問にリストされている多くのメソッドは、削除または変更されています。次に、の使用を含む回避策に移りましたAJAX

コントローラメソッドをajaxリクエストとして実行し、新しいAJAXリクエストごとに増分するカウントを与えます。処理は続行されますが、各リクエストを中止することはできますが、プロジェクトが不完全な場合でも、最終的には結果が重要になります。また、ブラウザが開いている場合、そのリクエストは完了し、後でユーザーは完全な結果を確認できます。

タスクの処理を停止すると、キャンセルされたアイコンが表示され、タスクがキャンセルされる前に生成された結果を表示する結果ページを指すリンクが表示されます。AJAXが失敗した場合、またはAJAXが成功した場合、クライアントからサーバーに送信されたタスクのカウントをサーバーからクライアントに送り返します。したがって、結果は固有のタスクに対して表示され、混乱することはありません。

ただし、特定のタスクがどの程度進行したかを追跡することはできません。実行にかかった時間を特定できません。したがって、このアプローチは私にとってはうまくいきますが、いくつかの欠点があります。主な目的は、ユーザーがタスクの進行中に待機してはならないことでした。これは、上記の回避策によって何らかの形で達成されます。

于 2013-03-23T11:24:48.807 に答える