Парсер PHP/JSON для динамического изображения не работает правильно
Я так близок к тому, чтобы заставить работать этот парсер / образ, но у меня есть несколько последних проблем, которые мешают мне выпустить его. Что еще хуже, я понятия не имею, в чем проблема.
Ниже приведен весь код:
<?php
ini_set('display_errors','On');//Remove when done
error_reporting(E_ALL|E_STRICT);//Remove when done
//header("Content-Type:image/png");//Removed for troubleshooting purposes only
function FAHUser($user){
$dom=new DOMDocument();
$html=file_get_contents('http://folding.extremeoverclocking.com/user_summary.php?s=&u='.$user);
$dom->loadHTML($html);
$td=$dom->getElementsByTagName('table')->item(6)->getElementsByTagName('tr')->item(1)->getElementsByTagName('td');
$json=array(
"userName"=>$dom->getElementsByTagName('h1')->item(0)->textContent,
"userTeamRank"=>$td->item(0)->textContent,
"userOverallRank"=>$td->item(1)->textContent,
"userPoints"=>$td->item(6)->textContent,
"userPPD"=>$td->item(3)->textContent
);
$json['date']=date("Y-m-d G:i:s");
$userInfo=fread(fopen("scripts/users.json","r"),filesize("scripts/users.json"));
$userInfoArr=json_decode($userInfo);
$userInfoArr->{$user}=$json;
$userInfoArr=json_encode($userInfoArr);
$userInfo=fopen("scripts/users.json","w");
fwrite($userInfo,$userInfoArr);
fclose($userInfo);
return json_decode($userInfoArr);
}
function FAHTeam($team){
$dom=new DOMDocument();
$html=file_get_contents('http://folding.extremeoverclocking.com/team_summary.php?s=&t='.$team);
$dom->loadHTML($html);
$td=$dom->getElementsByTagName('table')->item(6)->getElementsByTagName('tr')->item(1)->getElementsByTagName('td');
$json=array(
"teamName"=>$dom->getElementsByTagName('h1')->item(0)->textContent,
"teamRank"=>$td->item(0)->textContent,
"teamPoints"=>$td->item(9)->textContent,
"teamPPD"=>$td->item(3)->textContent,
"teamToday"=>$td->item(7)->textContent
);
$json['date']=date("Y-m-d G:i:s");
$teamInfo=fread(fopen("scripts/teams.json","r"),filesize("scripts/teams.json"));
$teamInfoArr=json_decode($teamInfo);
$teamInfoArr->{$team}=$json;
$teamInfoArr=json_encode($teamInfoArr);
$teamInfo=fopen("scripts/teams.json","w");
fwrite($teamInfo,$teamInfoArr);
fclose($teamInfo);
return json_decode($teamInfoArr);
}
function BOINCUser($user){
$dom=new DOMDocument();
$html=file_get_contents('http://boincstats.com/en/stats/-1/user/detail/'.$user.'/projectList');
$dom->loadHTML($html);
$tr=$dom->getElementsByTagName('table')->item(0)->getElementsByTagName('tr')->item(1);
$ttl=str_replace(',','',$tr->getElementsByTagName('td')->item(1)->textContent);
$tot=number_format(round($ttl));
$json=array(
"userName"=>$dom->getElementsByTagName('span')->item(0)->textContent,
"userTeamRank"=>$tr->getElementsByTagName('td')->item(10)->textContent,
"userOverallRank"=>$tr->getElementsByTagName('td')->item(6)->textContent,
"userPoints"=>$tot,
"userPPD"=>$tr->getElementsByTagName('td')->item(3)->textContent
);
$json['date']=date("Y-m-d G:i:s");
$userInfo=fread(fopen("scripts/boincusers.json","r"),filesize("scripts/boincusers.json"));
$userInfoArr=json_decode($userInfo);
$userInfoArr->{$user}=$json;
$userInfoArr=json_encode($userInfoArr);
$userInfo=fopen("scripts/boincusers.json","w");
fwrite($userInfo,$userInfoArr);
fclose($userInfo);
return json_decode($userInfoArr);
}
function BOINCTeam($team){
$dom=new DOMDocument();
$html=file_get_contents('http://boincstats.com/en/stats/-1/team/detail/'.$team.'/projectList');
$dom->loadHTML($html);
$tr=$dom->getElementsByTagName('table')->item(0)->getElementsByTagName('tr')->item(1);
$ttl=str_replace(',','',$tr->getElementsByTagName('td')->item(1)->textContent);
$tot=number_format(round($ttl));
$json=array(
"teamName"=>$dom->getElementsByTagName('span')->item(0)->textContent,
"teamRank"=>$tr->getElementsByTagName('td')->item(6)->textContent,
"teamPoints"=>$tot,
"teamPPD"=>$tr->getElementsByTagName('td')->item(3)->textContent,
"teamToday"=>$tr->getElementsByTagName('td')->item(7)->textContent
);
$json['date']=date("Y-m-d G:i:s");
$teamInfo=fread(fopen("scripts/boincteams.json","r"),filesize("scripts/boincteams.json"));
$teamInfoArr=json_decode($teamInfo);
$teamInfoArr->{$team}=$json;
$teamInfoArr=json_encode($teamInfoArr);
$teamInfo=fopen("scripts/boincteams.json","w");
fwrite($teamInfo,$teamInfoArr);
fclose($teamInfo);
return json_decode($teamInfoArr);
}
if(isset($_GET['u'])&&isset($_GET['t'])&&!isset($_GET['w'])){
$userInfoFile=fopen('scripts/users.json','r');
$userInfo=fread($userInfoFile,filesize('scripts/users.json'));
fclose($userInfoFile);
$userInfo=json_decode($userInfo);
isset($userInfo->{$_GET['u']})?$user=$userInfo->{$_GET['u']}:$user=FAHUser($_GET['u'])->{$_GET['u']};
$hours=(strtotime(date("Y-m-d G:i:s"))-strtotime($user->date))/3600;
//if($hours>=3){//Removed for troubleshooting purposes only
FAHUser($_GET['u']);
//}//Removed for troubleshooting purposes only
$user=$userInfo->{$_GET['u']};
$teamInfoFile=fopen('scripts/teams.json','r');
$teamInfo=fread($teamInfoFile,filesize('scripts/teams.json'));
fclose($teamInfoFile);
$teamInfo=json_decode($teamInfo);
isset($teamInfo->{$_GET['t']})?$team=$teamInfo->{$_GET['t']}:$team=FAHTeam($_GET['t'])->{$_GET['t']};
$hours=(strtotime(date("Y-m-d G:i:s"))-strtotime($team->date))/3600;
//if($hours>=3){//Removed for troubleshooting purposes only
FAHTeam($_GET['t']);
//}//Removed for troubleshooting purposes only
$FAHBOINC=" F@H User:";
$pointRank="Points Today:";
}elseif(!isset($_GET['u'])&&isset($_GET['t'])&&isset($_GET['w'])){
$userInfoFile=fopen('scripts/boincusers.json','r');
$userInfo=fread($userInfoFile,filesize('scripts/boincusers.json'));
fclose($userInfoFile);
$userInfo=json_decode($userInfo);
isset($userInfo->{$_GET['w']})?$user=$userInfo->{$_GET['w']}:$user=BOINCUser($_GET['w'])->{$_GET['w']};
$hours=(strtotime(date("Y-m-d G:i:s"))-strtotime($user->date))/3600;
//if($hours>=3){//Removed for troubleshooting purposes only
BOINCUser($_GET['w']);
//}//Removed for troubleshooting purposes only
$user=$userInfo->{$_GET['w']};
$teamInfoFile=fopen('scripts/boincteams.json','r');
$teamInfo=fread($teamInfoFile,filesize('scripts/boincteams.json'));
fclose($teamInfoFile);
$teamInfo=json_decode($teamInfo);
isset($teamInfo->{$_GET['t']})?$team=$teamInfo->{$_GET['t']}:$team=BOINCTeam($_GET['t'])->{$_GET['t']};
$hours=(strtotime(date("Y-m-d G:i:s"))-strtotime($team->date))/3600;
//if($hours>=3){//Removed for troubleshooting purposes only
BOINCTeam($_GET['t']);
//}//Removed for troubleshooting purposes only
$FAHBOINC="BOINC User:";
$pointRank=" Ranks Risen:";
}else{
//Error
}
isset($_GET['b'])&&file_exists("images/sigimages/".$_GET['b'].".png")?$template=imagecreatefrompng("images/sigimages/".$_GET['b'].'.png'):$template=imagecreatefrompng('images/sigimages/luna1.png');
strlen($user->userName)>14?$username=substr($user->userName,0,14)."...":$username=$user->userName;
strlen($team->teamName)>13?$teamname=substr($team->teamName,0,13)."...":$teamname=$team->teamName;
$white=imagecolorallocate($template,255,255,255);
$yellow=imagecolorallocate($template,255,255,0);
$font='images/fonts/UbuntuMono-R.ttf';
imagettftext($template,10,0,28,25,$white,$font,$FAHBOINC);
imagettftext($template,10,0,105,25,$yellow,$font,$username);
imagettftext($template,10,0,15,37,$white,$font,'Rank on Team:');
imagettftext($template,10,0,105,37,$yellow,$font,$user->userTeamRank);
imagettftext($template,10,0,15,49,$white,$font,'Overall Rank:');
imagettftext($template,10,0,105,49,$yellow,$font,$user->userOverallRank);
imagettftext($template,10,0,22,61,$white,$font,'User Points:');
imagettftext($template,10,0,105,61,$yellow,$font,$user->userPoints);
imagettftext($template,10,0,42,73,$white,$font,'User PPD:');
imagettftext($template,10,0,105,73,$yellow,$font,$user->userPPD);
imagettftext($template,10,0,219,25,$white,$font,'Team Name:');
imagettftext($template,10,0,289,25,$yellow,$font,$teamname);
imagettftext($template,10,0,199,37,$white,$font,'Rank of Team:');
imagettftext($template,10,0,289,37,$yellow,$font,$team->teamRank);
imagettftext($template,10,0,206,49,$white,$font,'Team Points:');
imagettftext($template,10,0,289,49,$yellow,$font,$team->teamPoints);
imagettftext($template,10,0,226,61,$white,$font,'Team PPD:');
imagettftext($template,10,0,289,61,$yellow,$font,$team->teamPPD);
imagettftext($template,10,0,199,73,$white,$font,$pointRank);
imagettftext($template,10,0,289,73,$yellow,$font,$team->teamToday);
//imagepng($template);//Removed for troubleshooting purposes only
?>
Вот пастбин, чтобы упростить поиск строк. Кроме того, любая строка, показанная как удаленная в целях устранения неполадок, должна рассматриваться как обычные строки без комментариев. Я просто прокомментировал их, чтобы немного облегчить поиск неисправностей.
Теперь это работает так: три переменные $_GET называются u
, t
, а также w
, Если первые две переменные установлены, первая инструкция if проходит. Если вторая и третья переменные установлены, вторая инструкция if проходит. В обоих случаях парсер просто берет данные и сохраняет их в файлах.json, так что это выглядит примерно так (где первое число - это идентификатор пользователя):
{"601869":{"userName":"hiigaran","userTeamRank":"33","userOverallRank":"6,923","userPoints":"8,297,436","userPPD":"10,656","date":"2014-04-19 20:53:00"}}
Прежде всего, я получаю много предупреждений, таких как:
Warning: DOMDocument::loadHTML(): Unexpected end tag : b in Entity, line: 280 in D:\xampp\htdocs\sigimage.php on line 8
Тем не менее, я думаю, что я могу отклонить их, так как они не являются проблемами с моей стороны, и не являются помехой для анализа или сохранения данных. Однако у меня есть куча других вопросов. При первом использовании, где у меня есть пустые файлы.json, это сообщения, которые я получаю, когда проходит первый оператор if:
Warning: fread(): Length parameter must be greater than 0 in D:\xampp\htdocs\sigimage.php on line 99
Warning: fread(): Length parameter must be greater than 0 in D:\xampp\htdocs\sigimage.php on line 18
Warning: Creating default object from empty value in D:\xampp\htdocs\sigimage.php on line 20
Warning: fread(): Length parameter must be greater than 0 in D:\xampp\htdocs\sigimage.php on line 18
Warning: Creating default object from empty value in D:\xampp\htdocs\sigimage.php on line 20
Notice: Trying to get property of non-object in D:\xampp\htdocs\sigimage.php on line 107
Warning: fread(): Length parameter must be greater than 0 in D:\xampp\htdocs\sigimage.php on line 109
Warning: fread(): Length parameter must be greater than 0 in D:\xampp\htdocs\sigimage.php on line 40
Warning: Creating default object from empty value in D:\xampp\htdocs\sigimage.php on line 42
Warning: fread(): Length parameter must be greater than 0 in D:\xampp\htdocs\sigimage.php on line 40
Warning: Creating default object from empty value in D:\xampp\htdocs\sigimage.php on line 42
Notice: Trying to get property of non-object in D:\xampp\htdocs\sigimage.php on line 145
Notice: Trying to get property of non-object in D:\xampp\htdocs\sigimage.php on line 145
Notice: Trying to get property of non-object in D:\xampp\htdocs\sigimage.php on line 153
Notice: Trying to get property of non-object in D:\xampp\htdocs\sigimage.php on line 155
Notice: Trying to get property of non-object in D:\xampp\htdocs\sigimage.php on line 157
Notice: Trying to get property of non-object in D:\xampp\htdocs\sigimage.php on line 159
Или, если он проходит второй оператор if:
Warning: fread(): Length parameter must be greater than 0 in D:\xampp\htdocs\sigimage.php on line 121
Warning: fread(): Length parameter must be greater than 0 in D:\xampp\htdocs\sigimage.php on line 64
Warning: Creating default object from empty value in D:\xampp\htdocs\sigimage.php on line 66
Warning: fread(): Length parameter must be greater than 0 in D:\xampp\htdocs\sigimage.php on line 64
Warning: Creating default object from empty value in D:\xampp\htdocs\sigimage.php on line 66
Notice: Trying to get property of non-object in D:\xampp\htdocs\sigimage.php on line 129
Warning: fread(): Length parameter must be greater than 0 in D:\xampp\htdocs\sigimage.php on line 131
Warning: fread(): Length parameter must be greater than 0 in D:\xampp\htdocs\sigimage.php on line 88
Warning: Creating default object from empty value in D:\xampp\htdocs\sigimage.php on line 90
Warning: fread(): Length parameter must be greater than 0 in D:\xampp\htdocs\sigimage.php on line 88
Warning: Creating default object from empty value in D:\xampp\htdocs\sigimage.php on line 90
Notice: Trying to get property of non-object in D:\xampp\htdocs\sigimage.php on line 145
Notice: Trying to get property of non-object in D:\xampp\htdocs\sigimage.php on line 145
Notice: Trying to get property of non-object in D:\xampp\htdocs\sigimage.php on line 153
Notice: Trying to get property of non-object in D:\xampp\htdocs\sigimage.php on line 155
Notice: Trying to get property of non-object in D:\xampp\htdocs\sigimage.php on line 157
Notice: Trying to get property of non-object in D:\xampp\htdocs\sigimage.php on line 159
Если в файлах.json уже есть данные, у меня просто есть предупреждения DOMDocument. Тем не менее, изображение по-прежнему не отображается, и оно просто дает мне сообщение о том, как оно не может отображаться из-за ошибок.
Это может показаться большим вопросом, но я зашел так далеко, и мне кажется, что что-то настолько простое, что мне здесь не хватает.
Что делает меня более запутанным, так это то, что моя первая версия работает нормально. Эта вторая версия, над которой я работаю, предназначена для расширения функциональности, чтобы показывать статистику для второй вещи, определяемой пользователем, поэтому я в растерянности. Если это поможет, это код для первой версии.
2 ответа
Оказывается, решение было простым, и причиной проблемы было именно то, что я игнорировал. Несмотря на то, что он анализируется очень хорошо и сохраняет данные в файлы.json, как и ожидалось, ошибки на анализируемой странице и последующие предупреждения DOMDocument стали причиной, по которой изображение не появилось бы без перезагрузки, если файлы статистики были либо пусто или просрочено. Решением было добавить строку сразу после заголовка:
libxml_use_internal_errors(true);
Вот и все!
Несколько советов по коду:
- Вы используете очень странную идиому:
fread(fopen("scripts/boincusers.json","r"),filesize("scripts/boincusers.json"));
, Почему не простоfile_get_contents('scripts/boincusers.json');
? Это решит многие ваши проблемы.file_put_contents
Твой друг тоже. - Это хорошая идея, чтобы всегда использовать абсолютные пути, как это:
file_get_contents(__DIR__.'/scripts/boincusers.json');
(то же самое относится и к путям шрифтов, включая пути…) - не используйте закрытие
?>
, просто не надо. иногда это приводит к странным ошибкам из-за некоторых невидимых символов после него.
В противном случае ваш код просто не проверяет наличие ошибок и наивно продолжается. Вы должны кодировать так, как вы ожидаете, что он потерпит неудачу в каждой точке ввода (GET-параметр может быть ошибочным, содержимое файла может быть в неправильном формате, …). Проверьте наличие ошибок и аккуратно остановитесь.
Я не буду исправлять твой код, извини. Но эти подсказки должны помочь.