PHP程序。远程端数据库。通过外网IP进行远程连接。而PHP程序是在linux环境下面直接在后台运行的
[admin@XXX XXX]$ php 我要执行的程序.php 24小时不间断,循环处理。连上了,做一些insert的操作。可是问题就出来了,隔几天就会出现Lost connection to MySQL server的错误信息应该是与远程数据的连接中断了。然后经常会程序卡住,没有任何响应了,和死机没什么差别,需要重新启动整个PHP的进程。白天还行,晚上要是出这个问题就太困绕了,已经出了好几次了。我觉得是数据库那边网络有问题,不过人家说没问题我也没办法t_t。有什么好的办法能解决么,只要求不死机能正常跑下去……程序大致格式如下while(1){死循环
  连接本地数据库
  连接远程数据库  从本地数据库表中取得数据
  写入远程数据库表中
  删除本地数据库表中已取得的数据  sleep(30) //过30秒再做}

解决方案 »

  1.   

    操作数据库之前先if一下有没有connection。如果断了连接就重新连接数据库
      

  2.   

    用过了。反而死机的次数更频繁了。
    每次执行SQL前都会运行这段函数。function test_db($IPADDR,$link){
      $ok = @mysql_ping($link);

      if(empty($ok)){
          while(1){
     
            $link = dblink($IPADDR);//连接数据库的函数
    $nowok = mysql_ping($link);
    print "restart mysql connect ".$nowok." \n";
    if($nowok == true)return $link;
    sleep(20);// 暂停30秒,继续执行
            }
       }else{
      return $link;
      }
    }
      

  3.   

    这种东西,建议用VB或VC之类的写C/S模式会好一点,也稳定的多。
      

  4.   

    为啥要死循环来做呢.
    用系统的cron来做不是更好吗?死机的问题有可能是因为你的程序没有及时释放链接,结果集,导致达到mysql的最大链接数,以及消耗大量内存引起的.
      

  5.   

    t_t。偶不会VCVB死机的问题有可能是因为你的程序没有及时释放链接,结果集,导致达到mysql的最大链接数,以及消耗大量内存引起的.偶起了10几个screen分别跑不同的进程。只有lost connection 频繁的会死机,其它的都是好好的。
      

  6.   

    jakey9826说得对1.用cron
    2.插入n条(如100)数据后就commit一次
    数据库的一个处理单位不可能一次性更新太多数据,你也得让它有释放内存的喘息机会不是。
      

  7.   

    cron有一个问题啊.每次数据都不一样.也就是每次做insert的时间不一样.那会不会产生一个进程还没结束,另一个就起来了呢.
      

  8.   

    insert时间动态生成,或者按照一定的规则来生成,这个就算现有的程序也是这样来做的吧.
    cron 1分钟一次,难道你的程序1分钟都执行不完.
      

  9.   


    程序执行的时候可以在tmp生成一个lock文件,
    如果lock文件存在的时候,
    程序不进行insert处理,并推出。等到下一次cron执行程序的时候再重新insert。可以在cron设定每10分钟或者一小时执行一次。具体时间间隔可以根据情况而定。
      

  10.   

    实际上这个跟 岛数据一样
    我之前做从  sqlserver  数据岛到  oracle
    几十W条   都可以岛的好好的。
    实现方法是:
    根据传最后执行一个ID,用js进行  get 传值方式 进行  读取插入的。比如:
    <script type="text/javascript">
    function ff() {
    document.location='?id=<?php echo $lastid;?>&salestatus=<?php echo $_GET['salestatus'] ?>&status=<?php echo $_GET['status'] ?>';
    }
    setTimeout("ff()",100);
    </script>
      

  11.   

    while(1){死循环 
      连接本地数据库 
      连接远程数据库   从本地数据库表中取得数据 
      写入远程数据库表中 
      删除本地数据库表中已取得的数据 
        关闭数据库连接,试试
      sleep(30) //过30秒再做 }或者  连接本地数据库 
      连接远程数据库 
    while(1){死循环  
      if(!db_r)
      {
      连接远程数据库
      }
      elseif(!$db_l)
      {
      连接本地数据库
      }else{
      从本地数据库表中取得数据 
      写入远程数据库表中 
      删除本地数据库表中已取得的数据 
      
      关闭数据库连接,试试
      }
      sleep(30) //过30秒再做 }