- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有 cron3min.php、cron10min.php、cron60min.php。
我正在使用 PDO。
cron3min.php 很忙,他每 3 分钟
并且每 3 分钟大约有 50.000 - 500.000 行,所以当来自 cron 的其他请求到来时,第一个 cron 请求经常没有完成。
当我从 catch 检查我的错误日志时,我看到:
2015-08-23 10:57:36exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 2006 MySQL server has gone away' in /home/27425-18594.cloudwaysapps.com/jcjdkdtaur/public_html/php/topoddsengine.php:25
Stack trace:
#0 /home/27425-18594.cloudwaysapps.com/jcjdkdtaur/public_html/php/topoddsengine.php(25): PDO->query('SELECT * FROM G...')
#1 /home/27425-18594.cloudwaysapps.com/jcjdkdtaur/public_html/cron5min.php(27): TopOdds->insertTopOdds()
#2 {main}2015-08-23 10:58:11exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 2006 MySQL server has gone away' in /home/27425-18594.cloudwaysapps.com/jcjdkdtaur/public_html/php/topoddsengine.php:25
还有
Stack trace:
#0 /home/27425-18594.cloudwaysapps.com/jcjdkdtaur/public_html/php/class.xmltodb.php(496): PDOStatement->execute()
#1 /home/27425-18594.cloudwaysapps.com/jcjdkdtaur/public_html/php/class.xmltodb.php(468): XMLtoDB->fillMap('')
#2 /home/27425-18594.cloudwaysapps.com/jcjdkdtaur/public_html/php/class.xmltodb.php(600): XMLtoDB->getMap('')
#3 /home/27425-18594.cloudwaysapps.com/jcjdkdtaur/public_html/cron10min.php(22): XMLtoDB->resultsToHistoric()
#4 {main}2015-08-24 09:33:31exception 'PDOException' with message 'SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction' in /home/27425-18594.cloudwaysapps.com/jcjdkdtaur/public_html/php/class.xmltodb.php:496
和
Stack trace:
#0 /home/27425-18594.cloudwaysapps.com/jcjdkdtaur/public_html/php/class.xmltodb.php(742): PDOStatement->execute()
#1 /home/27425-18594.cloudwaysapps.com/jcjdkdtaur/public_html/php/class.xmltodb.php(677): XMLtoDB->execHistoric(Object(PDOStatement), Object(SimpleXMLElement), Object(SimpleXMLElement), '2015-08-21 18:0...', 1, NULL, 'Albania: Superl...', Object(SimpleXMLElement), 'albania:', 'Partizani Tiran...', 2337556, 'Partizani Tiran...', NULL, 1, Object(SimpleXMLElement), NULL, NULL, NULL, '62: X. Sukaj; ', NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'Laci', 2337554, NULL, 1, Object(SimpleXMLElement), NULL, NULL, NULL, 'E. \xC3\x87ela; ', NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '', '', NULL, NULL, NULL, NULL, 'tipgin', Object(SimpleXMLElement))
#2 /home/27425-18594.cloudwaysapps.com/jcjdkdtaur/public_html/cron10min.php(22): XMLtoDB->resultsToHistoric()
#3 {main}2015-08-23 18:18:17exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded; try restarting transaction' in /home/27425-18594.cloudwaysapps.com/jcjdkdtaur/public_html/php/class.xmltodb.php:742
在 cron3min.php 中有这个函数:
$provider->getOdds();
$xmldb->sendOddsToDb();
$xmldb->sendFixturesToDb();
$xmldb->fillBaby();
$topOdds->insertTopOdds();
$xmldb->copyHAtoHandicap();
$con->close();
最忙的函数是 $xmldb->sendOddsToDb();
和 $xmldb->copyHAtoHandicap();
我将在此处仅复制 $xmldb->sendOddsToDb();,在每个函数中我启动事务并在函数结束时提交它并关闭。
这里是 sendOddsToDb(),请检查它,只看一个 mysql 逻辑,有问题,我如何开始交易好吗? Xml 解析大约需要 1:30-2 分钟(大部分时间需要代码的 3 路部分,我需要在数组中存储障碍),所以可能是打开了长连接或其他什么...
function sendOddsToDb(){
try{
$this->conn->connect();
$this->PDO->beginTransaction();
$countries = $this->OddCountries;
$stmt = $this->PDO->prepare($this->insOdds);
//$dbempty = $this->countRows('odds');
//$this->clrLeagues();
foreach($countries as $country){
$path = "{$this->base}/feeds/odds/{$country}odds.xml";
$odds_feed = $this->parser->parseFile($path);
foreach($odds_feed->league as $league){ //za svaku ligu u fidu
$fcountries = $this->filterCountries($league->attributes()->country);
$subid = $league->attributes()->sub_id;
$sportname = '';
$sportid = 0;
if($odds_feed->attributes()->sport == 'soccer' || $odds_feed->attributes()->sport == 'football'){
$sportname = 'football';
$sportid = 1;
}
else{
$sportname = NULL;
}
$lg2 = '';
$lg = $league->attributes()->name;
$ctr = $league->attributes()->country.':';
if(!contains(strtolower($lg),strtolower($ctr))){
$lg2 = ucfirst($ctr) . ' ' . ucfirst($lg);
}
else{
$lg2 = $league->attributes()->name;
}
$flg = $this->getMap2($lg2);
$this->sendLeaguesToDb($league->attributes()->id, $flg ,$fcountries,$sportid,$subid,'tipgin');
foreach($league->match as $match){
$dbdate = date('Y-m-d',strtotime($match->attributes()->date));
$updateddate = date('Y-m-d H:i:s',strtotime($odds_feed->attributes()->updated));
$dbtime = date('H:i:s', strtotime($match->attributes()->time));
$datetime = date('Y-m-d H:i:s',strtotime($dbdate . $dbtime));
$hteam = $this->getMap(toShort($match->home->attributes()->name));
$ateam = $this->getMap(toShort($match->away->attributes()->name));
$fixid = 0;
if($match->attributes()->id == 0 || $match->attributes()->id == ''){
if($match->attributes()->alternate_id == 0 || $match->attributes()->id == ''){
$fixid = $match->attributes()->alternate_id_2;
}
else{
$fixid = $match->attributes()->alternate_id;
}
}
else{
$fixid = $match->attributes()->id;
}
//$m = $hteam . ' ' . $ateam;
//var_dump('MATCH: ' . $m . ' HTEAM: ' . mb_detect_encoding($hteam). ' ATEAM: ' . mb_detect_encoding($ateam));
foreach ($match->odds as $odds) {
//var_dump($odd);
foreach ($odds->type as $type) {
foreach ($type->bookmaker as $bookmaker) {
//$oldbook = ;
if($bookmaker->attributes()->name != 'BetClick'){
if($bookmaker->attributes()->name != 'Bodog'){
if($bookmaker->attributes()->name != 'YouWin'){
$homeodds = NULL;
$drawodds = NULL;
$awayodds = NULL;
$numodds = NULL;
$dbhandicap = NULL;
$id2 = '0';
$typename = $this->getMap2($type->attributes()->name);
$fbooks = $this->filterBooks($bookmaker->attributes()->name);
if($typename == 'Over/Under' || $typename == 'Over/Under 1st Half' || $typename == 'Over/Under 2nd Half'){
foreach ($bookmaker->total as $total) { //daj kvote za svaki mec
$numodds = $total->attributes()->name;
foreach($total->odd as $odd){
switch ($odd->attributes()->name) {
case 'Over':
$homeodds = $odd->attributes()->value;
break;
case 'Under':
$awayodds = $odd->attributes()->value;
break;
}
$id2 = $numodds;
//echo 'ID: ' . $match->attributes()->alternate_id_2 . $league->attributes()->country . " ODDS: {$homeodds} {$drawodds} {$awayodds} TYPE: {$typename} BOOK: {$fbooks} ID2: {$id2}" . "<br>";
}
//echo "HOME TEAM: {$hteam} <BR>";
//echo "AWAY TEAM: {$ateam} <BR>";
$this->execOdds($stmt, $fixid, $updateddate,
$typename, $fcountries,$league->attributes()->name,
$league->attributes()->id, $subid, $league->attributes()->cup,$sportname,
$hteam,$match->home->attributes()->id,
$ateam,$match->away->attributes()->id, $datetime, $dbdate,
$dbtime, $match->attributes()->status, $numodds,$homeodds,$drawodds,
$awayodds, $fbooks, $bookmaker->attributes()->id, $dbhandicap, $id2);
}
}
else if($typename == 'Handicap' || $typename == '3Way Handicap'){
$homeodds = array();
$drawodds = array();
$awayodds = array();
$arrhandicap = array();
$fhandicap = '';
foreach ($bookmaker->handicap as $handicap) { //daj kvote za svaki mec
if (strpos($handicap->attributes()->name,'+') !== false) {
$fhandicap = str_replace('+','',$handicap->attributes()->name);
}else{
$fhandicap = $handicap->attributes()->name;
}
$newhandi = '';
foreach($handicap->odd as $odd){
//$odd = $handicap->odd;
switch ($odd->attributes()->name) {
case '1':
$newhandi = $fhandicap;
$homeodds[(string)$newhandi] =
$odd->attributes()->value;
break;
case 'X':
$newhandi = $fhandicap;
$drawodds[(string)$newhandi] =
$odd->attributes()->value;
break;
case '2':
if (strpos($fhandicap,'-') !== false) { //if negative
$newhandi = str_replace('-','',$fhandicap); //to positive
//echo 'NEGATIVE - OLD: ' . $fhandicap . ' NEW: '.$newhandi . '<br>';
}
elseif($fhandicap=='0'){
$newhandi = '0';
}
else{ //if positive
$newhandi = '-' . $fhandicap; //to negative
//echo 'POSITIVE - OLD: ' . $fhandicap . ' NEW: '.$newhandi . '<br>';
}
$awayodds[(string)$newhandi] = $odd->attributes()->value;
break;
}
$arrhandicap[] = $newhandi;
}
}
//$arrhandicap[] = sort($dbhandicap);
foreach($arrhandicap as $hand){
if(!is_null($hand)){
//echo $typename. ': ' . $hand . '<br>';
if($homeodds[(string)$hand] != NULL && $awayodds[(string)$hand] != NULL){
$this->execOdds($stmt, $fixid, $updateddate,
$typename, $fcountries,$league->attributes()->name,
$league->attributes()->id, $subid, $league->attributes()->cup,$sportname,
$hteam,$match->home->attributes()->id,
$ateam,$match->away->attributes()->id, $datetime, $dbdate,
$dbtime, $match->attributes()->status, $numodds,$homeodds[(string)$hand],
$drawodds[(string)$hand],$awayodds[(string)$hand], $fbooks,
$bookmaker->attributes()->id, $hand, $hand);
echo 'ID: ' . $match->attributes()->id . $league->attributes()->country . " HOMEODDS: {$homeodds[(string)$hand]} DRAWODDS: {$drawodds[(string)$hand]} AWAYODDS: {$awayodds[(string)$hand]} TYPE: {$typename} BOOK: {$fbooks} ID2: {$hand}" . "<br>";
}
}
}
}
else{
foreach ($bookmaker->odd as $odd) { //daj kvote za svaki mec
if($typename == 'Home/Away'){
$typename = 'Draw No Bet';
}
switch ($odd->attributes()->name) {
case '1':
case '1X':
case 'Yes':
$homeodds = $odd->attributes()->value;
break;
case 'X':
case 'X2':
$drawodds = $odd->attributes()->value;
break;
case '2':
case '12':
case 'No':
$awayodds = $odd->attributes()->value;
break;
}
$id2 = 0;
//echo 'ID: ' . $match->attributes()->alternate_id_2 . $league->attributes()->country . " ODDS: {$homeodds} {$drawodds} {$awayodds} TYPE: {$typename} BOOK: {$fbooks} ID2: {$id2}" . "<br>";
}
//echo "HOME TEAM: {$hteam} <BR>";
//echo "AWAY TEAM: {$ateam} <BR>";
$this->execOdds($stmt, $fixid, $updateddate,
$typename, $fcountries,$league->attributes()->name,
$league->attributes()->id, $subid, $league->attributes()->cup,$sportname,
$hteam,$match->home->attributes()->id,
$ateam,$match->away->attributes()->id, $datetime, $dbdate,
$dbtime, $match->attributes()->status, $numodds,$homeodds,$drawodds,
$awayodds, $fbooks, $bookmaker->attributes()->id, $dbhandicap, $id2);
}
}
}
}
}}
}
}
}
}
$this->PDO->commit(); //SAVE
$this->conn->close();
$this->error = false;
}
catch(Exception $e){
}
}
private function execOdds($stmt, $matchid, $upddate, $type, $country, $league, $leagueid, $subid, $cup, $sport, $hteam, $hteamid, $ateam, $ateamid, $datetime, $date, $time, $status, $numodds, $homeodds, $drawodds, $awayodds, $book, $bookid, $handicap, $id2){
$event = $hteam . ' - ' . $ateam;
$fcountry = $country;
$fleague = $this->getMap2($league);
$stmt->bindParam(':fixturematchid', $matchid);$stmt->bindParam(':updateddate',$upddate);$stmt->bindParam(':type',$type);
$stmt->bindParam(':country',$fcountry);$stmt->bindParam(':league',$fleague);$stmt->bindParam(':leagueid',$leagueid);
$stmt->bindParam(':subid',$subid);
$stmt->bindParam(':cup',$cup);$stmt->bindParam(':eventname',$event);$stmt->bindParam(':sportname',$sport);
$stmt->bindParam(':hometeam', $hteam);$stmt->bindParam(':hometeamid', $hteamid);$stmt->bindParam(':awayteam', $ateam);
$stmt->bindParam(':awayteamid', $ateamid);$stmt->bindParam(':datetime',$datetime);$stmt->bindParam(':date',$date);
$stmt->bindParam(':time',$time);$stmt->bindParam(':status',$status);$stmt->bindParam(':numodds', $numodds);
$stmt->bindParam(':homeodds', $homeodds);$stmt->bindParam(':drawodds',$drawodds);$stmt->bindParam(':awayodds',$awayodds);
$stmt->bindParam(':bookmaker',$book);$stmt->bindParam(':bookmakerid',$bookid);$stmt->bindParam(':handicap', $handicap);
$stmt->bindParam(':id2', $id2);
$stmt->execute(); //EXEC*/
}
最佳答案
正如您在错误日志中看到的那样,一些查询试图锁定记录,而其他查询已经通过锁定使用它。可能有多种原因,因此请尝试与他们联系并解决问题。
第一步:
当您在帖子中更新 cron 花费超过 3 分钟并且下一轮开始时,因此 cron 可能是第一次使用某些记录,而第二次 cron 也尝试锁定它。
但只有当您的查询没有正确使用索引并试图锁定比预期更多的记录时,它才会出现。因此,请检查您的查询是否可以优化。
第二步:
可能其他一些进程也在尝试锁定该 cron 正在执行的行,因此请检查引擎 innodb 状态中的详细信息,了解哪个进程正在创建死锁。
您还可以通过任何 gui 工具(如 mysqladmin)监视在此 cron 时哪些查询试图获取锁,并优化发生这种情况的查询/代码。
关于php - mysql server has gone away,序列化和锁等待错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32179665/
我正在使用一个 API,不幸的是,调用 get 属性访问器会产生副作用。我如何确保: public void Foo() { var x = obj.TheProp; // is it guarn
我正在 Canvas 上创建一个简单的粒子实验。现在我希望它们在 Canvas 上“逃离”鼠标光标。检测与鼠标的距离不是问题,但如何编码它们的行为? 每个粒子的创建如下: var partic
我正在尝试将 Laravel 4 应用程序的一部分移植到 Lumen,但我无法找出 Laravel 4 的 Redirect::away(...); 函数的等价物流明。 我试过保持不变,但行不通。我也
在 Unity 场景中,想象一下 一个大的滑动物体(可能是“容器”或“沙发”出于某种原因滑动) 途中有数根2m高的轻质木棍轻轻插在地上。 在现实生活中,棍子会站在那里(首先,这在 PhysX 中实际上
我正在尝试将 Laravel 4 应用程序的一部分移植到 Lumen,但我无法找出 Laravel 4 的 Redirect::away(...); 函数的等价物流明。 我试过保持不变,但行不通。我也
我有一个表格 View 单元格,里面有一个 uilabel ,它获取两点之间的距离(用户当前位置和我选择的另一个点)。问题是,当我更改数据库中的点并重新加载表格 View 时,每个单元格中的英里数都会
我有一个我想要的按钮 .animate-show.ng-hide-add, .animate-show.ng-hide-remove {
在我的网站上,我制作了 坚持到顶部,但是当我向下滚动时它只停留几秒钟/像素,然后它被滚动离开,请参阅下面的代码片段并向下滚动。我想要 nav向下滚动时随时停留在顶部, 除外可见。 HTML
我有一个包含大量繁重任务的项目,这些任务基本上正在构建一个功能齐全的 Assets 管道(转换、源映射、缩小、md5 文件名愿景)。大多数任务都是我在 github 上找到的开源任务,但也有一些任务是
我有一个 winform usercontrol,其中包含多个项目(文本框、按钮...)。现在我遇到了现象,尽管在控件设计器文件中(设计器.cs) 文本框、按钮...仍然被定义。也没有编译错误。当
我不断收到以下错误 Error: "Window navigated away" 并且我不知道如何阻止此错误的发生,当它确实发生时它也阻止我离开我当前的网页开始了我对 Jquery 和 Javascr
我正在寻找如何实现这个场景:我有函数内部的逻辑代码,现在我希望能够在单独的线程中执行此功能。现在我拥有的是这个 .. 的原始实现我简单地初始化线程,在它的启动/运行方法中我保留了函数逻辑。我怎样才能让
我正在尝试从 Windows 10 64 位启动 xampp v3.2.4。我收到图像 error page while connecting mysql 中显示的错误 xampp log 我从sql
我在用 php 编写的导入脚本中遇到“mysql 服务器已消失” 这http://dev.mysql.com/doc/refman/5.0/en/gone-away.html页面列出了可能的原因。但是
因此,当我使用无法解决的 PHP PDO 运行脚本时,我遇到了这个问题。我的脚本正在索引来自不同服务器上不同数据库的信息(主要是选择查询)。 当我开发脚本时,所有数据库都在同一台服务器上,一切都运行良
我知道有很多关于 MySQL 的“Server has gone away”错误的话题,但这个似乎是随机发生的,而且是在不利的情况下发生的。 我正在使用 CodeIgniter 3.0。在我所做的研究
假设我有: [obj for (_, obj) in stack] 此代码假定 stack 中的第一个对象是一个元组,并丢弃元组的第一部分。 如果代码不是元组而是单个对象会怎样? 它是否只忽略被丢弃的
我正在尝试编写代码,当用户将鼠标悬停在按钮上时,它会继续移动按钮(因此它永远不会被实际点击) 我正在使用“style.left”来确定新的按钮位置 这是我编写的函数,它不能像我希望的那样工作: doc
因此,在滚动时隐藏导航栏很容易,只需添加一个带有“top: -50px”的类即可。但是,感觉不是很自然。如果导航栏通过实际滚动隐藏起来,这样滚动的速度总是合适的,那就更好了。我不想将其动画化,而是想将
我习惯于结合使用连接和“IS NULL”来删除行,比如 this 示例: A 有第 1 类数字 1。B 有第 2 类数字 2,但也有第 1 类数字 1。 查询: SELECT people.name,
我是一名优秀的程序员,十分优秀!