ホームページ  >  記事  >  バックエンド開発  >  PHPでマルチスレッドを使用するにはどうすればよいですか?

PHPでマルチスレッドを使用するにはどうすればよいですか?

WBOY
WBOYオリジナル
2016-12-01 00:01:161090ブラウズ

ビジネス シナリオ: API インターフェイスからデータを取得し、データベースに挿入するこのプロセスには数時間かかります。マルチスレッド テクノロジーを使用してデータを変換したいのですが、開始方法がわかりません。他の方法も有効です。

もう 1 つ: PHP の将来の方向性がわかりません。Java には、Hadoop、Spark、Storm などの強力なものがたくさんあります。PHP は今後どこへ向かうのでしょうか?

返信内容:

実際、ここで本当に必要なのは、数時間続く「非同期」タスクを実行する方法を Web 上で見つけることだけです。 PHP に関する限り、これを行うには 2 つの方法があります:
(1) PHP のshell_exec 関数を使用して、シェル内で独立した PHP スクリプトの実行を開始します。この方法は、実際には、Web サーバーの処理中にタスクを処理する別のシェル プロセスを設定するのと同じです。ここでは、shell_exec のサーバー セキュリティに特別な注意を払う必要があり、パラメータの確認に注意し、シェル コマンドに持ち込まれないように注意してください。これは比較的簡単に実装できる方法です。
(2) PHP を使用してサーバーを実装し、ポートでリッスンし、Web 側にサービスを提供します。ここには多くの実装方法があり、通常はネイティブ pthread (マルチスレッド)、オープンソース拡張機能 swoole などの拡張機能を使用します。

Web プログラムで直接マルチスレッドを使用することは不適切です。たとえば、デフォルトのタイムアウトは 30 秒です。スレッドタスクが完了する前に、その親プロセスがまだ動作していることを確認するにはどうすればよいでしょうか? むくむ オーケー、Swoole: PHP の非同期、並列、分散拡張機能、問題を解決してください phpのコマンドラインモードを使用して実行することもできますが、これはマルチスレッドではなくマルチプロセスです。
より複雑な方法には、gearman を使用できます。 複数のプロセスでこの効果を実現できます。 PHP 自体はマルチスレッドをサポートしていませんが、いくつかの拡張機能を使用するとマルチスレッドをサポートできます。 私の意見を共有させてください。
このシナリオは、必ずしもマルチスレッドで解決する必要はありません。複数のプロセスを使用すると、より安定します。
次にビジネスシナリオです。データベースに挿入します。どのようなデータベースですか?書き込みロックの問題ではないでしょうか?
PHP はプロセス、スレッド、非同期などを使用できます。専門家によって作成された多くの拡張機能は、これを行うのに役立ちます。ビジネス シナリオでのパフォーマンスについては、自分でテストする必要があります。
PHP については、他の人が言う速いと遅いの意味、および 7 での改善点について詳しく学ぶことができます。同時に、PHP は主に Web 開発スクリプトです。比較の意味を理解する必要があります。
また、専門家は通常、1 つの言語のみを話すわけではありません。あるいは、一つの言語に固執しないことを意味します。
どれも興味深いです。
悪い点を指摘していただければ幸いです。
------------------------------------------------
最新の回答を読んだ後、実際には「非同期」ソリューションでも問題ないと言いたいことを付け加えたいと思います。 2333 拡張子 php_pthreads を使用すると、WIN と LIN のデュアル プラットフォームがサポートされるという利点があります。欠点は、php をスレッド セーフ モードで実行する必要があることです。 単純な非同期の場合は、popen()、fsockopen()、cURL を検討できます。
より複雑な場合は、PCNTL/pthreads 拡張機能を検討してください。
より複雑な場合は、バックグラウンド サービスを検討してください。 まず、プログラムのボトルネック (mysql である必要があります) を特定します。並列処理でこの問題を解決できるかどうかは、特定のストレージ構造によって異なります。
解決策:
1. mysql をバッチで記述します。これは、並列で記述するよりもはるかに高速です
2. PHP マルチプロセス フレームワーク、GitHub を使用します - huyanping/simple-fork-php: pcntl に基づくシンプルなマルチ プロセス マネージャー
Java のようなスレッドは同じインターフェイス
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。