लंबे समय तक चलने वाली php स्क्रिप्ट को प्रबंधित करने का सबसे अच्छा तरीका?


80

मेरे पास एक PHP स्क्रिप्ट है जिसे पूरा करने में लंबा समय (5-30 मिनट) लगता है। बस मामले में यह मायने रखता है, स्क्रिप्ट किसी अन्य सर्वर से डेटा को परिमार्जन करने के लिए कर्ल का उपयोग कर रही है। यही कारण है कि यह इतना लंबा समय ले रहा है; इसे संसाधित करने से पहले लोड करने और अगले पर जाने के लिए प्रत्येक पृष्ठ की प्रतीक्षा करनी होगी।

मैं स्क्रिप्ट शुरू करने में सक्षम होना चाहता हूं और इसे तब तक होने देना चाहिए, जब तक कि यह डेटाबेस तालिका में एक झंडा स्थापित नहीं कर देगा।

मुझे यह जानने की जरूरत है कि स्क्रिप्ट समाप्त होने से पहले http अनुरोध को समाप्त करने में सक्षम कैसे होना चाहिए। इसके अलावा, php स्क्रिप्ट ऐसा करने का सबसे अच्छा तरीका है?


1
यद्यपि आपने अपने सर्वर द्वारा समर्थित भाषाओं में इसका उल्लेख नहीं किया है, लेकिन मुझे लगता है कि अगर आप रूबी और पर्ल को चलाने की क्षमता रखते हैं, तो आप अनुमान लगा सकते हैं कि आप शायद Node.js जोड़ सकते हैं, और यह मुझे जावास्क्रिप्ट के लिए एक सही उपयोग के मामले जैसा लगता है : आपकी स्क्रिप्ट अपना अधिकांश समय अनुरोधों के पूरा होने की प्रतीक्षा में बिताएगी, जो कि एक ऐसा क्षेत्र है जिसमें async paradigm excells। कोई सूत्र आसान तुल्यकालन का अर्थ नहीं है, संक्षिप्तता का अर्थ है बीजाणु।
डीजेएम

आप इसे PHP के साथ कर सकते हैं। मैं उपयोग करूंगा Goutteऔर Guzzleसमसामयिक सूत्र को लागू करूंगा । आप Gearmanसमानांतर अनुरोधों को शुरू करने के लिए इस पर विचार कर सकते हैं कि यह श्रमिकों का रूप है।
आंद्रे गार्सिया

जवाबों:


114

निश्चित रूप से यह PHP के साथ किया जा सकता है, हालांकि आपको इसे पृष्ठभूमि कार्य के रूप में नहीं करना चाहिए - नई प्रक्रिया को प्रक्रिया समूह से अलग करना होगा जहां यह शुरू किया गया है।

चूँकि लोग इस एफएक्यू का गलत उत्तर देते रहते हैं, मैंने इसका पूरा उत्तर यहाँ दिया है:

http://symcbean.blogspot.com/2010/02/php-and-long-running-processes.html

टिप्पणियों से:

संक्षिप्त संस्करण है, shell_exec('echo /usr/bin/php -q longThing.php | at now');लेकिन यहां शामिल करने के लिए थोड़ा लंबा कारण हैं।


यह ब्लॉग पोस्ट असली जवाब है। PHP के निष्पादन और प्रणाली में बहुत अधिक संभावित नुकसान हैं।
इब्लीमाइक

2
उत्तर में प्रासंगिक विवरण कॉपी करने का कोई भी मौका? बहुत से पुराने उत्तर हैं जो मृत ब्लॉगों से जुड़ते हैं। वह ब्लॉग मृत नहीं है (अभी तक) लेकिन एक दिन होगा।
मर्फी

5
संक्षिप्त संस्करण है, shell_exec('echo /usr/bin/php -q longThing.php | at now');लेकिन यहां शामिल करने के लिए थोड़ा लंबा कारण हैं।
सिम्बियन

