2013-02-13 12 views
22

हां, इस सवाल से पहले पूछा गया है, हालांकि, जवाब असंगत रहे हैं। उदाहरण के लिए Why I have to call 'exit' after redirection through header('Location..') in PHP? लें। प्रत्येक उत्तर (स्वीकृत उत्तर सहित) हां कहता है, अंतिम उत्तर को छोड़कर जो शून्य वोट प्राप्त करता है जो "शायद" कहता है। मुझे लगता है कि सही जवाब "शायद" है। इसे एक सरल "हां" या "नहीं" प्रश्न बनाने के लिए, क्या यह() निम्नलिखित स्क्रिप्ट को निष्पादित किया जाएगा? धन्यवादहेडर रीडायरेक्ट के बाद PHP स्क्रिप्ट निष्पादित की जाएगी?

header('Location: http://somewhereElse.com'); 
//die(); 
sleep(1000); 
doThis(); 

संपादित करें धन्यवाद, सब कुछ। मेरे PHP/Linux/अपाचे कॉन्फ़िगरेशन के साथ, दूसरा syslog() निष्पादित करता है, इसलिए उत्तर "हां, शीर्षलेख की सभी स्क्रिप्ट डाउन स्ट्रीम निष्पादित की जाएगी।" मैं मानूंगा (और आशा करता हूं कि मैं सही हूं) यह सभी PHP/Linux/अपाचे कॉन्फ़िगरेशन के साथ समान है!

<?php 
    header('Location: http://google.com'); 
    syslog(LOG_INFO,'first'); 
    sleep(5); 
    syslog(LOG_INFO,'Second'); 
?> 
+3

क्या आपने इसे आजमाया है? आपके उदाहरण में नींद का समय 'max_execution_time' से अधिक होगा। अन्यथा, हाँ। – mario

+1

हां, हालांकि आपको 'नींद()' कॉल की आवश्यकता नहीं है। 'हेडर() 'निष्पादन को रोकता नहीं है, केवल प्रतिक्रिया शीर्षलेख – Phil

+0

सेट करता है, नहीं, कोशिश नहीं की है। मुझ पर शर्म की बात है! मेरे मूल संदर्भित एसओ थ्रेड के साथ-साथ http://stackoverflow.com/questions/7246649/will-all-code-after-redirect-header-in-php-always-get-executed पर प्रतिक्रियाओं को अंतिम पोस्ट पढ़ना, यह ऐसा लगता है कि अपाचे कनेक्शन बंद कर देगा, और PHP स्क्रिप्ट निष्पादित करना बंद कर देगा। – user1032531

उत्तर

18

हाँ, स्क्रिप्ट यदि आप स्पष्ट रूप से इसे समाप्त नहीं है header('Location: http://google.com') करने के लिए कॉल के बाद कार्रवाई करने के लिए जारी है! मैंने बस इसे स्थानीय रूप से आजमाया। मैं इन सामग्री के साथ अपाचे में एक साइट के लिए test.php कहा:

<?php 

header('Location: http://google.com'); 
error_log("WE MADE IT HERE SOMEHOW"); 

?> 

और मेरे/var जाँच/इस प्रविष्टि के लिए लॉग इन करें/apache2/error_log:

[Tue Feb 12 23:39:23 2013] [error] [client 127.0.0.1] WE MADE IT HERE SOMEHOW 

शायद आश्चर्य की बात है, लेकिन हाँ यह, निष्पादन जारी नहीं है अगर आप निष्पादन रोक नहीं है।

+0

मुझे परीक्षण नहीं करने के लिए लंगड़ा लगता है! आपके लिए बहुत अच्छा कोडी! वैज्ञानिक विधि जाओ! मैं अपने निष्कर्षों का परीक्षण और पोस्ट भी करूंगा। – user1032531

+0

धन्यवाद कोडी। मैंने आपके परिणामों का परीक्षण किया और सहमति व्यक्त की। परीक्षण से पहले मैंने पूछा था कि मुझे यकीन नहीं था कि यह कॉन्फ़िगरेशन निर्धारित करता है या नहीं। मैं भविष्य में यह मानता हूं कि ओएस या वेब सर्वर पर ध्यान दिए बिना इसे हमेशा निष्पादित किया जाएगा। – user1032531

0

हां, इसे कम समय के लिए निष्पादित किया जाएगा। रीडायरेक्ट हैडर ब्राउज़र को भेजी जाती है

एक बार, ब्राउज़र वर्तमान कनेक्शन को बंद करने और रीडायरेक्ट URL के लिए एक नया खुलेगा। जब तक कि मूल कनेक्शन बंद नहीं होता है और अपाचे स्क्रिप्ट को बंद कर देता है, तो आपका कोड पहले के रूप में निष्पादित करना जारी रखेगा।

सिद्धांत रूप में, अगर वहाँ क्लाइंट/सर्वर के बीच एक पर्याप्त तेजी से कनेक्शन था, और कोई बफरिंग नहीं थी पाइप लाइन में कहीं भी, हैडर का कारण होगा स्क्रिप्ट तुरंत समाप्त किया जाना जारी करने। हकीकत में, यह बंद होने के लिए "अब" और "कभी नहीं" के बीच कहीं भी हो सकता है।

Read more

+0

तो, जवाब नहीं है, 1000 सेकंड (या जो भी) देरी दी गई है? – user1032531

+0

यह आपके इंटरनेट कनेक्शन पर निर्भर करता है। – Techie

+0

मुझे लगता है कि यह क्लाइंट पर भी निर्भर करता है। कहें, उदाहरण के लिए, कुछ ग्राहक पृष्ठ का अनुरोध करते हैं और हेडर का सम्मान नहीं करते हैं। –

5

मुझे और अधिक स्पष्ट करने दें। चलो सत्र का उपयोग कर एक उदाहरण है।

$_SESSION["username"] = 'some username'; 
header("Location: another-file.php"); 
$_SESSION["username"] = 'replace username';

$_SESSION["username"] का परिणाम हो जाएगा replace username

आप हेडर के साथ सिर्फ Location हेडर, जिनमें से अधिकांश आप अपने कोड निष्पादन को रोकने के लिए नहीं करना चाहते हैं की तुलना में उत्पादन एक बहुत अधिक हेडर कर सकते हैं। अगर आप कोड निष्पादन को रोकना चाहते हैं, तो आपको स्पष्ट रूप से exit पर कॉल करने की आवश्यकता है।

header कमांड आपके कोड के प्रवाह को बाधित नहीं करता है। यहां तक ​​कि यदि इसका सामना करना पड़ता है, तो भी आपका पृष्ठ ब्राउज़र द्वारा डाउनलोड किया जाता है, भले ही यह प्रदर्शित न हो। 404 pages पर विचार करें, जो (त्रुटियों के बावजूद) अभी भी ब्राउज़र द्वारा संसाधित किए जाते हैं (हालांकि रीडायरेक्ट के दौरान उन्हें प्रस्तुत किया जाता है)।

0

हाँ हाँ हाँ, हेडर php स्क्रिप्ट के किसी अन्य भाग की तरह है, यह स्क्रिप्ट निष्पादन पूरा होने के बाद भेजा जाएगा, हालांकि, चाल है: अगर हम नए यूआरएल पर रीडायरेक्ट करना चाहते हैं: तो स्क्रिप्ट निष्पादित करना जारी रखें हेडर ("स्थान: यूआरएल"); ?>

<?php 
header('Location: test.php'); 
header('Location: test.php'); 
header('Location: test.php'); 
header('Location: test.php'); 
header('Location: test.php'); 
header('Location: test.php'); 
header('Location: test.php'); 

$var = 'google.com'; 
header("Location: http://$var"); 

?> 
3

कोड चल रहा है:

//http://www.php.net/manual/en/function.header.php 
header('Location: http://google.com'); 
flush(); 
sleep(3); 

$a=fopen('test.txt', 'w'); 
fwrite($a,headers_sent()); 
fclose($a); 

सर्वर रुका हुआ है और फ़ाइल लिखा से पहले ग्राहक मुझे निर्देशित कर दिये। ऐसा इसलिए है क्योंकि बफर में flush() के बाद भी, रीडायरेक्ट संसाधित नहीं होता है जब तक कि स्क्रिप्ट निष्पादन को समाप्त नहीं करती (यानी, स्क्रिप्ट समाप्त हो जाती है)। फ़ाइल test.txt में प्रत्येक मामले में '1' था, जिसका अर्थ है कि हेडर भेजे गए थे, कनेक्शन समाप्त होने तक ब्राउज़र द्वारा संसाधित नहीं किया गया था।

  • हर मामले में , एक Win32 विकास मशीन, linux विकास मशीन, और एक linux उत्पादन वातावरण पर जिसका अर्थ है।
7

लोगों को यह वास्तव में उलझन में लग रहा है, और क्यों लिपि को निष्पादित किया जाता है। जब आप रीडायरेक्ट हेडर भेजते हैं तो ब्राउजर तुरंत उपयोगकर्ता को नए पेज पर रीडायरेक्ट करता है लेकिन आपका सर्वर कोड को संसाधित करना जारी रखेगा, भले ही इसे अंत में प्राप्त करने के लिए कोई भी न हो, इसका मतलब यह नहीं है कि स्क्रिप्ट समाप्त हो गई है। जब तक आप स्क्रिप्ट को रोकने के लिए अपाचे को कॉन्फ़िगर नहीं करते हैं, जब यह महसूस होता है कि दूसरे छोर पर कोई नहीं है।

जब एक PHP स्क्रिप्ट सामान्य रूप से सामान्य स्थिति चल रही है, सक्रिय है। यदि रिमोट क्लाइंट एबॉर्टेड स्टेट फ्लैग को डिस्कनेक्ट करता है तो चालू हो जाता है। रिमोट क्लाइंट डिस्कनेक्ट आम तौर पर उपयोगकर्ता द्वारा अपना स्टॉप बटन मारने के कारण होता है।

आप तय कर सकते हैं कि क्या आप क्लाइंट को को अपनी स्क्रिप्ट को निरस्त करने के कारण डिस्कनेक्ट करना चाहते हैं या नहीं। कभी-कभी आउटपुट प्राप्त करने वाले रिमोट ब्राउज़र नहीं होने पर भी आपकी स्क्रिप्ट पूरी होने के लिए आसान होती है। रिमोट क्लाइंट डिस्कनेक्ट होने पर डिफ़ॉल्ट स्क्रिप्ट आपकी स्क्रिप्ट के लिए निरस्त हो जाती है। यह व्यवहार ignore_user_abort php.ini निर्देश के साथ-साथ संबंधित php_value ignore_user_abort अपाचे httpd.conf निर्देश या ignore_user_abort() फ़ंक्शन के माध्यम से सेट किया जा सकता है।

आगे कार्रवाई के बिना किसी उपयोगकर्ता पुनः निर्देशित का सही तरीका है:

header("Location: blah.php"); 
exit(); 
0
header("Location: http://example.com/newURL.php"); 
die; 

हाँ स्क्रिप्ट हेडर रीडायरेक्ट के बाद जारी है, इसलिए die; या exit; किसी भी समय आप पर अनुप्रेषित कॉल करने के लिए सुनिश्चित करें निष्पादन रोकने के लिए। स्क्रिप्ट को सोने के लिए रखने की जरूरत नहीं है :)।

How to make a redirect in PHP?

1

यह पहला उदाहरण से पता चलता है कि कुछ कोड हैडर स्थान रीडायरेक्ट के बाद क्रियान्वित किया जाता है, लेकिन यह सब कोड जरूरी निष्पादित किया जाता है नहीं। एक बार जब ब्राउज़र रीडायरेक्ट हेडर का जवाब देना शुरू कर देता है, तो यह वर्तमान पृष्ठ पर कनेक्शन समाप्त कर देगा, जिससे PHP को कोड को निष्पादित करने का कारण बन जाएगा। यह दिखाता है कि चीजें कैसे नहीं करें।

session_start(); 
$_SESSION["some_value"] = 'original value'; 
header("Location: /index.php/test2"); 

$start_time = microtime(true); 

for($i = 0; $i <= 100000; $i ++) 
{ 
    password_hash($i); // slow it down 
    $_SESSION["some_value"] = $i; 
    $_SESSION['time'] = microtime(true) - $start_time; 
} 

$_SESSION['some_value'] = 'finished!'; 

// Result: 
// some_value = 174 

इस उदाहरण में मैं ignore_user_abort() जोड़ा सब कैसे कोड निष्पादित करने के लिए दिखाने के लिए:

ignore_user_abort(TRUE); 
session_start(); 
$_SESSION["some_value"] = 'original value'; 
header("Location: /index.php/test2"); 

$start_time = microtime(true); 

for($i = 0; $i <= 100000; $i ++) 
{ 
    password_hash($i); // slow it down 
    $_SESSION["some_value"] = $i; 
    $_SESSION['time'] = microtime(true) - $start_time; 
} 

$_SESSION['some_value'] = 'finished!'; 

// Result: 
// some_value = finished! 

और यह कैसे आप आमतौर पर, एक रीडायरेक्ट पर अमल होगा रीडायरेक्ट के तुरंत बाद स्क्रिप्ट की हत्या करके है :

session_start(); 
$_SESSION["some_value"] = 'original value'; 
header("Location: /index.php/test2"); 
die(); 

$start_time = microtime(true); 

for($i = 0; $i <= 100000; $i ++) 
{ 
    password_hash($i); // slow it down 
    $_SESSION["some_value"] = $i; 
    $_SESSION['time'] = microtime(true) - $start_time; 
} 

$_SESSION['some_value'] = 'finished!'; 

// Result: 
// some_value = original value 

संक्षेप में, या तो उपयोग मरने(), बाहर निकलें(), या ignore_user_abort (TRUE);

+0

के लिए +1 आपकी टिप्पणी के नीचे, क्या आप ignore_user_abort (गलत) का मतलब नहीं है? – MarcoZen

-1

यूएससीएएसई स्कैनरियो: उपयोगकर्ताओं को कैप्टिव पोर्टल पर रीडायरेक्ट करें, फिर x मिनट के बाद ब्लॉक सूची से उन्हें लिखने के लिए एक उलटी गिनती टाइमर शुरू करें।

संबंधित मुद्दे