上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

sleep-sort.example.com

$numbers = array_map('intval', (array)$_GET['numbers']);

$mh = curl_multi_init(); 
foreach($numbers as $number){
    $ch_list[$number] = curl_init("http://sleep-sort-api.example.com/?number=".$number);
    curl_setopt($ch_list[$number], CURLOPT_TIMEOUT, $number+1);
    curl_multi_add_handle($mh, $ch_list[$number]);
}

$active = null;  
echo '<html><head><title>sleep sort</title></head><body><ol>';
do {
    curl_multi_exec($mh, $active);
    $ready=curl_multi_select($mh);
    if($ready){
        while($info=curl_multi_info_read($mh)){
            echo '<li>'.floor(curl_getinfo($info['handle'], CURLINFO_TOTAL_TIME)).'</li>';
        }
    }
} while ($active && $ready);
echo '</ol></body></html>';


sleep-sort-api.example.com

$number = intval($_GET['number']);
sleep($number);
echo $number;
exit;


こんな感じ?動作確認はしてない。間違ってもapi側を海の向こうに置いたりしてはいけない。多い日もnumberの数だけサーバを立ててスケールアウトすれば安心。ただしトラフィックでネットワークは死ぬ。或いは

function sleep_sort($numbers){
    $max = max($numbers);
    foreach($numbers as $number){
        $buckets[$number] = $number;
    }

    $start = time();
    for($i=1; $i<=$max; $i++){
        $now = time()-$start;
        if($buckets[$now]){
            $result[] = $now;
        }
    }
    return $result;
}


Genius sorting algorithm: Sleep sort

バケットソート

真っ当にpcntlを使う版 PHPでsleep sort

先駆者 凄いバカなプログラム
スポンサーサイト
 最近UTF-8でWAMP(Windows+Apache+MySQL+PHP)環境を再構築しているのだけれど、セッション絡みのページがエラーを吐いて詰まってしまいました。

エラーメッセージは、Warning: Cannot modify header information - headers already sentうんたらかんたら。あんさん今からheader送ろうとしてるけど、もう既にheader出力してるやないとか何とか。

問題のコードはこんな感じ。

1行目 <?php
2行目 session_start();

いや、何も出力してないし。

1行目 <?php session_start();

こんな事もしてみたけどやっぱり同じエラーが1行目で検出される。

それで色々調べてみると、これはPHPのバグらしい。

Bug #22108 php doesn't ignore the utf-8 BOM

対象OSは全て、対象のPHPバージョンは全て、StatusはWont fix。

UTFについてはここが参考になった。

UTFとは何か

つまり、UTF-8と呼ばれているものにはBOM(Byte Order Mark、Little EndianかBig Endianかを区別するために先頭につけられるビット列)付きUTF-8とBOM無しUTF-8(UTF-8n)があり、PHPはこのBOM付きUTF-8のBOMをちゃんと処理(無視)してくれないという事。

1行目 <?php
2行目 session_start();

だと思っていたけれど、実際にはソースは

1行目 BOM(EFBBBF)<?php
2行目 session_start();

となっていて、このBOMをPHPがheaderと勘違いしてギャーギャー言っていたというわけだね、明智君。

というわけで、とりあえずファイルを全てUTF-8nで保存し直す事でエラーはでなくなり二時間の苦悩から開放されました。めでたしめでたし。
copyright © 2005 The elephant vanishes all rights reserved.
Powered by FC2ブログ.
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。