1
उच्च-ईश मत वाले प्रश्न पर उच्च-ईश मतदान उत्तर, लेकिन उत्तर में अधिक नहीं है तो एक ब्लॉगपोस्ट का लिंक। कृपया वास्तविक उत्तर जोड़ें, जैसा कि meta.stackexchange.com/questions/8231/… और / या सहायता केंद्र के अनुसार है
Nanne

1
क्या मुझे पता है कि यह -q विकल्प क्या कर रहा है?
किरेन शिवा

11

त्वरित और गंदा तरीका का उपयोग करना होगा ignore_user_abort php में फ़ंक्शन । यह मूल रूप से कहता है: परवाह न करें कि उपयोगकर्ता क्या करता है, इस स्क्रिप्ट को तब तक चलाएं जब तक कि यह समाप्त न हो जाए। यह सार्वजनिक रूप से सामना करने वाली साइट है (क्योंकि यह संभव है, कि आप स्क्रिप्ट के 20 ++ संस्करण एक ही समय में चल रहे हैं यदि यह 20 बार शुरू किया गया हो) तो कुछ हद तक खतरनाक है।

"क्लीन" तरीका (कम से कम IMHO) एक झंडा सेट करना है (उदाहरण के लिए db में) जब आप प्रक्रिया शुरू करना चाहते हैं और हर घंटे (या तो) एक क्रोनजब चलाना चाहते हैं ताकि यह जांच सके कि क्या उस ध्वज को सेट किया गया है। यदि यह सेट है, तो लंबे समय तक चलने वाली स्क्रिप्ट शुरू होती है, अगर यह सेट नहीं है, तो कुछ भी नहीं होता है।


तो "ign_user_abort" विधि उपयोगकर्ता को ब्राउज़र विंडो को बंद करने की अनुमति देगा, लेकिन क्या ऐसा कुछ है जो मैं इसे चलाने से पहले क्लाइंट को एक HTTP प्रतिक्रिया वापस कर सकता हूं?
कर्बन

1
@kbanman हां। आपको कनेक्शन बंद करने की आवश्यकता है header("Connection: close", true);:। और फ्लश करने के लिए मत भूलना ()
बेनुबर्ड

8

आप निष्पादन या सिस्टम का उपयोग कर सकते हैं पृष्ठभूमि का काम शुरू करने के का , और फिर उसी में काम कर सकते हैं।

इसके अलावा, वेब को स्क्रैप करने के लिए बेहतर तरीके हैं जो आप उपयोग कर रहे हैं। आप थ्रेडेड एप्रोच (एक समय में एक पृष्ठ पर कई थ्रेडिंग) का उपयोग कर सकते हैं, या एक ईवेंटलूप का उपयोग कर सकते हैं (एक थ्रेड एक समय में कई पृष्ठ कर रहा है)। पर्ल का उपयोग करने वाला मेरा व्यक्तिगत तरीका AnyEvent :: HTTP का उपयोग करना होगा ।

ईटीए: सिम्बियन ने समझाया कि पृष्ठभूमि प्रक्रिया को यहां ठीक से कैसे अलग किया जाए ।


5
लगभग सही है। बस निष्पादन या प्रणाली का उपयोग करके आप गधे पर काटने के लिए वापस आ जाएंगे। विवरण के लिए मेरा उत्तर देखें।
सिम्बियन

5

नहीं, PHP सबसे अच्छा समाधान नहीं है।

मुझे रूबी या पर्ल के बारे में निश्चित नहीं है, लेकिन पायथन के साथ आप अपने पेज स्क्रैपर को बहु-थ्रेडेड होने के लिए फिर से लिख सकते हैं और यह संभवत: कम से कम 20x तेज़ी से चलेगा। मल्टी-थ्रेडेड एप्लिकेशन लिखना कुछ हद तक एक चुनौती हो सकती है, लेकिन मेरे द्वारा लिखा गया पहला पायथन ऐप, म्यूटल्टी-थ्रेडेड पेज स्क्रैपर था। और आप केवल शेल निष्पादन कार्यों में से एक का उपयोग करके अपने PHP पेज के भीतर से पायथन स्क्रिप्ट को कॉल कर सकते हैं।


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

