2013-11-27 6 views
1

jabber 계정이있는 모든 로컬 주소록 연락처를 효율적으로 확인하고 싶습니다. 사용자는 XMPP 서버에 휴대폰 번호로 등록됩니다. 현재 다음 XEP-0055 스탠자를 ejabberd 서버로 보내 결과를 평가합니다.효율적인 XMPP 사용자 검색

<iq type="set" id="searchByUserName" to="vjud.ecoimac1.local" from="[email protected]"> 
    <query xmlns="jabber:iq:search"> 
    <x xmlns="jabber:x:data" type="submit"> 
     <field type="hidden" var="FORM_TYPE"> 
     <value>jabber:iq:search</value> 
     </field> 
     <field var="user"> 
     <value>+123456789</value> 
     </field> 
    </x> 
    </query> 
</iq> 

이 방법은 효과적이지 못합니다. 각 번호에 대해 쿼리를 보내야합니다. WhatsApp과 같은 다른 앱도 똑같은 일을합니다. 더 효율적인 방법이 있습니까?

답변

1

지금 효율적인 솔루션은 다음과 같습니다

서버 측에 나는 eJabberd에 대한 MySQL 데이터베이스 백엔드를 설정 않았고 웹 서버에 PHP 인터페이스는 클라이언트 응용 프로그램에 대한 사용자 검색을 제공합니다. 앱이 jabber 사용자 이름 집합과 함께 HTTP POST 요청을 보내 검사합니다. PHP 스크립트는 어떤 사용자가 등록되어 있는지 조회하고 등록 된 사용자의 색인을 포함하는 응답을 반환합니다.

<?php 

// HTTP POST sent from client app 
// Do authentication here... 

// Read all parameters 
$users = array(); 
$user = $_POST["username0"]; 
for ($i = 1; !empty($user); $i++) 
{ 
    // Add user 
    $users[] = $user; 

    // Next parameter 
    $user = $_POST["username".$i]; 
} 
if (empty($users)) 
{ 
    echo "Success"; // nothing to do 
    exit; 
} 

// Create mySQL connection 
$db = mysqli_connect("localhost", "user", "password", "database"); 
if (!$db) 
{ 
    $descr = mysqli_connect_error(); 
    echo "Error: ".$descr; 
    exit; 
} 

// Prepare query 
// SELECT username FROM users WHERE username IN ('+41796548345','+41786547544',...) 
$query = "SELECT username FROM users WHERE username IN("; 
foreach ($users as $user) 
{ 
    $query .= "'".$user."',"; 
} 
$query = rtrim($query, ","); 
$query .= ")"; 

// Execute query and generate result 
$result = "Success"; 
$recset = mysqli_query($db, $query); // [+41786547544,+41763428566,...] 
while ($rec = mysqli_fetch_object($recset)) 
{ 
    $index = find_user($rec->username, $users); 
    if ($index >= 0) 
    { 
     $result .= "\t".$index; 
    } 
} 

echo $result; 

function find_user($username, $users) 
{ 
    for ($idx = 0; $idx < count($users); $idx++) 
    { 
     if ($users[$idx] == $username) 
     { 
      return $idx; // found at index 
     } 
    } 
    return -1; // not found 
} 

?>