दिलचस्प पोस्ट
आप "क्या मतलब है" को लागू करते हैं? कैरियरविवे का उपयोग करके 4 एकाधिक छवि या फ़ाइल अपलोड करें मैं कैसे जान सकता हूँ जब कोई संपादन टेक्स्ट फोकस खो देता है? IPhone पर संपीड़न एपीआई CSS फ्लेक्सबॉक्स IE10 में काम नहीं कर रहा है क्या विंडोज़ पर बैश स्क्रिप्ट चलाने का कोई तरीका है? कैसे एक ढाल के साथ एक UIBezierPath भरने के लिए? दिए गए स्ट्रिंग के सभी क्रमपरिवर्तन उत्पन्न करना दशमलव अंकों के साथ संख्यात्मक मान दर्ज करने का सबसे अच्छा तरीका क्या है? पोस्टग्रे एसक्यूएल गैपलेस सीक्वेंस पायथन में सिंगलटन बनाना हम डेटाग्रिड दृश्य में पृष्ठ पर अंकुश लगाने कैसे कर सकते हैं समय घटक के बिना NSDates की तुलना करना गतिशील रूप से तत्वों को एक सूची में जोड़ें Android देखें स्विफ्ट मूल बेस क्लास या एनएसओबीजेक्ट

पीएचपी अनुप्रयोगों में मल्टी थ्रेडिंग का उपयोग कैसे किया जा सकता है

क्या PHP में एक बहु-थ्रेडेड मॉडल को लागू करने का वास्तव में कोई वास्तविक तरीका है, या वास्तव में इसका अनुकरण करना कुछ समय पहले यह सुझाव दिया गया था कि आप ऑपरेटिंग सिस्टम को PHP निष्पादन योग्य के एक अन्य उदाहरण को लोड करने और अन्य एक साथ प्रक्रियाओं को संभालने के लिए बाध्य कर सकते हैं।

इस के साथ समस्या यह है कि जब PHP कोड PHP इंस्टेंस निष्पादित करना समाप्त होता है तो स्मृति में रहता है क्योंकि PHP के भीतर से इसे मारने का कोई तरीका नहीं है इसलिए यदि आप कई धागे का अनुकरण कर रहे हैं तो आप कल्पना कर सकते हैं कि क्या हो रहा है। इसलिए मैं अभी भी PHP के भीतर मल्टी-थ्रेडिंग को प्रभावी ढंग से या सिम्युलेटेड तरीके से देख सकता हूं। कोई विचार?

वेब के समाधान से एकत्रित समाधान "पीएचपी अनुप्रयोगों में मल्टी थ्रेडिंग का उपयोग कैसे किया जा सकता है"

बहु-थ्रेडिंग PHP में संभव है

हाँ, आप PHP में बहु-थ्रेडिंग pthreads के साथ कर सकते हैं

PHP प्रलेखन से :

pthreads एक वस्तु-केंद्रित एपीआई है जो PHP में बहु-थ्रेडिंग के लिए आवश्यक सभी उपकरण प्रदान करता है। PHP एप्लिकेशन थ्रेड, वर्कर और थ्रेडेड ऑब्जेक्ट्स के साथ बना, पढ़, लिख, निष्पादित और सिंक्रनाइज़ कर सकते हैं।

चेतावनी : एक वेब सर्वर वातावरण में pthreads एक्सटेंशन का उपयोग नहीं किया जा सकता। इसलिए PHP में थ्रेडिंग केवल CLI- आधारित अनुप्रयोगों में ही रहें।

साधारण टेस्ट

#!/usr/bin/php <?php class AsyncOperation extends Thread { public function __construct($arg) { $this->arg = $arg; } public function run() { if ($this->arg) { $sleep = mt_rand(1, 10); printf('%s: %s -start -sleeps %d' . "\n", date("g:i:sa"), $this->arg, $sleep); sleep($sleep); printf('%s: %s -finish' . "\n", date("g:i:sa"), $this->arg); } } } // Create a array $stack = array(); //Initiate Multiple Thread foreach ( range("A", "D") as $i ) { $stack[] = new AsyncOperation($i); } // Start The Threads foreach ( $stack as $t ) { $t->start(); } ?> 

पहला रन

 12:00:06pm: A -start -sleeps 5 12:00:06pm: B -start -sleeps 3 12:00:06pm: C -start -sleeps 10 12:00:06pm: D -start -sleeps 2 12:00:08pm: D -finish 12:00:09pm: B -finish 12:00:11pm: A -finish 12:00:16pm: C -finish 

