2012-09-14 59 views
0

能否幫助我在PHP中自定義以下cron腳本。該腳本正在服務器中創建許多後臺進程。一天後,服務器正忙,MYSQL服務器崩潰。使服務器繁忙的UDP cron作業

以下腳本有什麼問題。我需要這個腳本不斷地收聽特定的UDP端口。所以它被設置爲一個cron jon,它將運行每一個mits。

set_time_limit(60); 
class pingtype 
{ 
function rotate() 
{ 

    $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); 
    socket_bind($socket, '50.50.50.50', 9091); 
    $from = ''; 
    $port = 0; 
    $bytes_received = socket_recvfrom($socket, $buf, 150, MSG_PEEK, $from, $port); 
    if ($bytes_received == -1) 
    { 
      die('An error occured while receiving from the socket'); 
      echo "Received $buf from $from\n"; 
    } 

    echo "Received $buf from remote address $from and remote port $port"; 

    $hex_string_buf = "HEX: ".$this->strToHex($buf)."  String: ".$buf; 

    $link = mysql_connect("localhost", "user_database", "123") or die ("Errror in connection ".mysql_error()); 
    mysql_select_db("database") or die ("Error in select ".mysql_error()); 

    $sql = "INSERT INTO socket SET contents='".$hex_string_buf."' "; 
    mysql_query($sql) or die ("Error in query ".mysql_error()); 
    mysql_close($link); 
    // close socket and delete own .sock file 
    socket_close($socket);  
    usleep(1000);  
} 
function strToHex($string) 
{ 
    $hex=''; 
    for ($i=0; $i < strlen($string); $i++) 
    { 
     $hex .= str_pad(dechex(ord($string[$i])), 3); 
    } 
    return $hex; 
} 

function hexToStr($hex) 
{ 
    $string=''; 
    for ($i=0; $i < strlen($hex)-1; $i+=2) 
    { 
     $string .= chr(hexdec($hex[$i].$hex[$i+1])); 
    } 
    return $string; 
} 
} 



for($i=1;$i<=6000;$i++) 
{ 
    $object_pingtype = new pingtype(); 
    $object_pingtype->rotate(); 
} 

回答

0

您正在超載您的服務器。如果腳本運行的每一分鐘,那麼這段代碼被執行:

for($i=1;$i<=6000;$i++) 
{ 
    $object_pingtype = new pingtype(); 
    $object_pingtype->rotate(); 
} 

這歸結爲60分之6000〜100請求每秒。如果服務器沒有足夠的能力,它將不會在60秒內完成這個腳本。然後一個新的腳本開始等等等等。

在一天結束時,您的服務器將分解任務。

或者:

  • 減少在循環
  • 旋轉的數量減少了時間的腳本運行的時速。
+0

減少了輪換和時間。有什麼辦法可以將這個腳本作爲守護進程來運行。現在每次運行cron時,都會爲此創建一個單獨的進程ID。這使服務器繁忙。 –