2008-12-10 11 views
5

मैं एक स्क्रिप्ट लिखने की कोशिश कर रहा हूं जो सर्वर पर एक फाइल बनायेगा और उस उपयोगकर्ता को उस फ़ाइल पर रीडायरेक्ट करने के लिए header() का उपयोग करें। फिर, लगभग 10 सेकंड के बाद मैं फ़ाइल को हटाना चाहता हूं। मैं इस की कोशिश की है:पेज लौटाए जाने के बाद एक php स्क्रिप्ट चलाना जारी रखें

header('Location: '.$url); 
flush(); 
sleep(10); 
unlink($url); 

लेकिन ब्राउज़र सिर्फ स्क्रिप्ट तो पूरा करने के लिए इंतजार कर रहा है रीडायरेक्ट कर दिया जाता है, लेकिन फ़ाइल hes उस समय तक हटा दिया गया। ब्राउजर को "फाइल के अंत" को बताने के लिए कुछ है, तो कंप्यूटिंग रखें? या हो सकता है कि PHP ने एक और स्क्रिप्ट शुरू की हो, लेकिन उस स्क्रिप्ट को समाप्त करने की प्रतीक्षा न करें?

उत्तर

0

आप इस तरह ख़ाली कर कोशिश कर सकते हैं:

<iframe src="<?=$url?>"></iframe> 

.... 
<? 
sleep(10); 
unlink($url); 
?> 

अन्य विकल्प कर्ल उपयोग करने के लिए है - तो आप अनुरोध और उपयोगकर्ता के लिए प्रदर्शन में फ़ाइल लोड।

प्रश्न - क्या आप उस फ़ाइल को हटाना चाहते हैं जिस पर उपयोगकर्ता नहीं हो सकता - मुझे डर है कि यह असंभव है, जब उपयोगकर्ता फ़ाइल लोड करता है तो यह अपने ब्राउज़र में अस्थायी है - इसलिए वह इसे बचा सकता है।

अगला विकल्प - यदि आप इस फ़ाइल के प्रकार को जानते हैं, तो आप सामग्री/प्रकार शीर्षलेख उत्पन्न कर सकते हैं ताकि उपयोगकर्ता फ़ाइल डाउनलोड कर सके। और फिर आप इसे हटा दें।

यह सिर्फ सरल विचारों है, पता नहीं है जो आप के लिए काम करेंगे (यदि कोई हो :))

1

एक ही रास्ता मैं अब तक यह करने के लिए की खोज की है शीर्षक में सामग्री की लंबाई प्रदान करना है। इसे जोड़ने का प्रयास करें:

header("Content-Length: 0"); 

आपके फ्लश() से पहले;

1

http://us2.php.net/ignore_user_abort

इस का उपयोग करते हुए बहुत सावधान रहें, आप को बहुत शीघ्र एक सर्वर यह कोस से मार सकते हैं।

4

PHP पृष्ठ फ़ाइल को सेवा देने से बेहतर हो सकता है। इस मामले में एक अस्थायी फ़ाइल बनाने की आवश्यकता नहीं है और इसे हटाएं, केवल उस डेटा को भेजें जिसे आप अस्थायी फ़ाइल में लिखना चाहते हैं। आपको हेडर को सही तरीके से सेट करने की आवश्यकता होगी ताकि ब्राउज़र आपके द्वारा भेजी जा रही फ़ाइल के प्रकार की पहचान कर सके। यानी सामग्री-प्रकार: टेक्स्ट/एक्सएमएल; jpg के लिए xml या image/jpeg के लिए।

यह विधि धीमी क्लाइंट को भी संभालती है जो फ़ाइल को डाउनलोड करने में अधिक समय लेती है।

+0

हाँ में देखा एक पृष्ठ बनाने और तो इसे नष्ट करना संसाधनों का अपशिष्ट है, बस इस फ़ाइल को उपयोगकर्ता को प्रिंट करें, दो पक्षियों को 1 पत्थर से मारता है। यदि आप CSV आउटपुट की तरह कुछ करने की कोशिश कर रहे हैं, तो ब्राउज़र पर इसे प्रिंट करना अभी भी सबसे अच्छा तरीका है। – TravisO

