ホームページ >バックエンド開発 >PHPチュートリアル >PHP でマルチスレッドを実装するにはどうすればよいですか?
PHP でマルチスレッド モデルを実装することは可能ですか、実際に実装するかどうかそれを実行するか、単にシミュレートします。以前は、オペレーティング システムに PHP 実行可能ファイルの別のインスタンスを強制的にロードして、他の同時プロセスを処理させることが提案されていました。
これの問題は、PHP コードの実行が完了しても、PHP から終了できないため、PHP インスタンスがメモリ内に残ったままになることです。したがって、複数のスレッドをシミュレートすると何が起こるか想像できます。そのため、私は PHP でマルチスレッドを効率的に実行またはシミュレートする方法をまだ探しています。何かアイデアはありますか?
はい、PHP ではマルチスレッドに pthread を使用できます。
PHP ドキュメントによると、
pthreads は、PHP でのマルチスレッド化に必要なすべてのツールを提供するオブジェクト指向 API です。 PHP アプリケーションは、スレッド、ワーカー スレッド、およびスレッド化されたオブジェクトの作成、読み取り、書き込み、実行、および同期を行うことができます。
警告:
pthreads 拡張機能は Web サーバー環境では使用できません。したがって、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); } } } // 创建一个数组 $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); }
以上がPHP でマルチスレッドを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。