2012-06-01 5 views
6

मैं लगातार अपने सॉफ़्टवेयर में बदलाव करता हूं और इसे सर्वर पर अपलोड करता हूं। चूंकि मेरे पास हर समय मेरे ऑनलाइन सॉफ़्टवेयर का उपयोग करने वाले ग्राहक हैं, यदि कोई PHP फ़ाइल आंशिक रूप से अपलोड की जाती है (मान लीजिए कि अपलोड करने में 3 सेकंड लगते हैं) जब कोई ग्राहक लिंक पर क्लिक करता है (1 सेकंड चिह्न पर कहता है) तो उन्हें एक त्रुटि मिलती है क्योंकि फ़ाइल अभी भी अपलोड हो रहा है ...प्रक्रिया के दौरान सर्वर साइड त्रुटियों के बिना फ़ाइलों को अपलोड करना

Parse error: syntax error, unexpected $end in /inc/functions.php on line 475 

मैं ऑस्ट्रेलिया, हमारे इंटरनेट ... अच्छी तरह से में हूँ के रूप में ... "बहुत तेजी से नहीं है" डालने का एक अच्छा तरीका है।

क्या फाइल अपलोड करते समय उपयोग की जाने वाली कोई तकनीक है, इसलिए यह सॉफ़्टवेयर का उपयोग करने वाले ग्राहकों के लिए त्रुटियों का कारण नहीं बनती है?

केवल एक चीज जो मैं कर सकता हूं, फाइलों को एक और निर्देशिका कहने के लिए अपलोड कर रहा है, फिर एक PHP स्क्रिप्ट चला रहा है जो फ़ाइलों को सुपर फास्ट में कॉपी करता है ... लेकिन क्या बेहतर समाधान हैं?

अंतिम कोड

ग्रेग के लिए धन्यवाद नीचे मैं सबसे अच्छा तरीका है काम करने के लिए यह पता लगाने में सक्षम था। सोचा कि मैं अपना अंतिम कोड साझा करूंगा। यह एक बिट किसी न किसी तरह है, लेकिन काम कर देता है ... उम्मीद है कि यह किसी

<?php 

// root path 
define('ABSPATH', dirname(__FILE__) . '/'); 

// messages 
$GLOBALS['copied'] = array(); 
$GLOBALS['failed'] = array(); 
$GLOBALS['folders'] = array(); 

// you have to submit the form (added security) 
if (isset($_POST['copy'])) { 

    $GLOBALS['devuploads_folder'] = '_devuploads'; 

    function find_files($dir) { 
     if ($dh = opendir(ABSPATH . $dir)) { 
      while (($file = readdir($dh)) !== false) { 

       // ignore files 
       if ($file === '.' || $file === '..') 
        continue; 

       // delete temporary files (optional) 
       if ($file == '.DS_Store') { 
        unlink(ABSPATH . $dir . $file); 
        continue; 
       } 

       // determine paths     
       $live_path = str_replace($GLOBALS['devuploads_folder'] . '/', '', $dir . $file);     
       $dev_file = $dir . $file;     
       $live_file = $live_path; 
       $dev_file_path = ABSPATH . $dir . $file;      
       $live_file_path = ABSPATH . $live_path; 

       // it's a file 
       if (is_file(ABSPATH . $dir . $file)) { 

        // check if the file has been updated or it's a brand newy 
        $updated_file = $new_file = false; 
        if (file_exists($live_file_path)) {         
         $dev_file_modified = filemtime($dev_file_path);  
         $live_file_modified = filemtime($live_file_path);            
         if ($dev_file_modified > $live_file_modified) 
          $updated_file = true;      
        } else { 
         $new_file = true; 
        } 

        // move the file 
        if ($updated_file || $new_file) { 
         if (copy($dev_file_path, $dev_file_path . '.bak')) { 
          if (rename($dev_file_path . '.bak', $live_file_path)) 
           if ($new_file) 
            $GLOBALS['copied'][] = '<strong>New File:</strong> ' . $dev_file . ' moved to ' . $live_file; 
           else 
            $GLOBALS['copied'][] = $dev_file . ' moved to ' . $live_file; 
          else 
           $GLOBALS['failed'][] = '<strong>Rename failed:</strong> ' . $dev_file . ' to ' . $live_file; 
         } else { 
          $GLOBALS['failed'][] = '<strong>Copy failed:</strong> ' . $dev_file . ' to ' . $dev_file . '.bak'; 
         } 
        } 

       // it's a folder 
       } else if (is_dir(ABSPATH . $dir . $file)) { 

        // create new folder if it doesn't exist 
        if (!is_dir($live_file_path)) { 
         $GLOBALS['folders'][] = '<strong>Created:</strong> ' . $live_file; 
         mkdir($live_file_path, 0755); 
        } 

        // keep digging 
        find_files($dir . $file . '/'); 

       } 

      } 
      closedir($dh); 
     } 
    } 

    find_files($GLOBALS['devuploads_folder'] . '/'); 

} 