मैं थोड़ा सा पक्षपाती हूं क्योंकि पायथन सीखने के बाद से मैं एकमुश्त पीएचपी पीएचपी हूं। हालाँकि, यदि आप एक से अधिक पृष्ठ (श्रृंखला में) स्क्रैप कर रहे हैं, तो आपको एक मल्टीथ्रेड ऐप के साथ समानांतर में इसे करके बेहतर प्रदर्शन प्राप्त करना लगभग निश्चित है।
जामिब

1
कोई भी मौका आप मुझे ऐसे पेज स्क्रैपर का उदाहरण भेज सकते हैं? इससे मुझे यह देखने में मदद मिलेगी कि मैंने अभी तक पायथन को नहीं छुआ है।
कर्बन

अगर मुझे इसे फिर से लिखना पड़ा, तो मैं सिर्फ ईवेंटलेट का उपयोग करूंगा। यह 10x सरल के बारे में मेरा कोड बना रहा है: Eventlet.net/doc
jamieb

5

हां, आप इसे PHP में कर सकते हैं। लेकिन PHP के अलावा, क्यू प्रबंधक का उपयोग करना बुद्धिमान होगा। यहाँ रणनीति है:

  1. अपने बड़े कार्य को छोटे कार्यों में तोड़ दें। आपके मामले में, प्रत्येक कार्य एक ही पृष्ठ लोड हो सकता है।

  2. प्रत्येक छोटे कार्य को कतार में भेजें।

  3. कहीं अपने कतार के कार्यकर्ता दौड़ें।

इस रणनीति का उपयोग करने के निम्नलिखित फायदे हैं:

  1. लंबे समय तक चलने वाले कार्यों के लिए यह उस स्थिति में पुनर्प्राप्त करने की क्षमता होती है जब कोई घातक समस्या रन के बीच में होती है - शुरुआत से शुरू करने की आवश्यकता नहीं है।

  2. यदि आपके कार्यों को क्रमिक रूप से नहीं चलाना है, तो आप एक साथ कार्य चलाने के लिए कई श्रमिकों को चला सकते हैं।

