PHPでリモートファイルの取得を並列化するAPI

ボブです。

リモートファイルの取得といっても規模や用途は様々ですが、多くの場合は単純にfile_get_contents等で取得してしまえば、要件を満たせるでしょう。

しかし、バッチで大量のURLからクロールするケースや、複数のURLから取得した結果をリアルタイムで表示するようなケースでは、レスポンスの遅い接続先に全体の処理時間が引っ張られてしまうような事もあります。そんな場合には複数のURLから並列でファイルを取得したい所です。

PHPだとプロセス制御関数を使う方法やcURL 関数を使う方法があります。

下記は後者でのサンプルクラスです。

class SampleCrawler{
	
	//並列リクエスト上限
	var $_multi_request_number = 5;
	
	//クロールしたいURLの一覧を
	//array("url"=>$対象URL, "last_crawl_datetime"=>$最後にクロールした日時)
	//で渡す
	function crawlUrl($url_list){
		foreach($url_list as $key=>$url){

//並列処理用リストに追加
$work_list[] = $url;
unset($url_list[$key]);

if(count($work_list) >= $this->_multi_request_number || !count($url_list)){
//マルチハンドラの作成
$mch = curl_multi_init();

foreach($work_list as $work){

//curlハンドラの作成
$ch = curl_init();

//正しい形式のURLであれば
if(($parsed_url = parse_url($work["url"])) && $work["url"]){
//リクエストヘッダの作成
$header[] = 'GET /'.$work["url"].' HTTP/1.1';
$header[] = 'Host: '.$parsed_url["host"];
$header[] = 'User-Agent: Sample Crawler - Version 0.1';

//クロールした事のあるURLならIf-Modified-Sinceヘッダを付ける
if($work["last_crawl_datetime"] != "0000-00-00 00:00:00"){
$time = strtotime($work["last_crawl_datetime"]);
$mod = date("r", $time - 3600 * 9);
$header[] = 'If-Modified-Since: '.$mod;
} else {
curl_setopt($ch, CURLOPT_ENCODING, 'gzip');
}

$header[] = 'Connection: close';
//d($header);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
unset($header);

curl_setopt($ch, CURLOPT_URL, $work["url"]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FILETIME, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);//5秒でタイムアウト
curl_setopt($ch, CURLOPT_FILETIME, 1);

//マルチハンドラに登録
curl_multi_add_handle($mch, $ch);
$ch_list[] = $ch;
}

}

//マルチハンドルで並列リクエスト
if($ch_list){
$running=null;
do {curl_multi_exec($mch, $running);} while ($running > 0);

foreach( $ch_list as $ch ) {
// ステータスとコンテンツ内容の取得
$status = curl_getinfo($ch);
//d($status);
//ステータスコードが正常系(2XX)であれば
if(substr($status["http_code"], 0, 1) == "2" && $status["size_download"]){
//取得したコンテンツを処理
$this->process($status["url"], curl_multi_getcontent($ch), $status);
}

//マルチハンドルからcurlハンドル削除
curl_multi_remove_handle($mch, $ch);
curl_close($ch);
}
}

//マルチハンドル閉じ
curl_multi_close($mch);
unset($ch_list);
unset($work_list);
}
}
}

//クロールで取得した文字列を処理
function process($url, $contents, $status){

}

}

取得したコンテンツに何らかの処理(パースなど)をする必要があれば、processメソッドをオーバーライドして実装します。

※参考
APIとの通信効率をよくする実装例
PHPで並行処理

[Firefox]キーボードのみを使って高速ブラウジングFirefox

とくながです。

前回はFirefoxの拡張機能である、Firebugをさらに拡張するアドオン
ご紹介させて頂きました。今回は、Firefoxをキーボードのみを使って
高速ブラウジングする方法についてです。

プログラマーはもちろんですが、デザイナー場合でも、
キーボードからマウスに持ち変えるという動作はロスタイムです。
いかに持ち変える回数を減らすかというのも、業務効率化の上では重要です。

基本的なショートカットを覚える

