예제 #1
0
파일: Sync.php 프로젝트: uwitec/outbuying
 /**
  * socket输出接口
  *	将内部数据同步到外部服务器
  */
 public static function soutput()
 {
     echo microtime() . "<br>";
     $loger = new Pft_Log_File('syncsocket');
     //访问权限判断
     if (!Pft_Sync_MessageListManage::interfaceAuth('InitiativeOutput')) {
         $loger->log('没有访问socket输出接口的权限');
         exit;
     }
     //判断是否锁定
     if (Pft_Sync_MessageListManage::isLock('soutput')) {
         //如果锁定
         $loger->log('socket输出接口已锁定');
         exit;
     }
     //锁定接口
     Pft_Sync_MessageListManage::AddLock('soutput');
     //------------外部unknown中的数据处理  start---------------//
     //------------外部unknown中的数据处理  end---------------//
     //------------外部消息序列的处理  start---------------//
     //获取所有的消息序列
     $msgListArray = Pft_Sync_MessageListManage::getAllMessageList();
     $msgList_execute = array();
     $num_del = Pft_Sync_MessageListManage::getNumOnceDel();
     //一次删除消息序列的个数
     if (is_array($msgListArray) && count($msgListArray)) {
         foreach ($msgListArray as $key => $val) {
             //--------------------- 数据过滤器  start---------------------//
             //根据创建消息序列的服务器类型获取过滤器
             $filterNameList = Pft_Sync_MessageListManage::getMsgListFilter($val['syncServerType']);
             //调用过滤器过滤数据
             if (is_array($filterNameList) && count($filterNameList)) {
                 foreach ($filterNameList as $filterName) {
                     $aFilter = Pft_Sync_Filter::filterFactory($filterName);
                     if ($aFilter) {
                         $val = $aFilter->filter($val);
                     }
                 }
             }
             //如果字段为空,删除消息序列
             if (($val['operate'] == 'UPDATE' || $val['operate'] == 'INSERT') && !count($val['cols']) || !count($val)) {
                 //删除序列
                 Pft_Sync_MessageListManage::delMessageList($key);
                 continue;
             }
             //--------------------- 数据过滤器  end---------------------//
             if (count($msgList_execute) < $num_del - 1) {
                 $msgList_execute[$key] = $val;
             } else {
                 //满足个数
                 $msgList_execute[$key] = $val;
                 $msgSignArr = array_keys($msgList_execute);
                 $data_str = '';
                 $data = array();
                 $data = array('msgList' => $msgList_execute, 'msgListDir' => 'unknown', 'validatePassword' => Pft_Sync_MessageListManage::getValidatePassword());
                 $data_str = urlencode(serialize($data));
                 //汇总文件内容
                 $msglistfilesize = strlen($data_str);
                 //汇总文件大小
                 //生成本地消息序列汇总文件
                 $re = Pft_Sync_MessageListManage::createdMsgListFileSync($data_str);
                 if ($re != '1') {
                     $loger->log('socket输出接口创建内部消息序列汇总文件失败');
                     //解除锁定
                     Pft_Sync_MessageListManage::DelLock('soutput');
                     exit;
                 }
                 $dd_chunk = str_split($data_str, 1000);
                 $count_arr = count($dd_chunk);
                 //总块数
                 foreach ($dd_chunk as $key => $val) {
                     //循环传输数据
                     $order_str = "send_" . ($key + 1) . "_" . $count_arr;
                     $count = strlen($order_str);
                     $order_str = str_split($order_str, 1);
                     $temp_arr = array_fill($count, 20 - $count, ' ');
                     $order_str_arr = array_merge($order_str, $temp_arr);
                     $order_str = '';
                     foreach ($order_str_arr as $k => $v) {
                         $order_str .= $v;
                     }
                     $data = $order_str . $val;
                     $result = Pft_Sync_SyncSocket::syncInterface('send', $data);
                     if ($result != '1') {
                         $loger->log('socket输出接口传送消息序列汇总文件失败');
                         //解除锁定
                         Pft_Sync_MessageListManage::DelLock('soutput');
                         exit;
                     }
                 }
                 //获取外部消息序列汇总文件的大小,比较内外汇总文件
                 //删除内部消息序列汇总文件
                 $result = Pft_Sync_MessageListManage::delFile('', 'msgListfile.msg');
                 if ($result != '1') {
                     $loger->log('socket输入接口删除本地sync目录消息序列汇总文件失败');
                     //解除锁定
                     Pft_Sync_MessageListManage::DelLock('soutput');
                     exit;
                 }
                 //解析外部消息序列汇总文件成消息序列
                 $msgsignstr = Pft_Sync_SyncSocket::syncInterface('execmsgfile', '');
                 if ($result == '0') {
                     $loger->log('socket输出接口解析外部消息序列汇总文件失败');
                     //解除锁定
                     Pft_Sync_MessageListManage::DelLock('soutput');
                     exit;
                 }
                 //删除内部消息序列
                 $msgsign = unserialize(urldecode($msgsignstr));
                 if (is_array($msgsign) && count($msgsign)) {
                     $re = Pft_Sync_MessageListManage::delMessageList($msgsign);
                     if ($re != '1') {
                         $loger->log('socket输出接口删除内部消息序列失败');
                         //解除锁定
                         Pft_Sync_MessageListManage::DelLock('soutput');
                         exit;
                     }
                 } else {
                     $loger->log('socket输出接口内部消息序列数据错误');
                     //解除锁定
                     Pft_Sync_MessageListManage::DelLock('soutput');
                     exit;
                 }
                 //移动外部消息序列到outsite目录
                 $result = Pft_Sync_SyncSocket::syncInterface('movemsglistoutsite', $msgsign);
                 if ($result != '1') {
                     $loger->log('socket输出接口移动外部消息序列到outsite目录失败');
                     //解除锁定
                     Pft_Sync_MessageListManage::DelLock('soutput');
                     exit;
                 }
                 //执行外部outsite目录下的消息序列
                 /* $result = Pft_Sync_SyncSocket::syncInterface('execmsglist','');
                 			if ($result!='1'){
                 				$loger->log( 'socket执行外部outsite目录下的消息序列' );
                 				//解除锁定
                 				Pft_Sync_MessageListManage::DelLock('soutput');
                 				exit;
                 			}*/
                 // exit;
                 $msgList_execute = array();
             }
         }
         //--- 未满个数end
         //$msgList_execute[$key] = $val;
         $msgSignArr = array_keys($msgList_execute);
         $data_str = '';
         $data = array();
         $data = array('msgList' => $msgList_execute, 'msgListDir' => 'unknown', 'validatePassword' => Pft_Sync_MessageListManage::getValidatePassword());
         $data_str = urlencode(serialize($data));
         //汇总文件内容
         $msglistfilesize = strlen($data_str);
         //汇总文件大小
         //生成本地消息序列汇总文件
         $re = Pft_Sync_MessageListManage::createdMsgListFileSync($data_str);
         if ($re != '1') {
             $loger->log('socket输出接口创建内部消息序列汇总文件失败');
             //解除锁定
             Pft_Sync_MessageListManage::DelLock('soutput');
             exit;
         }
         $dd_chunk = str_split($data_str, 1000);
         $count_arr = count($dd_chunk);
         //总块数
         foreach ($dd_chunk as $key => $val) {
             //循环传输数据
             $order_str = "send_" . ($key + 1) . "_" . $count_arr;
             $count = strlen($order_str);
             $order_str = str_split($order_str, 1);
             $temp_arr = array_fill($count, 20 - $count, ' ');
             $order_str_arr = array_merge($order_str, $temp_arr);
             $order_str = '';
             foreach ($order_str_arr as $k => $v) {
                 $order_str .= $v;
             }
             $data = $order_str . $val;
             $result = Pft_Sync_SyncSocket::syncInterface('send', $data);
             if ($result != '1') {
                 $loger->log('socket输出接口传送消息序列汇总文件失败');
                 //解除锁定
                 Pft_Sync_MessageListManage::DelLock('soutput');
                 exit;
             }
         }
         //获取外部消息序列汇总文件的大小,比较内外汇总文件
         //删除内部消息序列汇总文件
         $result = Pft_Sync_MessageListManage::delFile('', 'msgListfile.msg');
         if ($result != '1') {
             $loger->log('socket输入接口删除本地sync目录消息序列汇总文件失败');
             //解除锁定
             Pft_Sync_MessageListManage::DelLock('soutput');
             exit;
         }
         //解析外部消息序列汇总文件成消息序列
         $msgsignstr = Pft_Sync_SyncSocket::syncInterface('execmsgfile', '');
         if ($result == '0') {
             $loger->log('socket输出接口解析外部消息序列汇总文件失败');
             //解除锁定
             Pft_Sync_MessageListManage::DelLock('soutput');
             exit;
         }
         //删除内部消息序列
         $msgsign = unserialize(urldecode($msgsignstr));
         if (is_array($msgsign) && count($msgsign)) {
             $re = Pft_Sync_MessageListManage::delMessageList($msgsign);
             if ($re != '1') {
                 $loger->log('socket输出接口删除内部消息序列失败');
                 //解除锁定
                 Pft_Sync_MessageListManage::DelLock('soutput');
                 exit;
             }
         } else {
             $loger->log('socket输出接口内部消息序列数据错误');
             //解除锁定
             Pft_Sync_MessageListManage::DelLock('soutput');
             exit;
         }
         //移动外部消息序列到outsite目录
         $result = Pft_Sync_SyncSocket::syncInterface('movemsglistoutsite', $msgsign);
         if ($result != '1') {
             $loger->log('socket输出接口移动外部消息序列到outsite目录失败');
             //解除锁定
             Pft_Sync_MessageListManage::DelLock('soutput');
             exit;
         }
         //执行外部outsite目录下的消息序列
         /* $result = Pft_Sync_SyncSocket::syncInterface('execmsglist','');
         			if ($result!='1'){
         				$loger->log( 'socket执行外部outsite目录下的消息序列' );
         				//解除锁定
         				Pft_Sync_MessageListManage::DelLock('soutput');
         				exit;
         			}*/
         // exit;
         //---未满个数 end
     }
     //------------外部消息序列的处理  end---------------//
     //解除锁定
     Pft_Sync_MessageListManage::DelLock('soutput');
     //$end_time = time();
     echo '<br>' . microtime();
 }