आपके पास कई प्रकार के विकल्प हैं (यह कुछ ही है):

  1. RabbitMQ ( https://www.rabbitmq.com/tutorials/tutorial-one-php.html )
  2. ZeroMQ ( http://zeromq.org/bindings:php )
  3. यदि आप Laravel फ्रेमवर्क का उपयोग कर रहे हैं , तो AWS SES, Redis, Beanstalkd के ड्राइवरों के साथ कतारें ( https://laravel.com/docs/5.4/queues ) अंतर्निहित हैं

3

PHP सबसे अच्छा उपकरण हो सकता है या नहीं भी हो सकता है, लेकिन आप जानते हैं कि इसका उपयोग कैसे करना है, और आपके बाकी एप्लिकेशन इसका उपयोग करते हुए लिखे गए हैं। ये दो गुण, इस तथ्य के साथ संयुक्त हैं कि PHP "काफी अच्छा" है, पर्ल, रूबी, या पायथन के बजाय इसका उपयोग करने के लिए एक बहुत मजबूत मामला बनाते हैं।

यदि आपका लक्ष्य दूसरी भाषा सीखना है, तो उसे चुनें और उसका उपयोग करें। आपके द्वारा बताई गई कोई भी भाषा नौकरी करेगी, कोई बात नहीं। मैं पर्ल को पसंद करता हूं, लेकिन आपको जो पसंद है वह अलग हो सकता है।

उसके लिंक पर पृष्ठभूमि प्रक्रियाओं का प्रबंधन करने के बारे में सिम्बियन की कुछ अच्छी सलाह है।

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

सौभाग्य।


1

मैं उन उत्तरों से सहमत हूं जो कहते हैं कि इसे एक पृष्ठभूमि प्रक्रिया में चलाया जाना चाहिए। लेकिन यह भी महत्वपूर्ण है कि आप स्थिति पर रिपोर्ट करें ताकि उपयोगकर्ता को पता हो कि काम किया जा रहा है।

जब PHP प्रक्रिया प्राप्त करने का अनुरोध करता है, तो आप एक डेटाबेस में एक विशिष्ट पहचानकर्ता के साथ कार्य का प्रतिनिधित्व कर सकते हैं। फिर, स्क्रीन-स्क्रैपिंग प्रक्रिया शुरू करें, इसे विशिष्ट पहचानकर्ता पास करें। IPhone ऐप पर वापस रिपोर्ट करें कि कार्य शुरू कर दिया गया है और उसे नवीनतम स्थिति प्राप्त करने के लिए एक निर्दिष्ट URL की जांच करनी चाहिए, जिसमें नई कार्य आईडी है। आईफोन एप्लीकेशन अब इस URL को पोल (या "लॉन्ग पोल") कर सकता है। इस बीच, पृष्ठभूमि प्रक्रिया कार्य के डेटाबेस प्रतिनिधित्व को अद्यतन करेगी क्योंकि यह एक पूर्ण प्रतिशत, वर्तमान चरण, या जो भी अन्य स्थिति संकेतक आप चाहें, के साथ काम करेंगे। और जब यह समाप्त हो जाता है, तो यह एक पूर्ण ध्वज स्थापित करेगा।


1

आप इसे XHR (अजाक्स) अनुरोध के रूप में भेज सकते हैं। सामान्य HTTP अनुरोधों के विपरीत, ग्राहकों के पास आमतौर पर XHRs के लिए कोई टाइमआउट नहीं होता है।


1

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

<?php
/**
 * crawler.php located at http://mysite.com/crawler.php
 */

// Make sure this script will keep on runing after we close the connection with
// it.
ignore_user_abort(TRUE);


function get_remote_sources_to_crawl() {
  // Do a database or a log file query here.

  $query_result = array (
    1 => 'http://exemple.com',
    2 => 'http://exemple1.com',
    3 => 'http://exemple2.com',
    4 => 'http://exemple3.com',
    // ... and so on.
  );

  // Returns the first one on the list.
  foreach ($query_result as $id => $url) {
    return $url;
  }
  return FALSE;
}

function update_remote_sources_to_crawl($id) {
  // Update my database or log file list so the $id record wont show up
  // on my next call to get_remote_sources_to_crawl()
}

$crawling_source = get_remote_sources_to_crawl();

if ($crawling_source) {


  // Run your scraping code on $crawling_source here.


  if ($your_scraping_has_finished) {
    // Update you database or log file.
    update_remote_sources_to_crawl($id);

    $ctx = stream_context_create(array(
      'http' => array(
        // I am not quite sure but I reckon the timeout set here actually
        // starts rolling after the connection to the remote server is made
        // limiting only how long the downloading of the remote content should take.
        // So as we are only interested to trigger this script again, 5 seconds 
        // should be plenty of time.
        'timeout' => 5,
      )
    ));

    // Open a new connection to this script and close it after 5 seconds in.
    file_get_contents('http://' . $_SERVER['HTTP_HOST'] . '/crawler.php', FALSE, $ctx);

    print 'The cronjob kick off has been initiated.';
  }
}
else {
  print 'Yay! The whole thing is done.';
}

@symcbean मैंने आपके द्वारा सुझाई गई पोस्ट पढ़ी और इस वैकल्पिक समाधान पर अपने विचार सुनना चाहूंगा।
फ्रांसिस्को लूज

सबसे पहले, आपने मुझे मेरे पहले बॉट (टीही) के लिए एक शुरुआती विचार दिया है। दूसरे, आपने अपने समाधान का प्रदर्शन कैसे पाया? क्या आपने इसके साथ आगे काम किया है और कुछ और सीखा है? मैं 26,000 छवियों (1,3 जीबी) के माध्यम से ड्रेज के समान कुछ को लागू करने में दिलचस्पी रखता हूं, विभिन्न ऑपरेशन करता हूं, आदि। इसमें थोड़ी देर लगने वाली है। तुम्हारा एकमात्र समाधान है जो हैक नहीं लगता है, निष्पादन का उपयोग करें () कंपकंपी या लिनक्स की आवश्यकता है (हम में से कुछ को अभी भी विंडोज का उपयोग करना है)। मैं अपने खुद के बजाय आपके हेडबाशिंग से सीखना पसंद करता हूं: पी
जस्ट प्लेन हाई

@HighPriestessofTheTech हाय दोस्त, मैं किसी भी आगे नहीं गया है। जिस समय मैंने यह लिखा था मैं सिर्फ एक सोचा प्रयोग कर रहा था।
फ्रांसिस्को लूज

1
ओह डियर ... तो मैं अपने सिर से खुद सीख जाऊंगा ... मैं आपको बता दूंगा कि यह कैसे चलता है?)
जस्ट प्लेन हाई

1
मैंने यह कोशिश की और मुझे यह काफी उपयोगी लगा।
एलेक्स

1

मैं एक ऐसे समाधान का प्रस्ताव करना चाहूंगा जो सिम्बियन से थोड़ा अलग हो, मुख्यतः क्योंकि मुझे अतिरिक्त आवश्यकता है कि लंबे समय तक चलने वाली प्रक्रिया को किसी अन्य उपयोगकर्ता के रूप में चलाने की आवश्यकता है, और अपाचे / www-डेटा उपयोगकर्ता के रूप में नहीं।

एक पृष्ठभूमि कार्य तालिका के सर्वेक्षण के लिए क्रोन का उपयोग करके पहला समाधान:

  • PHP वेब पेज एक पृष्ठभूमि कार्य तालिका में सम्मिलित करता है, 'SUBMITTED'
  • क्रोन प्रत्येक 3 मिनट में एक बार चलता है, दूसरे उपयोगकर्ता का उपयोग करके, PHP CLI स्क्रिप्ट चला रहा है जो 'SUBMITED' पंक्तियों के लिए पृष्ठभूमि कार्य तालिका की जांच करता है
  • PHP CLI पंक्ति में स्थित राज्य कॉलम को 'प्रोसेस' में अपडेट करेगा और प्रोसेसिंग शुरू करेगा, पूरा होने के बाद इसे 'COMPLETED' में अपडेट किया जाएगा

लिनक्स इनोटिफाई सुविधा का उपयोग कर दूसरा समाधान:

  • PHP वेब पेज उपयोगकर्ता द्वारा निर्धारित मापदंडों के साथ एक नियंत्रण फ़ाइल को अपडेट करता है, और एक कार्य आईडी भी देता है
  • शेल स्क्रिप्ट (एक गैर-www उपयोगकर्ता के रूप में) इनोटिफ़ाइट चल रहा है जो नियंत्रण फ़ाइल के लिखे जाने की प्रतीक्षा करेगा
  • नियंत्रण फ़ाइल लिखे जाने के बाद, एक close_write घटना उठाई जाएगी एक शेल स्क्रिप्ट जारी रहेगी
  • शेल स्क्रिप्ट लंबी चलने वाली प्रक्रिया को करने के लिए PHP CLI को निष्पादित करता है
  • PHP CLI टास्क आईडी द्वारा पहचाने गए लॉग फ़ाइल में आउटपुट लिखता है, या वैकल्पिक रूप से एक स्थिति तालिका में प्रगति को अपडेट करता है
  • PHP वेब पेज लंबे चलने की प्रक्रिया की प्रगति दिखाने के लिए लॉग फ़ाइल (कार्य आईडी के आधार पर) को प्रदूषित कर सकता है, या यह स्थिति तालिका को क्वेरी भी कर सकता है

कुछ अतिरिक्त जानकारी मेरी पोस्ट में पाई जा सकती है: http://inventorsparadox.blogspot.co.id/2016/01/long-running-process-in-linux-use-php.html


0

मैंने पर्ल, डबल फोर्क () और पेरेंट प्रक्रिया से अलग होने के साथ इसी तरह की चीजें की हैं। सभी http लाने का काम कांटे की प्रक्रिया में किया जाना चाहिए।


0

अनुरोध को प्रत्यायोजित करने के लिए प्रॉक्सी का उपयोग करें।


0

क्या मैं हमेशा का उपयोग करता है इन वेरिएंट में से एक है (क्योंकि लिनक्स के विभिन्न स्वादों में आउटपुट से निपटने के बारे में अलग-अलग नियम हैं / कुछ प्रोग्राम आउटपुट आउटपुट के बारे में हैं:

वेरिएंट I @exec ('./ myscript.php \ 1> / dev / null \ 2> / dev / null &');

वेरिएंट II @exec ('php -f myscript.php \ 1> / dev / null \ 2> / dev / null &');

वेरिएंट III @exec ('nohup myscript.php \ 1> / dev / null \ 2> / dev / null &');

आप "nohup" स्थापित नहीं कर सकते। लेकिन उदाहरण के लिए, जब मैं एफएफएमपीईजी वीडियो कन्वर्सेशन को स्वचालित कर रहा था, तो आउटपुट इंटरफ़ेस किसी तरह 100% को आउटपुट स्ट्रीम 1 और 2 द्वारा पुनर्निर्देशित नहीं किया गया था, इसलिए मैंने नोह का इस्तेमाल किया और आउटपुट को रीडायरेक्ट किया।


0

यदि आपके पास लंबी स्क्रिप्ट है तो प्रत्येक कार्य के लिए इनपुट पैरामीटर की सहायता से पृष्ठ कार्य को विभाजित करें। (फिर प्रत्येक पृष्ठ धागे की तरह कार्य करता है) अर्थात यदि पृष्ठ में 1 लाख product_keywords लंबी प्रक्रिया लूप है तो लूप के बजाय एक कीवर्ड के लिए तर्क बनाएं और इस कीवर्ड को पास करें जादू या cornjobpage.php से (निम्नलिखित उदाहरण में)

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

cornjobpage.php // मुख्य पृष्ठ

    <?php

post_async("http://localhost/projectname/testpage.php", "Keywordname=testValue");
//post_async("http://localhost/projectname/testpage.php", "Keywordname=testValue2");
//post_async("http://localhost/projectname/otherpage.php", "Keywordname=anyValue");
//call as many as pages you like all pages will run at once independently without waiting for each page response as asynchronous.
            ?>
            <?php

            /*
             * Executes a PHP page asynchronously so the current page does not have to wait for it to     finish running.
             *  
             */
            function post_async($url,$params)
            {

                $post_string = $params;

                $parts=parse_url($url);

                $fp = fsockopen($parts['host'],
                    isset($parts['port'])?$parts['port']:80,
                    $errno, $errstr, 30);

                $out = "GET ".$parts['path']."?$post_string"." HTTP/1.1\r\n";//you can use POST instead of GET if you like
                $out.= "Host: ".$parts['host']."\r\n";
                $out.= "Content-Type: application/x-www-form-urlencoded\r\n";
                $out.= "Content-Length: ".strlen($post_string)."\r\n";
                $out.= "Connection: Close\r\n\r\n";
                fwrite($fp, $out);
                fclose($fp);
            }
            ?>

testpage.php

    <?
    echo $_REQUEST["Keywordname"];//case1 Output > testValue
    ?>

PS: यदि आप url पैरामीटर को लूप के रूप में भेजना चाहते हैं तो इस उत्तर का अनुसरण करें: https://stackoverflow.com/a/41225209/6295712


0

सबसे अच्छा तरीका नहीं है, जैसा कि यहां बताया गया है, लेकिन इससे मदद मिल सकती है:

ignore_user_abort(1); // run script in background even if user closes browser
set_time_limit(1800); // run it for 30 minutes

// Long running script here

0

यदि आपकी स्क्रिप्ट का वांछित आउटपुट कुछ प्रोसेसिंग है, वेबपेज नहीं है, तो मेरा मानना ​​है कि वांछित समाधान शेल से अपनी स्क्रिप्ट को चलाने के लिए है, बस

php my_script.php

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.