Adakah mungkin untuk melaksanakan model multi-threading dalam PHP, sama ada untuk benar-benar melaksanakan atau hanya mensimulasikannya. Sebelum ini, dicadangkan untuk memaksa sistem pengendalian memuatkan satu lagi contoh PHP boleh laku dan mengendalikan proses serentak yang lain.
Masalah dengan ini ialah apabila kod PHP menyelesaikan pelaksanaan, tika PHP masih berada dalam ingatan kerana ia tidak boleh ditamatkan daripada PHP. Jadi anda boleh bayangkan apa yang akan berlaku jika anda mensimulasikan berbilang benang. Jadi saya masih mencari cara untuk melaksanakan atau mensimulasikan multi-threading dengan cekap dalam PHP. Ada idea?
Ya, anda boleh menggunakan pthread untuk berbilang benang dalam PHP.
Menurut dokumentasi PHP:
pthreads ialah API berorientasikan objek yang menyediakan semua alatan yang diperlukan untuk multithreading dalam PHP. Aplikasi PHP boleh mencipta, membaca, menulis, melaksanakan dan menyegerakkan benang, benang pekerja dan objek berulir.
Amaran:
Pelanjutan pthreads tidak boleh digunakan dalam persekitaran pelayan web. Oleh itu, multithreading dalam PHP harus dihadkan kepada aplikasi berasaskan 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); } } } // 创建一个数组 $stack = array(); // 启动多线程 foreach ( range("A", "D") as $i ) { $stack[] = new AsyncOperation($i); } // 启动所有线程 foreach ( $stack as $t ) { $t->start(); } ?>
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)) { /* * 如果请求大量数据,你可能想要使用 fsockopen 和 read,并在读取之间使用 usleep */ $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)); /* 开始同步 */ 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); }
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Melaksanakan Multithreading dalam PHP?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!