ビッグデータ処理のいくつかの思想
2939 ワード
一:大きな配列をファイルに転送し、行ごとに書き込むことを考慮し、マルチプロセスに合わせて書き込むことができます.
二:データをキャプチャする際にcurlを利用して複数のプロセスのキャプチャを開く
/*
* :$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);