?> 
<!DOCTYPE HTML> 
<html> 
<head> 
    <title>Copy Changes</title> 
    <style type="text/css"> 
    h1 { 
     font: normal 20px Arial, Helvetica, sans-serif; 
     line-height: 24px; 
     } 
    p, li { 
     font: normal 14px Arial, Helvetica, sans-serif; 
     line-height: 20px; 
     } 
    </style> 
</head> 
<body> 

<?php 
if (!empty($GLOBALS['failed'])) { 
    echo '<h1>Errors</h1>'; 
    echo '<ul>'; 
    foreach($GLOBALS['failed'] AS $message) { 
     echo '<li>' . $message . '</li>'; 
    } 
    echo '</ul>'; 
} 

if (!empty($GLOBALS['folders'])) { 
    echo '<h1>New Folders</h1>'; 
    echo '<ul>'; 
    foreach($GLOBALS['folders'] AS $message) { 
     echo '<li>' . $message . '</li>'; 
    } 
    echo '</ul>'; 
} 

if (!empty($GLOBALS['copied'])) { 
    echo '<h1>Copied</h1>'; 
    echo '<ul>'; 
    foreach($GLOBALS['copied'] AS $message) { 
     echo '<li>' . $message . '</li>'; 
    } 
    echo '</ul>'; 
} 

if (empty($GLOBALS['failed']) && empty($GLOBALS['folders']) && empty($GLOBALS['copied'])) 
    echo '<p>No updates made.</p>'; 
?> 

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post"> 
<input type="hidden" name="copy" value="1" /> 
<p><input type="submit" value="Copy Files" /></p> 
</form> 

</body> 
</html> 
+0

यह त्रुटि आमतौर पर अधूरा फ़ंक्शन के कारण होती है। जांचें कि क्या आपके पास '{' और '}' – ariefbayu

+1

@ अपूर्ण है, जिसके कारण यह एक अधूरा फ़ंक्शन है क्योंकि फाइल आंशिक रूप से अपलोड की गई है जैसा कि मैंने अपने प्रश्न में निर्दिष्ट किया है ... कोड में कुछ भी गलत नहीं है। –

+0

ठीक है, मुझे प्रश्न समझ गया याद आती है। हालांकि, अपलोड करके उपयोगकर्ता अपलोड फाइलें हैं। स्रोत कोड नहीं – ariefbayu

उत्तर

6

में मदद करता है, तो अपने सर्वर लिनक्स (या अन्य यूनिक्स संस्करण) है, तो mv आदेश परमाणु है और तात्कालिक अद्यतन की इस तरह कर सकते हैं । सबसे पहले एक अस्थायी नाम (file.php.new की तरह) पर फ़ाइल की प्रतिलिपि, और फिर सर्वर में लॉग इन और

mv file.php.new file.php 

(यह काम करता है, भले ही file.php मौजूद है, यह नया एक से बदल दिया जाएगा)।

+0

धन्यवाद @ ग्रेग! तो अगर मैं 100 फाइलों को अपडेट करना चाहता हूं, तो अपलोड करने से पहले प्रत्येक फाइल का नाम बदलने और प्रत्येक फाइल के लिए 'एमवी' कमांड चलाने से पहले सबसे अच्छा तरीका क्या होगा? क्या सभी फ़ाइलों को एक फ़ोल्डर में अपलोड करने और PHP का उपयोग करने का मेरा विचार सबसे अच्छा विकल्प होगा? –

+0

आप ऐसा करने के लिए एक स्क्रिप्ट लिख सकते हैं। हालांकि, सुनिश्चित करें कि * उन्हें * कॉपी करने के बजाय उन्हें * स्थानांतरित करें, यह महत्वपूर्ण बिंदु है। ऐसा करने के लिए आप ['नाम बदलें()'] (http://php.net/rename) का उपयोग कर सकते हैं। –

+0

दिलचस्प है कि आपने _copy_ के बजाय _move_ क्यों कहा। क्या इसका कोई कारण है? कारण मैं पूछता हूं कि मैं जिस एफ़टीपी सॉफ़्टवेयर का उपयोग करता हूं, मैं केवल उन फ़ाइलों को अपलोड करने के लिए सेट कर सकता हूं जो हर फ़ाइल को अपलोड करने के बजाए बदले गए हैं जो हर बार कुछ मिनट लेते हैं। सर्वर पर डुप्लिकेट छोड़ना बहुत अच्छा होगा, इसलिए अपलोड समय केवल कुछ सेकंड है। क्या फ़ाइलों को _copying_ कहीं समस्याएं पैदा करता है? –