キーボードでブラウジングする際、最低限必要なショートカットキーは以下となります。
進む...Alt + → (Shift + BackSpace)
戻る...Alt + ← (BackSpace)
下へスクロール...Space
上へスクロール...Shift + Spacce
タブを開く...Ctrl + T
閉じたタブを元に戻す...Ctrl + U
リンクを新しいタブで開く...Ctrl + Enter
右のタブへ移動...Ctrl + Tab
左のタブへ移動...Ctrl + Tab
タブを閉じる...Ctrl + W
更新...F5 (Ctrl + R)
次の項目...Tab
前の項目...Shift + Tab
また、マストではありませんが、覚えておくと非常に役立つものはこちら
検索...Ctrl + F
ステータスバーに移動...Ctrl + L
検索バーに移動...Ctrl + K
お気に入りバー表示...Ctrl + B
履歴バーを表示...Ctrl + H
ソースを表示...Ctrl + U
新しいウインドウを表示...Ctrl + N
ウインドウを綴じる...Alt + F4(Ctrl + Shift + W)

アドオン「LoL」でスムーズにリンクを辿る

キーボードのみでブラウジングする場合、壁になるのがリンクの移動ですね。
Tabを使えば一応可能ですが、マウスに持ち替えた方が圧倒的に早いです。

そこで、LoLというアドオンを使います。このアドオンを有効にすると、
ページ上のすべてのリンクに番号が割り振られ、番号を入力すると、
対応するリンク先へ移動するという仕組みです。

20091014.jpg

これで、キーボードだけでの高速ブラウジングが可能になります。

Dreamweaverで正規表現を使用して置換する方法 その2Dreamweaver

どうもこんにちは、ハラです。

グラコロが発売されましたね。
この時期のマックは期間限定メニューが多くて、すこしハッピーです。
そんなグラコロ食べながら投稿です。

前回は、Dreamweaverで正規表現を使用して置換する方法でした。

はい、復習はおっけーですか?


今回はほんの少しだけ掘り下げてみようと思います。

前回お伝えしました(.*)
改行以外のすべての単一文字を0回以上繰り返す
という意味ですが、
意図しないところまでさくっと選択されてしまう時があります。

たとえば、

<select> <option value="ほぼ食べる">グラコロ</option>
<option value="よく食べる">チキンナゲット</option>
<option value="だいぶ食べる">ポテト</option>
</select><

上記で、valueの値だけ置換したいとします。

ctrl+Fで
検索: <option value="(.*)>
だと
<option>の中がすべて選択されてしまいます。

20091013a.jpg

その時は、

(.*?)

を使いましょう。

これは
改行以外のすべての単一文字をなるべく少ない回数だけマッチさせるという意味。

これでだいぶ、検索の判定力が向上します。

20091013b.jpg
ですが、もっとスマートに絞り込める正規表現もあります。

絞り込んだ検索・置換

(.*)はなにもかも全て判定されますが、
[\w]*[\d]*というふうに書くと、
数字だけ、英数字だけといった条件指定が可能になります。

¥w→下線を含む、英数字 1 つ。[A-Za-z0-9_] と同じ
¥d→数字1文字。数字 1 文字。[0-9] と同じ
¥s→スペース、タブ、用紙送り、改行を含むホワイトスペース1つ
参考:adobe正規表現

奥が深いですね。
こうすることで、検索でも絞り込んでいくことが可能です。

たとえば、

<table>
  <tr>
   <th>電話番号</th>
   <td>03-5464-1177</td>
 </tr>
 <tr>
    <th>携帯電話</th>
   <td>090-1234-5678</td>
 </tr>
</table>

tdの中を検索したい時。

<td>(.*?)>

<td>(.*)</td>

<td>[\w]+-[\w]+-[\w]+</td>
で引っかかります。
ですが、そのままだと電話番号も携帯番号も検索されてしまいます。

携帯番号だけ検索・置換をする時は

検索:\d{3}-\d{4}-\d{4}

とすれば、
「3桁-4桁-4桁」の「数字のみ」検索として絞り込むことができます。
{}の中に桁数が入っているのですね。

もちろん、$nも使えます。 たとえば、

<img src="/img/image-A.jpg" alt="サンプルイメージA" />
<img src="/img/image-B.jpg" alt="サンプルイメージB" />
<img src="/img/image-C.jpg" alt="サンプルイメージC" />
上記のimage-A.jpg(ダッシュ)からimage_A.jpg(アンダーバー)に代える場合。

検索:/([\w]*)-([\w]*).
置換:/
$1_$2.
です。

 

このように正規表現は、Web制作の中でいろんな場面に出てきて奥が深いものです。
今回紹介した正規表現は、まだまだ入り口付近のものばかり。