예제 #2
0
파일: Log.php 프로젝트: uwitec/outbuying
 /**
  * 记录操作数据库日志
  *
  * @param string $sql
  */
 public static function logDbOprate($sql)
 {
     $sql = trim($sql);
     if (!$sql) {
         return false;
     }
     //生成消息序列 by jute
     $enableSync = Pft_Config::getCfgInFile('EnableSync', 'sync/sync.conf.php');
     if ($enableSync == '1') {
         Pft_Sync_MessageListManage::createDbMsgList($sql);
     }
     $tableName = '';
     $logName = '';
     $msg = '';
     //忽略列表优先于允许列表
     $ignoreTalbenameList = array('tpm_rizhi' => 'rz_id', 'tpm_xiangmu_rizhi' => 'rz_id', 'tpm_ziyuan_rizhi' => 'rz_id', 'tpm_rizhi_fangwen' => 'rz_id');
     $toLogTablenameList = array('tpm_dingdan' => 'dd_id', 'tpm_shengchandingdan' => 'sd_id', 'tpm_xiangmu' => 'xm_id', 'tpm_renwu' => 'rw_id', 'tpm_gaojian' => 'gj_id', 'tpm_yonghukuozhan' => 'yh_id', 'tpm_yonghu' => 'yh_id', 'tpm_kehu_yonghu' => 'yh_id');
     //因为之前已经trim了,所以 === 0
     if (stripos($sql, 'SELECT') === 0) {
         //不记录Select
         return false;
         //$sql = str_replace( array("\n","\r") , array(" ", "" ) , $sql );
     } elseif (stripos($sql, 'UPDATE') === 0) {
         /*
         			/update[\s]+(\w+)[\s]+set(.*)where[\s]+(.*)/
                      ^^table name ^^col         ^^cond
         */
         if (preg_match("/update[\\s]+(\\w+)[\\s]+set(.*)where[\\s]+(.*)/i", $sql, $matchs)) {
             $tableName = $matchs[1];
             $cols = $matchs[2];
             $cond = $matchs[3];
             $logName = self::DB_OPRATE_TYPE_PREFIX . '-' . $tableName . '-' . self::DB_OPRATE_TYPE_UPDATE;
             $msg = $cols . self::DB_OPRATE_MSG_SPLITER . $cond;
         }
     } elseif (stripos($sql, 'INSERT') === 0) {
         /*
         /insert into[\s]+(\w+)[\s]+\((.*)\)[\s]+values[\s]+\((.*)\)/
         */
         if (preg_match('/insert into[\\s]+(\\w+)[\\s]+\\((.*)\\)[\\s]+values[\\s]+\\((.*)\\)/i', $sql, $matchs)) {
             $tableName = $matchs[1];
             $cols = $matchs[2];
             $values = $matchs[3];
             $logName = self::DB_OPRATE_TYPE_PREFIX . '-' . $tableName . '-' . self::DB_OPRATE_TYPE_INSERT;
             $msg = $cols . self::DB_OPRATE_MSG_SPLITER . $values;
         }
     } elseif (stripos($sql, 'DELETE') === 0) {
         /*
         /insert into[\s]+(\w+)[\s]+\((.*)\)[\s]+values[\s]+\((.*)\)/
         */
         if (preg_match('/DELETE FROM[\\s]+(\\w+)[\\s]+WHERE(.*)/i', $sql, $matchs)) {
             $tableName = $matchs[1];
             $cond = $matchs[2];
             $logName = self::DB_OPRATE_TYPE_PREFIX . '-' . $tableName . '-' . self::DB_OPRATE_TYPE_DELETE;
             $msg = $cond;
         }
     } else {
         /**
          * 对未解析的SQL 也记录在案
          * @author terry
          * @version 0.1.0
          * Wed Sep 26 13:38:08 CST 2007
          */
         $logName = self::DB_OPRATE_TYPE_UNKNOWN;
         $msg = $sql;
     }
     //strtolower( $tableName ) != 'tpm_rizhi'
     if ($msg && $logName && !key_exists(strtolower($tableName), $ignoreTalbenameList) && key_exists(strtolower($tableName), $toLogTablenameList) && !(stripos($sql, 'UPDATE tpm_yonghu SET YH_ZAIXIAN_ZHUANGTAI') === 0)) {
         /**
          * 更新用户状态的不记录在数据库
          * @author terry
          * @version 0.1.0
          * Sat Sep 29 19:41:27 CST 2007
          */
         //			print"<pre>Terry :";var_dump( $logName );print"</pre>";
         //			print"<pre>Terry :";print ( $msg );print"</pre>";
         //			exit();
         self::addLog("Execute [ {$sql} ]" . self::DB_OPRATE_MSG_SPLITER . $msg, self::LEVEL_SYSTEM, $logName);
         return true;
     } else {
         /**
          * 忽略列表中的数据表操作亦将不被写入文件Log
          * @author terry
          * @version 0.1.0
          * Wed Sep 05 09:46:56 CST 2007
          */
         if (!key_exists(strtolower($tableName), $ignoreTalbenameList)) {
             self::addLog("Execute [ {$sql} ]", Pft_Log::LEVEL_DEBUG, $logName);
         }
         return false;
     }
 }