<?
php
$_SERVER['HTTP_HOST'] = ''
;
$fromUid =
isset(
$GLOBALS['argv'][3]) && (
intval(
$GLOBALS['argv'][3]) ==
$GLOBALS['argv'][3]) ?
$GLOBALS['argv'][3] : 0
;
$limitNum =
isset(
$GLOBALS['argv'][4]) && (
intval(
$GLOBALS['argv'][4]) ==
$GLOBALS['argv'][4]) ?
$GLOBALS['argv'][4] : 0
;
$onlyUpdateCheckedHasAvatar =
isset(
$GLOBALS['argv'][5]) && (
intval(
$GLOBALS['argv'][5]) == 1) ? 1 : 0
;
$newLogFile =
isset(
$GLOBALS['argv'][6]) && (
intval(
$GLOBALS['argv'][6]) == 1) ? 1 : 0
;
define('FROMUID',
$fromUid);
define('LIMITNUM',
$limitNum);
define('ONLY_UPDATE_CHECKED_HASAVATAR',
$onlyUpdateCheckedHasAvatar);
define('NEW_LOGFILE',
$newLogFile);
/**
* CheckUserAvatarStatus.class.php
* 2015-1-16
*/
/**
* 检查用户头像状态 > 临时文件 有差异的用户列表:用户Uid, 数据库中用户头像状态, 检查头像状态结果, 用户头像地址
* 更新用户头像状态 < 临时文件 - 有差异的用户列表
*/
class CheckUserAvatarStatus
extends Controller {
protected $objDCommonMember;
protected $avatarHost;
protected $fromUid;
// 开始检查的用户Uid, 按Uid倒序排列检查数据
protected $limitNum;
// 限制查查的个数
protected $pageSize;
protected $checkLocalAvatar;
// 1: 检查服务器上的avatar是否存在,2 : 还是url远程请求检查avatar是否存在
protected $diffLogFile;
protected $onlyUpdateCheckedHasAvatar;
// 仅仅更新原avatarstatus=0, 但检查用户头像存在的用户的头像状态
protected $newLogfile;
public function __construct() {
$this->objDCommonMember =
new \BBS\Dao\CommonMember();
$this->avatarHost = 'http://xxx.com/'
;
$this->fromUid =
FROMUID;
$this->limitNum =
LIMITNUM;
$this->onlyUpdateCheckedHasAvatar =
ONLY_UPDATE_CHECKED_HASAVATAR;
$this->pageSize = 50
;
$this->checkLocalAvatar = 2
;
$this->diffLogFile = '/tmp/check_user_avatarstatus_diff.txt'
;
$this->newLogfile =
NEW_LOGFILE;
}
public function doDefault() {
echo 'nothing'
;
exit();
}
public function doCheckUserAvatarStatus() {
if(
$this->
newLogfile) {
@unlink(
$this->
diffLogFile);
}
$limitNum =
$this->
limitNum;
if (
$limitNum) {
$this->_echo_msg('Limit num ' .
$limitNum);
} else {
$this->_echo_msg('No Limit num '
);
}
// sleep(2);
$condition = ''
;
if (
$this->
fromUid)
$condition .= 'uid < ' .
$this->
fromUid;
$total =
$this->objDCommonMember->fetchOne(
$condition, 'count(*)'
);
$total =
$total ?
array_pop(
$total) : 0
;
$this->_echo_msg('Total num ' .
$total);
if (!
$total)
exit();
$pages =
ceil(
$total /
$this->
pageSize);
$count = 0
;
for (
$i = 0;
$i <
$pages;
$i++
) {
$limit =
$i *
$this->pageSize . ',' .
$this->
pageSize;
$datas =
$this->objDCommonMember->findBy(
$condition,
$limit,
$limit, 'uid, username, avatarstatus', 'uid desc'
);
foreach (
$datas as $userInfo) {
$this->_echo_msg('check user ' .
$userInfo['uid'
]);
list(
$avatarStatus,
$avatarUrl) =
$this->_checkAvatarStatus(
$userInfo['uid'],
$userInfo['avatarstatus'
]);
if (
$avatarStatus !=
$userInfo['avatarstatus'
]) {
$this->_writeDiffFile(
$userInfo,
$avatarStatus,
$avatarUrl);
}
$count++
;
if (
$this->limitNum &&
$count >
$this->
limitNum) {
$this->_echo_msg('reach Limit num ' .
$this->
limitNum);
exit();
}
$this->_echo_msg('counter ' .
$count .'/' .
$total);
}
}
}
/**
* 根据差异文件,修改用户的头像状态 - 只更新原avatarstatus=0,但用户有头像的用户
*/
public function doUpdateUserAvatarStatus() {
$logRows =
file(
$this->
diffLogFile);
$logRows =
array_unique(
$logRows);
$logRows =
array_filter(
$logRows);
$pages =
ceil(
count(
$logRows) /
$this->
pageSize);
for (
$i = 0;
$i <
$pages;
$i++
) {
$datas =
array_slice(
$logRows,
$i *
$this->pageSize,
$this->
pageSize);
$has_uids =
$hasno_uids =
array();
foreach (
$datas as $value) {
$tmpVal =
explode("\t",
$value);
if (
$tmpVal[2] == '1'
) {
$has_uids[] =
$tmpVal[0
];
} else {
$hasno_uids[] =
$tmpVal[0
];
}
}
if (!
empty(
$has_uids)) {
$return =
$this->objDCommonMember->update(
array('avatarstatus' => 1),
array('uid' =>
$has_uids, 'avatarstatus' => 0
));
$this->_echo_msg('update user avatarstatus=1 return ' .
$return . "\n" .
implode(',',
$has_uids));
}
if(!
$this->
onlyUpdateCheckedHasAvatar) {
if (!
empty(
$hasno_uids)) {
$return =
$this->objDCommonMember->update(
array('avatarstatus' => 0),
array('uid' =>
$hasno_uids, 'avatarstatus' => 1
));
$this->_echo_msg('update user avatarstatus=0 return ' .
$return . "\n" .
implode(',',
$hasno_uids));
}
}
}
}
/**
* 头像状态不一致的,添加文件记录 - 只更新原avatarstatus=0,但用户有头像的用户
*/
private function _writeDiffFile(
$userInfo,
$avatarStatus,
$avatarUrl) {
$str =
$userInfo['uid'] . "\t" .
$userInfo['avatarstatus'] . "\t" .
$avatarStatus . "\t" .
$avatarUrl . "\n"
;
$return =
file_put_contents(
$this->diffLogFile,
$str,
FILE_APPEND);
$this->_echo_msg('add diff avatarstatus log return ' .
$return);
}
private function _checkAvatarStatus(
$uid,
$old_avatarstatus) {
$avatarUrl =
$this->_getAvatarUrl(
$uid);
$keepOld =
false;
if (
$this->checkLocalAvatar == 1
) {
$avatarDir =
$this->_getAvatarDir(
$uid);
$this->_echo_msg('avatarDir ' .
$avatarDir);
$return =
file_exists(
$avatarDir);
} else {
$this->_echo_msg('avatarUrl ' .
$avatarUrl);
$requestData =
$this->curlRequest(
$avatarUrl);
if (!
empty(
$requestData) &&
$requestData[1]['size_download'] == 4182) {
//默认小图大小
$keepOld =
true;
}
$return = !
empty(
$requestData) ? 1 : 0
;
}
$checkAvatarStatus =
$return ? 1 : 0
;
// 只记录检查有头像的log
if (
$this->onlyUpdateCheckedHasAvatar &&
$checkAvatarStatus == 0
) {
$keepOld =
true;
}
if (
$keepOld) {
$checkAvatarStatus =
$old_avatarstatus;
$this->_echo_msg('Keep Old avatar status ' .
$old_avatarstatus);
} else {
$this->_echo_msg('avatar status ' .
$checkAvatarStatus . ' old avatarstatus ' .
$old_avatarstatus);
}
return array(
$checkAvatarStatus,
$avatarUrl);
}
private function _getAvatarUrl(
$uid) {
$size = 'small'
;
$uid =
abs(
intval(
$uid));
$uid =
sprintf(" d",
$uid);
$dir1 =
substr(
$uid, 0, 3
);
$dir2 =
substr(
$uid, 3, 2
);
$dir3 =
substr(
$uid, 5, 2
);
$typeadd = ''
;
return $this->avatarHost .
$dir1 . '/' .
$dir2 . '/' .
$dir3 . '/' .
substr(
$uid, -2) .
$typeadd . "_avatar_
$size.jpg"
;
}
private function _getAvatarDir(
$uid) {
$size = 'small'
;
$uid =
abs(
intval(
$uid));
$uid =
sprintf(" d",
$uid);
$dir1 =
substr(
$uid, 0, 3
);
$dir2 =
substr(
$uid, 3, 2
);
$dir3 =
substr(
$uid, 5, 2
);
$typeadd = ''
;
return '/xxx/uc_server/data/avatar/' .
$dir1 . '/' .
$dir2 . '/' .
$dir3 . '/' .
substr(
$uid, -2) .
$typeadd . "_avatar_
$size.jpg"
;
}
/**
* curl获取指定路径内容
*/
private function curlRequest(
$url,
$method = '',
$postdata = '',
$isjson = 0
) {
$ch =
curl_init();
$post =
$method &&
strtolower(
$method) == 'post' ? 1 : 0
;
curl_setopt($ch, CURLOPT_URL,
$url);
if (
$post) {
curl_setopt($ch, CURLOPT_POST,
$post);
if (
$postdata) {
if (!
$isjson) {
$postdata =
http_build_query(
$postdata);
}
curl_setopt($ch, CURLOPT_POSTFIELDS,
$postdata);
}
}
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1
);
curl_setopt($ch, CURLOPT_HEADER, 0
);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60
);
curl_setopt($ch, CURLOPT_TIMEOUT, 80
);
if (
$isjson) {
curl_setopt($ch, CURLOPT_HTTPHEADER,
array(
'Content-Type:application/json',
'Content-Length:' .
strlen(
$postdata)
));
}
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"
);
$data = curl_exec(
$ch);
$datainfo = curl_getinfo(
$ch);
curl_close($ch);
if (
$datainfo['http_code'] == 200
) {
return array(
$data,
$datainfo);
} else {
return array();
}
}
public function run() {
$action =
$this->
action;
$this->
$action();
}
}
转载于:https://www.cnblogs.com/bandbandme/p/4228860.html
相关资源:电脑常见问题与故障1000例(高清PDF中文版)