これを機会にWebデザイナーの皆さんも正規表現について理解を深めてみてはいかがでしょう。

サイト作成時、参考にしているサイトPHP

おはようございます。
秋っぽい朝の雰囲気はいいですね。
ビルからの眺めがいいですねえ。京茶華です。
本日はサイト作成をしている時に、よく利用するサイトをご紹介します。

PHPの関数とかを探すとき



PHP:Hypertext Preprocessor

いわずと知れたPHPのマニュアルサイトですね。
右上の「function list」に例えば「encoding」と入れることで、
encode系の関数一覧が出るので非常に便利です。

正規表現をチェックしたいとき



PHP正規表現チェッカー

正規表現をチェックするのが面倒なことはよくありますが、「PHP正規表現チェッカー」を利用することで、非常に簡単にチェックすることができます。
方法としては、「パターン文字列」に正規表現を記述して、対象文字列に想定するURLなどを入れるだけです。

SQL文で詰まってしまったとき



SAK Streets - SQL 開発言語資料

SQL文が複雑になったときや、なぜかエラーが出てしまうときなど、
初心に立ち返って調べたい時などに非常に参考になります。

Smartyで、ちょっと迷った時



Smarty

こちらも王道なサイトですが。
Smartyを使う機会は多いのですが、このサイトを見てみると、あ!こんな方法があったか!みたいな発見もあったりするので、
開いておくと便利です。

検索するときに便利な方法



上記したようなサイトだと、
どうしても情報量が多くて、サイトにたどり着いたはいいものの、探すのが大変です。

なので、
  Ctrl + F


で、とりあえずサイト内検索した後、

  Alt + A


を押して、検索語をハイライト表示することで、
よりわかりやすく、より検索能力を上げることができるので、
そちらもオススメです。

以上です!
朝からレッツプログラミング!


ベンチャー企業の電話( ひかりビジネス+ Asterisk + FreePBX + SNOM220 )社内システム

濱田です。
台風で今朝からAoビルがぐらぐら揺れてました。
風速が80mを越えるとスーパー台風っていうんですね。

本日はサイブリッジの電話システムについて紹介します。

サイブリッジでは、かれこれ3年位前からオープンソースPBXのAsteriskというものを使っています。
管理にはWEBインターフェスのFreePBXを採用。UIはこんな感じ。

freepbx.jpg

この組み合わせはかなりメジャーになってきてるみたいですね。
「電話ありがとうございます、○○のご用の方は1を。」といったIVR(音声自動応答装置)なども簡単に設定可能。

電話機本体は過去に投げ売りをされたSNOM220という機種を愛用しています。最近でもebayにちょこちょこでているので買い増していたり。他にもちょっとリッチにCiscoの電話も。

phone-thumb-150x112-280.jpg

また、回線にはひかり電話ビジネスタイプを契約しています。
ひかり電話ビジネスにはBフレッツのベーシック以上のプランが必要なので、最低の固定費で
1万円(Bフレッツベーシック)+3,200円(ひかり電話基本料)がかかります。
チャンネルが1ch毎に800円/月、03電話番号が1番号100円/月なっておりトータルで考えるとかなり割安です。
ですので社員1人1人に03番号を割り当てています。

NTTの担当者曰く最近はちょこちょこAsteriskつないでいる方も増えてきたとか。
導入したときはAsteriskって何ですか?って反応だったのですが。笑

コスト的にも魅力なIP電話なのですが、オープンソースということもあり
AsteriskにはAGIと呼ばれるAPIというものが用意されており、他のアプリケーションと連携できたり様々な拡張が可能になっています。

その中でも社内音楽サーバと連携をし社内のBGMの音量を調整できるように拡張していたりします。(電話中にBGMがうるさくなりすぎないように)
発信・着信のタイミングでwindowsをコマンドラインでボリュームの調整をするだけのシンプルな実装ですが、意外と驚かれたり。

他にも、エントランスにはタッチパネルを用意し画面に沿って担当者を呼び出せるというようなシステムもあります。

またグループウェア(自社開発)と連携して、ブラウザから電話番号をクリックするだけで登録されている顧客番号に発信出来る仕組みも作りました。

機会があれば実装方法や、構築方法にも触れていきたいと思います。

お客様のIP電話の構築などもお手伝いなどもしているので、何かあればお問い合わせください!
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |