2009-09-19 11 views
6

कैसे एक PHP स्क्रिप्ट एक और PHP स्क्रिप्ट, और फिर बाहर निकलने शुरू कर सकते हैं, अन्य स्क्रिप्ट चलाने छोड़ने?क्या एक PHP स्क्रिप्ट एक और PHP स्क्रिप्ट शुरू कर सकती है और बाहर निकल सकती है?

इसके अलावा, वहाँ किसी भी तरह से 2 स्क्रिप्ट PHP स्क्रिप्ट को सूचित करने के लिए जब यह एक विशेष सीमा तक पहुंच जाता है?

+0

इस के साथ 'curl' मदद कर सकता है? कोई विचार कैसे? –

+0

कर्ल? संभवतः केवल 'हेड' अनुरोध के साथ, लेकिन मैं –

+0

पर संदेह कर रहा हूं - यदि पहली स्क्रिप्ट समाप्त हो जाती है, तो दूसरी स्क्रिप्ट 1 को कैसे सूचित करेगी? - क्या यह एक वेब पेज या कंसोल स्क्रिप्ट है? –

उत्तर

7

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

<?php 
ob_end_clean(); 
header("Connection: close"); 
ignore_user_abort(); // optional 
ob_start(); 
echo ('Text the user will see'); 
$size = ob_get_length(); 
header("Content-Length: $size"); 
ob_end_flush();  // Will not work 
flush();   // Unless both are called ! 

// At this point, the browser has closed connection to the web server 

// Do processing here 
include('other_script.php'); 

echo('Text user will never see'); 
?> 
+1

क्या आप अपना कोड थोड़ा सा समझा सकते हैं? उदाहरण के लिए, फ्लशिंग ब्राउज़र को HTTP अनुरोध खत्म होने में सोचने की कोशिश करता है? –

+0

हाँ, यह काम करता है! कृपया इस प्रश्न को इस प्रश्न पर भी पोस्ट करें - http://stackoverflow.com/questions/1436575/can-a-php-script-trick-the-browser-into-thinking-the-http-request-is-over –

+0

मैंने इसका जवाब थोड़ा सा समझाया। –

1

यहाँ अंधेरे में एक शॉट है: आप & साथ php के ओएस निष्पादन कार्यों का उपयोग कर की कोशिश कर सकते।

exec("./somescript.php &"); 

साथ ही, कि अगर काम नहीं करता है, तुम कोशिश कर सकते

exec("nohup ./somescript.php &"); 

संपादित करें: nohup is a POSIX command to ignore the HUP (hangup) signal, enabling the command to keep running after the user who issues the command has logged out. The HUP (hangup) signal is by convention the way a terminal warns depending processes of logout.

+0

'नोहुप' ?? वह क्या करता है –

3

आप को प्रभावी ढंग से forking और फिर बुला include या require द्वारा इस लक्ष्य को हासिल कर सकते हैं।

parent.php:

<?php 

    $pid = pcntl_fork(); 
    if ($pid == -1) { 
     die("couldn't fork"); 
    } else if ($pid) { // parent script 
     echo "Parent waiting at " . date("H:i:s") . "\n"; 
     pcntl_wait($status); 
     echo "Parent done at " . date("H:i:s") . "\n"; 
    } else { 
     // child script 
     echo "Sleeper started at " . date("H:i:s") . "\n"; 
     include('sleeper.php'); 
     echo "Sleeper done at " . date("H:i:s") . "\n"; 
    } 

?> 

sleeper.php:

<?php 
sleep(3); 
?> 

आउटपुट:

 
$ php parent.php 
Sleeper started at 01:22:02 
Parent waiting at 01:22:02 
Sleeper done at 01:22:05 
Parent done at 01:22:05 

हालांकि, forking के स्वाभाविक किसी भी अंतर संचार प्रक्रिया की अनुमति नहीं है, तो आप ऐसा माता-पिता को सूचित करने के लिए किसी अन्य तरीके को ढूंढना होगा कि बच्चा विशिष्ट लाइन तक पहुंच गया है, जैसा आपने पूछा था ई सवाल

+0

+1 मुझे नहीं लगता कि वह वही चाहता है जो वह चाहता था, लेकिन अभी भी बहुत उपयोगी –

+0

आप सॉकेट विधियों के माध्यम से द्विपक्षीय संचार प्रदान कर सकते हैं (देखें http://www.php.net/manual/en/ref.sockets.php) । –

0

यदि आप पीसीएनटीएल एक्सटेंशन बनाना नहीं चाहते हैं, तो proc_open() का उपयोग करने के लिए एक अच्छा विकल्प है।

http://www.php.net/manual/en/function.proc-open.php

उपयोग है कि एक साथ stream_select साथ() तो अपने PHP प्रक्रिया कुछ जब तक सो सकते हैं बच्चे प्रक्रिया आपके द्वारा बनाई गई के साथ होता है।

प्रभावी ढंग से पृष्ठभूमि में एक प्रक्रिया पैदा करेगा कि, माता पिता पीएचपी प्रक्रिया को रोके बिना

। आप PHP एसडीडीआईएन, एसटीडीओयूटी, एसटीडीईआरआर को पढ़ और लिख सकते हैं।

ब्राउज़र को पूर्ण लोड करने के लिए (लोड प्रगति संकेतक को रोकें) तो आप मिलान बाबुस्कोव का उल्लेख कर सकते हैं।

ब्राउज़र बनाने के लिए महत्वपूर्ण लगता है HTTP अनुरोध पूरा हो गया है, यह सामग्री की लंबाई को भेजने के लिए है। ऐसा करने के लिए आप अनुरोध को बफर करना प्रारंभ कर सकते हैं, फिर सामग्री-लंबाई शीर्षलेख भेजने के बाद इसे फ़्लश करें।

जैसे:

<?php 

ob_start(); 

// render the HTML page and/or process stuff 

header('Content-Length: '.ob_get_length()); 
ob_flush(); 
flush(); 

// can do more processing 

?> 
0

तो एक अनुरोध बना सकते हैं और कनेक्शन सही होने के बाद यह करने के लिए लिखा जा रहा से किया जाता है बंद कर सकते हैं।

http://drupal.org/project/httprl में कोड को चेकआउट करें क्योंकि यह (गैर-अवरुद्ध अनुरोध) कर सकता है। एक बार जब मैं इसे अधिक पॉलिश प्राप्त करता हूं तो मैं इस lib को github पर धक्का देने की योजना बना रहा हूं; कुछ ऐसा जो ड्रोपल के बाहर भाग सकता है। यह वही करना चाहिए जो आप खोज रहे हैं।

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