2012-12-15 83 views
1

我一直在試圖製作一個CLI應用程序,它記錄Yahoo!使用第三方的某些用戶的messenger登錄日期/時間,但這種情況實際上並沒有發生。儘管單獨使用檢查自己的作品,但它似乎並沒有使用foreach時也是如此。 checkAvailability輸出「000」。任何人都可以請解決這個問題,也許優化它?PHP問題 - 功能輸出是000

<?php 
error_reporting(E_ALL); 
$users[0] = "|59|62|157|85|218|78|135|43|63|145|151|173|157|93|107|90|84|129|140|110|55|28|210|212|80|128|252|127|15|192|223|154|177|39|129|191|62|17|113|236|2|168&t=0.23704720849047"; 
$users[1] = "|70|255|229|124|194|244|242|223|73|250|184|237|222|251|8|243|104|4|70|125|205|177|229|255|178|244|123|251|13|157|220|47|88|247|15|0&t=0.04614829820959876"; 

function checkAvailability($user){ 
    $dataGot = file_get_contents("http://www.imvisible.ro/getstatus.php?id=".$user); 
    $fullText = explode("|", $dataGot); 
    $status_coded = $fullText[0]; 
    echo $status_coded; 
    return $status_coded; 
} 


while(true) { 
    foreach($users as $user) { 
     $user['oldstatus'] = $user['status']; 

     if (checkAvailability($user) == "1" and $user['oldstatus'] != "online") { 
      $user['status'] = "online"; 
      echo "online"; 
     } elseif (checkAvailability($user) == "3" and $user['oldstatus'] != "invisible") { 
      $user['status'] = "invisible"; 
      echo "invisible"; 
     } elseif (checkAvailability($user) == "2" and $user['oldstatus'] != "offline") { 
      $user['status'] = "offline"; 
      echo "offline"; 
     } else { 
      $user['status'] = "error"; 
      echo "error"; 
     } 
     if ($user['status'] != $user['oldstatus']) { 
      echo $user." a fost detectat ca ".$user['status']." la ".date(DATE_RFC822).".\n"; 
     } 
    } 
    sleep(60); 
    sleep(60); 
} 
+3

你能否縮進你的代碼? – Daedalus

+1

請聯繫http://www.imvisible.ro/並要求他們提供支持。我們無法猜測這個文件是如何被使用的以及它應該返回的。 – Jocelyn

+0

什麼是用戶的正常ID? – Manatax

回答

0

PHP中的無限運行CLI應用程序並非最佳解決方案。當你做一個cronjob並且每隔一分鐘運行一次腳本時它會更好。然後,您可以將狀態或您需要的內容存儲在數據庫或文件中。

我看過你的腳本和測試腳本:

<?php 
error_reporting(E_ALL); 
$users[0] = "|59|62|157|85|218|78|135|43|63|145|151|173|157|93|107|90|84|129|140|110|55|28|210|212|80|128|252|127|15|192|223|154|177|39|129|191|62|17|113|236|2|168&t=0.23704720849047"; 
$users[1] = "|70|255|229|124|194|244|242|223|73|250|184|237|222|251|8|243|104|4|70|125|205|177|229|255|178|244|123|251|13|157|220|47|88|247|15|0&t=0.04614829820959876"; 

function checkAvailability($user){ 
    $dataGot = file_get_contents("http://www.imvisible.ro/getstatus.php?id=".$user); 
    $fullText = explode("|", $dataGot); 
    $status_coded = $fullText[0]; 
    return $status_coded; 
} 

while(true) { 
    foreach($users as $key => $user) { 
     $userStatus[$key] = checkAvailability($user);  

     if(!isset($userStatusRet[$key]['oldstatus'])) { 
      $userStatusRet[$key]['oldstatus'] = ''; 
     } 

     if(!isset($userStatusRet[$key]['status'])) { 
      $userStatusRet[$key]['status'] = ''; 
     } 

     $userStatusRet[$key]['oldstatus'] = $userStatusRet[$key]['status']; 

     if ($userStatus[$key] == "1" and $userStatusRet[$key]['oldstatus'] != "online") { 
      $userStatusRet['status'] = "online"; 
      echo "User ".$key.": online\n"; 
     } elseif ($userStatus[$key] == "3" and $userStatusRet[$key]['oldstatus'] != "invisible") { 
      $userStats['status'] = "invisible"; 
      echo "User ".$key.": invisible\n"; 
     } elseif ($userStatus[$key] == "2" and $userStatusRet[$key]['oldstatus'] != "offline") { 
      $userStatusRet[$key]['status'] = "offline"; 
      echo "User ".$key.": offline\n"; 
     } else { 
      $userStatusRet[$key]['status'] = "error"; 
      echo "User ".$key.": error\n"; 
     } 
    } 
    sleep(5); 
} 

它不是最好的解決辦法,但在你的情況下,問題是,你不能在$user輸出寫入。我用這個用戶標識作爲迭代器在這裏創建了一個新變量。當你運行腳本時,你可以看到輸出:

User 0: online 
User 1: offline 
User 0: online 
User 1: error 
User 0: online 
User 1: offline 
+0

http://codepad.org/0IYVfQNb – Manatax

+0

鍵盤的輸出是不正確的;)我用PHP 5.4運行在我的mashine上,並且運行良好。 不允許的系統調用:SYS_nanosleep 而你應該從鍵盤讀取輸出。系統調用睡眠或其他任何東西都是不允許的。 – Stony