ビッグデータ処理のいくつかの思想

2939 ワード

一:大きな配列をファイルに転送し、行ごとに書き込むことを考慮し、マルチプロセスに合わせて書き込むことができます.
/*

 *       :$file    	   

 *			 $key	   	    

 *			 $value	   	    

 *			 $step    	      ,     :   init/   doing/  done

 *       :          php   ,           ,         

 *       :yishuguang

 */

function appendArrayToFile($file, $key = '', $value = '', $step = 'init') {

	static $rows = array();

	$md5String = md5($file);

	

	//     

	if($step == 'init') {

		file_put_contents($file, '<?php return array('."
", LOCK_EX); return true; } // if($step == 'doing') { if(!isset($rows[$md5String])) $rows[$md5String] = array(); if($key != '' || $value != '') { $rows[$md5String][] = "\t'".addslashes($key)."'=>'".addslashes($value)."',
"; } } // , if(count($rows[$md5String]) > ARRAY_TO_PHP_APPEND_ROW_LIMIT || $step == 'done') { file_put_contents($file, implode('', $rows[$md5String]), FILE_APPEND); unset($rows[$md5String]); } if($step == 'done') { file_put_contents($file, ");", FILE_APPEND); } return true; }


$fileUnionLo = FILE_DIR.'/unionLo.php';
appendArrayToFile($fileUnionLo, '', '', 'init');
foreach($tempUsers as $uid => $url) { //$tempUsers
    if(is_array($url)) {
        foreach($url as $innerUrl) {
            appendArrayToFile($fileUnionLo, $innerUrl, $uid, 'doing');
        }
    } else {
        appendArrayToFile($fileUnionLo, $url, $uid, 'doing');
    }
}
appendArrayToFile($fileUnionLo, '', '', 'done');

 
二:データをキャプチャする際にcurlを利用して複数のプロセスのキャプチャを開く
//           

$handles = array();

$multiHandle = curl_multi_init();

for($i = 1; $i < $totalPage; $i++) {

	$url = URL_JIFEN_USER.$i;

	$handle = curl_init($url);

	curl_setopt($handle, CURLOPT_URL, $url);

	curl_setopt($handle, CURLOPT_HEADER, 0);

	curl_setopt($handle, CURLOPT_RETURNTRANSFER, 1);

	curl_multi_add_handle($multiHandle, $handle);

	$handles[$i] = $handle;

}



$runing = 0;

do {

	$flag = curl_multi_exec($multiHandle, $runing);

} while($flag === CURLM_CALL_MULTI_PERFORM || $runing > 0);



//    

$jsons = array();

$errorUrls = array();

foreach($handles as $page => $handle) {

	$httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE);

	//      200        

	if($httpCode == 200) {

		$jsons[$page] = curl_multi_getcontent($handle);

	} else {

		$errorUrls[] = str_replace('HTTP://', 'http://', curl_getinfo($handle, CURLINFO_EFFECTIVE_URL));

	}

	curl_multi_remove_handle($multiHandle, $handle);

}

curl_multi_close($multiHandle);