Linux 上の PHP IPC
ここ数日、仕事の都合により、PHP で書かれたバックグラウンド プログラムをシリアル実行からパラレル実行に変更する必要がありました。これには、必然的にマルチスレッド/マルチプロセス関連のテクノロジが関与することになります。 PHP は成熟したマルチスレッド メカニズムを備えていないようですが、比較的成熟したマルチプロセス メカニズムを備えています。マルチプロセスプログラミングには必然的に IPC (プロセス間通信) が関係します。 PHP には、sysvshm、sysvsem、sysvmsg、shmop およびその他の拡張機能があり、これらは IPC に使用できます。 pcntl - プロセスの提供 関連操作関数 sysvsem - セマフォ、フルネーム システム V セムフォア、共有リソースにアクセスするプロセスの数を制限するために使用できます。通常は 1 に設定され、ミューテックス ロックとして使用されます。 sysvshm - 共有メモリ、フルネーム システム V 共有共有メモリの仕組みは、顧客コードのシリアル化と逆シリアル化の手間が省けるのが特徴で、変数レベルのアクセス制御は非常に使いやすく、初心者でも利用できる手法です。 shmop - 共有メモリ操作の拡張機能。sysvshm との違いは、ビットレベルの制御であり、手動のシリアル化と逆シリアル化が必要であることです。ただし、メモリが不足している場合、メモリの使用量が sysvshm よりも高くなります。 sysvmsg - メッセージ キュー、特殊な種類の共有メモリ。具体的な使用方法については、ここを参照してください。
以下はメモとして sysvsem を使用する例です。具体的な内容についてはコードを参照してください。ここでいくつかの重要な点に注意してください。
shm_attach メソッドと sem_get メソッドのキーは main に関連付けられている必要があります。共有メモリとセマフォはプロセス間で共有されるシステムレベルのリソースであるため、2 つのコンポーネントを同時に実行するのは面倒です。処理されないと、複数のインスタンス間で混乱が発生します。 親プロセスが子プロセスを待機している場合、ビジー待機により多くの CPU が消費されます。スリープを使用すると、ビジー待機を回避できます。 無制限の待機を避けるために、子プロセスを待機するときに親プロセスにタイムアウト メカニズムを持たせることが最善です。子プロセスのロジックは指定された場所で終了する必要があり、親プロセスのコードは実行できません。そうしないと、混乱が生じます。 。一般的な方法は、try catch を使用してサブプロセスのロジックをラップし、例外をキャッチした後に終了することです。
<?phpdefine('PROC_NUM', 12);define('SRC_NUM', 20);define('TIME_OUT', 60); // 父进程等待超时,单位:秒$arr = array();for ($i = 0; $i < SRC_NUM; ++$i) { $arr[] = $i;}$sArr = serialize($arr); echo "parent id: " . posix_getpid() . "\n"; // create share memory$nShmID = shm_attach(ftok(__FILE__, 'i') . + posix_getpid(), strlen($sArr) * 2); // 采用主进程id作为key的部分,避免主进程之间干扰if ($nShmID == FALSE) { die("Failed to create shm\n");} // write the array to the shared memory$nArrKey = 1;if (FALSE == shm_put_var($nShmID, $nArrKey, $arr)) { die('Failed to write array to shm');} // create semphore$nSemID = sem_get(posix_getpid(), 1); // 采用主进程id作为key,避免主进程之间干扰 // child process consume the data in the shmfor($i = 0; $i < PROC_NUM; ++$i) { $nPID = pcntl_fork(); if ($nPID == 0) { // child $arrProcess = array(); while (true) { sem_acquire($nSemID); // get the value $arrCur = shm_get_var($nShmID, $nArrKey); if (0 == count($arrCur) || $arrCur == FALSE) { // value out sem_release($nSemID); break; } $nVal = array_pop($arrCur); if (FALSE == shm_put_var($nShmID, $nArrKey, $arrCur)) { die('Failed to write array to shm'); } sem_release($nSemID); // simulate process value sleep(rand(1,3)); $arrProcess[] = $nVal; } echo "Child process " . posix_getpid() . " consume: "; echo implode(' ',$arrProcess) . "\n"; exit(0); // 子进程逻辑一定要在这里退出,不能执行父进程代码 }} // wait for childrenecho "wait children\n";$n = 0;$nStart = time();while ($n < PROC_NUM && (time() - $nStart < TIME_OUT)) { // 父进程等待有超时机制,避免无限等待 //echo "wait ... \n"; $nStatus = -1; $nPID = pcntl_wait($nStatus, WNOHANG); if ($nPID > 0) { echo "{$nPID} exit\n"; ++$n; } sleep(1); // 避免忙等} // clear shm//shm_detach($nShmID);sem_remove($nSemID);shm_remove($nShmID);echo "finished\n";?>
関連情報
PHP IPC: http://blog.csdn.net/eroswang/article/details/2195260
PHP IPC system v と shmop: http://liangfen1224.blog. 163.com/blog/static/72377647201111163317325/

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











多くの場合、キーワードと追跡パラメーターで散らかった長いURLは、訪問者を阻止できます。 URL短縮スクリプトはソリューションを提供し、ソーシャルメディアやその他のプラットフォームに最適な簡潔なリンクを作成します。 これらのスクリプトは、個々のWebサイトにとって価値があります

2012年のFacebookによる有名な買収に続いて、Instagramはサードパーティの使用のために2セットのAPIを採用しました。これらはInstagramグラフAPIとInstagram Basic Display APIです。

Laravelは、直感的なフラッシュメソッドを使用して、一時的なセッションデータの処理を簡素化します。これは、アプリケーション内に簡単なメッセージ、アラート、または通知を表示するのに最適です。 データは、デフォルトで次の要求のためにのみ持続します。 $リクエスト -

これは、LaravelバックエンドとのReactアプリケーションの構築に関するシリーズの2番目と最終部分です。シリーズの最初の部分では、基本的な製品上場アプリケーションのためにLaravelを使用してRESTFUL APIを作成しました。このチュートリアルでは、開発者になります

Laravelは簡潔なHTTP応答シミュレーション構文を提供し、HTTP相互作用テストを簡素化します。このアプローチは、テストシミュレーションをより直感的にしながら、コード冗長性を大幅に削減します。 基本的な実装は、さまざまな応答タイプのショートカットを提供します。 Illuminate \ support \ facades \ httpを使用します。 http :: fake([[ 'google.com' => 'hello world'、 'github.com' => ['foo' => 'bar']、 'forge.laravel.com' =>

PHPクライアントURL(CURL)拡張機能は、開発者にとって強力なツールであり、リモートサーバーやREST APIとのシームレスな対話を可能にします。尊敬されるマルチプロトコルファイル転送ライブラリであるLibcurlを活用することにより、PHP Curlは効率的なexecuを促進します

顧客の最も差し迫った問題にリアルタイムでインスタントソリューションを提供したいですか? ライブチャットを使用すると、顧客とのリアルタイムな会話を行い、すぐに問題を解決できます。それはあなたがあなたのカスタムにより速いサービスを提供することを可能にします

2025 PHP Landscape Surveyは、現在のPHP開発動向を調査しています。 開発者や企業に洞察を提供することを目的とした、フレームワークの使用、展開方法、および課題を調査します。 この調査では、現代のPHP Versioの成長が予想されています