दूसरा रन

 12:01:36pm: A -start -sleeps 6 12:01:36pm: B -start -sleeps 1 12:01:36pm: C -start -sleeps 2 12:01:36pm: D -start -sleeps 1 12:01:37pm: B -finish 12:01:37pm: D -finish 12:01:38pm: C -finish 12:01:42pm: A -finish 

असली दुनिया का उदाहरण

 error_reporting(E_ALL); class AsyncWebRequest extends Thread { public $url; public $data; public function __construct($url) { $this->url = $url; } public function run() { if (($url = $this->url)) { /* * If a large amount of data is being requested, you might want to * fsockopen and read using usleep in between reads */ $this->data = file_get_contents($url); } else printf("Thread #%lu was not provided a URL\n", $this->getThreadId()); } } $t = microtime(true); $g = new AsyncWebRequest(sprintf("http://www.google.com/?q=%s", rand() * 10)); /* starting synchronization */ if ($g->start()) { printf("Request took %f seconds to start ", microtime(true) - $t); while ( $g->isRunning() ) { echo "."; usleep(100); } if ($g->join()) { printf(" and %f seconds to finish receiving %d bytes\n", microtime(true) - $t, strlen($g->data)); } else printf(" and %f seconds to finish, request failed\n", microtime(true) - $t); } 

आप पॉपयन का उपयोग क्यों नहीं करते?

 for ($i=0; $i<10; $i++) { // open ten processes for ($j=0; $j<10; $j++) { $pipe[$j] = popen('script2.php', 'w'); } // wait for them to finish for ($j=0; $j<10; ++$j) { pclose($pipe[$j]); } } 

थ्रेडिंग स्टॉक में उपलब्ध नहीं है PHP, लेकिन एसिंक्रोनस कॉल के रूप में HTTP अनुरोधों का उपयोग करके समवर्ती प्रोग्रामिंग संभव है।

कर्ल की टाइमआउट सेटिंग को 1 पर सेट और एक ही session_id का उपयोग करके आप एक दूसरे के साथ जुड़े रहना चाहते हैं, तो आप मेरे उदाहरण के रूप में सत्र चर के साथ संवाद कर सकते हैं। इस पद्धति के साथ आप अपने ब्राउज़र को बंद कर सकते हैं और सर्वर पर समवर्ती प्रक्रिया अभी भी मौजूद है।

इस तरह सही सत्र आईडी को सत्यापित करने के लिए मत भूलना:

http: //localhost/test/verifysession.php?essionid= [ सही आईडी]

startprocess.php

 $request = "http://localhost/test/process1.php?sessionid=".$_REQUEST["PHPSESSID"]; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $request); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, 1); curl_exec($ch); curl_close($ch); echo $_REQUEST["PHPSESSID"]; 

process1.php

 set_time_limit(0); if ($_REQUEST["sessionid"]) session_id($_REQUEST["sessionid"]); function checkclose() { global $_SESSION; if ($_SESSION["closesession"]) { unset($_SESSION["closesession"]); die(); } } while(!$close) { session_start(); $_SESSION["test"] = rand(); checkclose(); session_write_close(); sleep(5); } 

verifysession.php

 if ($_REQUEST["sessionid"]) session_id($_REQUEST["sessionid"]); session_start(); var_dump($_SESSION); 

closeprocess.php

 if ($_REQUEST["sessionid"]) session_id($_REQUEST["sessionid"]); session_start(); $_SESSION["closesession"] = true; var_dump($_SESSION); 

जब आप थ्रेड नहीं कर सकते, तो आपके पास कुछ ही स्तर की प्रक्रिया नियंत्रण php में है। दो फ़ंक्शन सेट जो यहां उपयोगी होते हैं:

प्रक्रिया नियंत्रण कार्य http://www.php.net/manual/en/ref.pcntl.php

POSIX फ़ंक्शंस http://www.php.net/manual/en/ref.posix.php

आप pcntl_fork के साथ अपनी प्रक्रिया का निर्माण कर सकते हैं – बच्चे की पीआईडी ​​वापस कर रहे हैं। उसके बाद आप उस पीआईडी ​​के समाधान के लिए posix_kill का उपयोग कर सकते हैं।

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

थ्रेड का उपयोग पीथ्रेड पीईसीएल एक्सटेंशन द्वारा संभव है

http://www.php.net/manual/en/book.pthreads.php

मुझे पता है कि यह एक पुराना सवाल है, लेकिन लोगों की खोज के लिए, सी में लिखा गया एक पीईसीएल एक्सटेंशन है जो PHP बहु-थ्रेडिंग क्षमता देता है, यह यहां स्थित है https://github.com/krakjoe/pthreads

