2016-08-08 114 views
2

我創建了一個腳本來檢查備份磁帶到我們的磁帶庫中,並用TSM檢查它們。此腳本由SMS激活。php file_get_contents執行兩次

我們的SMS服務器接收到啓動簽入的命令,然後使用file_get_contents命令在TSM服務器上執行腳本。

我有一個問題,當有磁帶分配到(+20)時,腳本正在執行兩次。這會導致TSM服務器出錯,因爲移動介質命令也是雙倍的。

當第一個file_get_content啓動時,我通過放入一個初始化時間戳記錄來克服這個問題,所以這些命令不會執行兩次。 Allthough這修復了雙重命令問題,但它仍然存在問題,因爲SMS服務器發回的確認腳本已啓動或未啓動。因此,這意味着每次使用+20磁帶進行檢查時,操作員會收到2條消息,其中1條表示辦理登機手續失敗,另一方面辦理登機手續。

我懷疑這是由於命令傳遞到TSM服務器所花費的時間(可能需要長達45秒)所導致的。

長話短說,有沒有辦法可以設置某種更長的超時時間,或者給出任何參數/檢查以防止此行爲?提前致謝。路徑被替換爲*****。

SMS server code 
    //DRM checkin 
      if($auth == 1 AND strtolower($sms_body) == "******"){ 
       $knowncommand = 1; 
       $url = "http://*******/******/checkin.php?remote&exec&sender=" . $from; 
       $dodrm = file_get_contents($url); 
       if ($stmt2 = $mysqli->prepare("UPDATE messagein SET checked = 1 WHERE checked = 0 ")) { 
        $stmt2->execute(); 
        $stmt2->close(); 
       } 
      } 

TSM服務器腳本代碼:

if(isset($_GET['exec'])){ 
    if(isset($_GET['remote'])){ 
     $rcs = CheckRemoteCheckinStatus(); 
     $to = $_GET['sender']; 
     //Execute drm check-in 
     $commit = CheckButtonStatus(); 
     if($commit == "" AND $rcs == 0){ 
      SetRemoteCheckinStatus(); 
      $psDIR = "*****"; 
      $psScript = "drm_checkin_retrieve.ps1"; 
      $runCMD = $psPath. ' -ExecutionPolicy RemoteSigned '.$psDIR.$psScript; 
      exec($runCMD, $out); 
      SetCheckinStatus(); 
      $psDIR = "*****"; 
      $psScript = "QueueSMS.ps1 $to 'Check-in gestart...'"; 
      $runCMD = $psPath. ' -ExecutionPolicy RemoteSigned '.$psDIR.$psScript; 
      exec($runCMD, $out); 
     } 
     else{ 
      //Send Failed SMS 
      $psDIR = "*****"; 
      $psScript = "QueueSMS.ps1 $to 'Fout: Geen Check-in mogelijk.'"; 
      $runCMD = $psPath. ' -ExecutionPolicy RemoteSigned '.$psDIR.$psScript; 
      exec($runCMD, $out); 
     } 
    } 
    else{ 
     $psDIR = "*******"; 
     $psScript = "drm_checkin_retrieve.ps1"; 
     $runCMD = $psPath. ' -ExecutionPolicy RemoteSigned '.$psDIR.$psScript; 
     exec($runCMD, $out); 
     echo "Check-in gestart...<br><br>"; 
     SetCheckinStatus(); 
    } 
} 
+0

你不會在任何地方逃脫任何東西。學習使用urlencode和escapeshellarg和htmlentities – hanshenrik

回答

0

如果你有機會到php.ini,這topic可如果你想增加你的超時只在特定的腳本是有用

,你可以使用set_time_limit

或者另一種方式,在你的php腳本的開頭:

ini_set('max_execution_time', 120); //120 seconds 
+0

嗨,thx的提示,但執行此腳本是一個命令行deamon,並且它的標準執行時間應該已被設置爲限制。所有腳本本身似乎都不會超時,它只是再次發送file_get_contents,然後繼續使用設計的腳本。然而,我會對此進行測試,看看它是否有所作爲。 –

+0

我想用ini_set('default_socket_timeout',900);因爲我預計會有更多的效果。將回來的反饋。 (只能在mo,wed,fri上測試這個) –

+1

你的deamon處於while循環策略,還是通過cron工作調用?腳本被調用兩次的機會是否很短? – shabang