/** * 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(); }