आप थ्रेडिंग अनुकरण कर सकते हैं। PHP पॉपने (या proc_open) के माध्यम से पृष्ठभूमि प्रक्रियाओं को चला सकता है उन प्रक्रियाओं को stdin और stdout के माध्यम से संचारित किया जा सकता है बेशक, उन प्रक्रियाओं को स्वयं एक php प्रोग्राम हो सकता है यह संभवतः करीब है जितना आप मिलेगा।

आप कमांड लाइन स्क्रिप्ट (जैसे कि कमांड लाइन PHP) चलाने के लिए exec () का उपयोग कर सकते हैं, और यदि आप किसी फ़ाइल में आउटपुट पाइप करते हैं तो आपकी स्क्रिप्ट को समाप्त करने के लिए प्रतीक्षा नहीं होगी।

मुझे php CLI सिंटैक्स को काफी याद नहीं है, लेकिन आप ऐसा कुछ चाहते हैं:

 exec("/path/to/php -f '/path/to/file.php' | '/path/to/output.txt'"); 

मुझे लगता है कि कुछ साझा की गई होस्टिंग सर्वरों को सुरक्षा कारणों के लिए डिफ़ॉल्ट रूप से exec () अक्षम किया गया है, लेकिन एक कोशिश के लायक हो सकता है

आप क्या करने की कोशिश कर रहे हैं इसके आधार पर आप इसे हासिल करने के लिए curl_multi का भी उपयोग कर सकते हैं।

मुझे पता है कि यह बहुत पुराना है, लेकिन आप http://phpthreadlib.sourceforge.net/ पर देख सकते हैं

यह द्वि-दिशात्मक इंटर-थ्रेड संचार का समर्थन करता है और बाल धागे को मारने के लिए (अनाथों को रोकने) के लिए भी निर्मित संरक्षण है।

आप का विकल्प हो सकता है:

  1. multi_curl
  2. एक ही के लिए सिस्टम कमांड का उपयोग कर सकते हैं
  3. आदर्श परिदृश्य, सी भाषा में एक थ्रेडिंग फ़ंक्शन बनाएं और PHP में संकलित / कॉन्फ़िगर करें। अब यह समारोह PHP का कार्य होगा।

कैसे के बारे में pcntl_fork?

उदाहरण के लिए हमारे मैन्युअल पृष्ठ की जांच करें: PHP pcntl_fork

pcntl_fork वेब सर्वर परिवेश में काम नहीं करेगा, अगर इसमें सुरक्षित मोड चालू होता है इस स्थिति में, यह केवल PHP के सीएलआई संस्करण में काम करेगा।

थ्रेड क्लास PECL pthreads ≥ 2.0.0 के बाद से उपलब्ध है।

हो सकता है मुझे कुछ याद आ गया लेकिन फ़नल ने विंडोज़ पर्यावरण में मेरे लिए अतुल्यकालिक के रूप में काम नहीं किया I ने खिड़कियों में निम्नलिखित का उपयोग किया और यह आकर्षण की तरह काम किया;)

 $script_exec = "c:/php/php.exe c:/path/my_ascyn_script.php"; pclose(popen("start /B ". $script_exec, "r")); 

Multithreading का मतलब है कि कई कार्यों या प्रक्रियाओं को एक साथ करना, हम निम्नलिखित कोड का उपयोग करके इसे PHP में हासिल कर सकते हैं, हालांकि php में मल्टीथ्रेडिंग प्राप्त करने का कोई सीधा तरीका नहीं है, लेकिन हम निम्नलिखित तरीके से लगभग समान परिणाम प्राप्त कर सकते हैं।

 chdir(dirname(__FILE__)); //if you want to run this file as cron job for ($i = 0; $i < 2; $i += 1){ exec("php test_1.php $i > test.txt &"); //this will execute test_1.php and will leave this process executing in the background and will go //to next iteration of the loop immediately without waiting the completion of the script in the //test_1.php , $i is passed as argument . 

}

Test_1.php

 $conn=mysql_connect($host,$user,$pass); $db=mysql_select_db($db); $i = $argv[1]; //this is the argument passed from index.php file for($j = 0;$j<5000; $j ++) { mysql_query("insert into test set id='$i', comment='test', datetime=NOW() "); } 

यह दो बार एक साथ test_1.php निष्पादित करेगा और दोनों ही प्रक्रिया एक साथ पृष्ठभूमि में चलेंगे, इसलिए इस तरह आप php में multithreading प्राप्त कर सकते हैं।

इस आदमी ने वास्तव में अच्छा काम किया है PHP में multithreading