1

वैकल्पिक रूप से .... बजाय मक्खी पर फ़ाइलें गतिशील रूप से पैदा ... क्यों इतनी तरह एक हैंडलर नहीं के साथ खिलवाड़ की:

tempFile.php कुंजी = {MD5 हैश}

tempfile। php फिर या तो एक डीबी, memcache (अतिरिक्त प्रीपेन्ड कुंजी के साथ), या सामग्री के लिए एपीसी पूछताछ करता है।

-1

आप इस बारे में गलत तरीके से जा रहे हैं। आप फ़ाइल बना सकते हैं और उन्हें सेवा दे सकते हैं, और इसे एक चरण में हटा सकते हैं।

<?php 
$file_contents = 'these are the contents of your file'; 
$random_filename = md5(time()+rand(0,10000)).'.txt'; 
$public_directory = '/www'; 
$the_file = $public_directory.'/'.$random_filename; 
file_put_contents($the_file, $file_contents); 
echo file_get_contents($the_file); 
unlink($the_file); 
?> 

यदि आप ऐसा करते हैं, तो उपयोगकर्ता उन्हें देखे जाने के तुरंत बाद फ़ाइलों को हटा दिया जाता है। बेशक, इसका मतलब है कि फाइल को पहले स्थान पर मौजूद नहीं होना चाहिए।जहाँ आप सामग्री आप उन्हें दिखाना चाहते हो रही है पर

<?php 
$file_contents = 'these are the contents of your file'; 
echo $file_contents; 
?> 

यह सब निर्भर करता है: तो तुम यह करने के लिए कोड को छोटा कर सकते हैं। यदि यह एक फ़ाइल से है, की कोशिश:

<?php 
$file_contents = file_get_contents($filename_or_url); 
echo $file_contents; 
?> 

फ़ाइलें स्वचालित रूप से हटाने के लिए के रूप में, सिर्फ सेटअप एक क्रॉन जॉब कि हर 10 सेकंड चलाता है, और सभी फाइलों को अपने अस्थायी फ़ोल्डर में हटा देता है जहां filemtime ($ फ़ाइल का नाम) अधिक से अधिक है कि 5 मिनट के सेकंड से अधिक सेकंड।

0

आप अपनी मूल डिजाइन को लागू करना चाहते हैं,, पीएचपी में एक कमांड चलाने के बारे में यह सवाल है कि है पढ़ें "आग और भूल जाओ" Asynchronous shell exec in PHP

0

रूप \Symfony\Component\HttpFoundation\Response::send

/** 
* Sends HTTP headers and content. 
* 
* @return Response 
* 
* @api 
*/ 
public function send() 
{ 
    $this->sendHeaders(); 
    $this->sendContent(); 

    if (function_exists('fastcgi_finish_request')) { 
     fastcgi_finish_request(); 
    } elseif ('cli' !== PHP_SAPI) { 
     // ob_get_level() never returns 0 on some Windows configurations, so if 
     // the level is the same two times in a row, the loop should be stopped. 
     $previous = null; 
     $obStatus = ob_get_status(1); 
     while (($level = ob_get_level()) > 0 && $level !== $previous) { 
      $previous = $level; 
      if ($obStatus[$level - 1]) { 
       if (version_compare(PHP_VERSION, '5.4', '>=')) { 
        if (isset($obStatus[$level - 1]['flags']) && ($obStatus[$level - 1]['flags'] & PHP_OUTPUT_HANDLER_REMOVABLE)) { 
         ob_end_flush(); 
        } 
       } else { 
        if (isset($obStatus[$level - 1]['del']) && $obStatus[$level - 1]['del']) { 
         ob_end_flush(); 
        } 
       } 
      } 
     } 
     flush(); 
    } 

    return $this; 
} 
संबंधित मुद्दे