私のプログラムが何をするかから始めましょう。コントローラのインデックス機能は、URLとキーワードの配列を受け取り、それらをDBに保存します。これで、crawlLinkメソッドはすべてのキーワードとURLを取得します。URLですべてのキーワードが検索され、すべてのURLのサブリンクが生成されてDBに再度保存され、キーワードも検索されます。キーワードは、検索方法を使用して各リンクで検索されます。サブリンクは、 extract_links関数を使用してすべてのURLから抽出されます。searchとextract_linksの両方に、 cURLを使用してページの完全なコンテンツを取得するget_web_pageというメソッドがあります。get_web_pageはで 1回使用されますウェブページからキーワードを抽出できるようにウェブページのコンテンツを取得する検索機能。また、extract_links関数で、有効なページコンテンツを持つリンクを抽出するために使用されます。
これで、crawlLinkは検索関数を2回呼び出します。1回目はドメインリンクからキーワードを抽出し、2回目はサブリンクからキーワードを抽出します。したがって、get_web_pageは3回呼び出されます。約150のリンクのコンテンツを取得するのに約5分かかります。また、3回と呼ばれるため、処理時間は15分かかります。その期間中は何もできません。したがって、このプロセスをバックグラウンドで実行し、処理中にそのステータスを表示したいと思います。extract_linksとget_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ビット