ホームページ  >  記事  >  バックエンド開発  >  PHP CLI モードのマルチプロセス アプリケーション_PHP チュートリアル

PHP CLI モードのマルチプロセス アプリケーション_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:34:23867ブラウズ

PHP は多くの場合、常駐 SHELL プロセスには適していません。専用の gc ルーチンがなく、効果的なメモリ管理方法もありません。そのため、PHP を常駐 SHELL として使用すると、メモリのせいで中断されることがよくあります。疲れ果てた。

さらに、入力データが不正で、スクリプトがそれを検出できずに中止された場合も、非常に不幸になります。

どうする?

ははは、心配しないでください、マルチプロセスが役に立ちます!

それでは、なぜでしょうか?

利点:

1. 複数のプロセスを使用し、子プロセスが終了した後、カーネルがリソースのリサイクルを担当します

2. 複数のプロセスを使用する場合、子プロセスの異常終了によってプロセス全体のスレッドが終了することはなく、親プロセスにはプロセスを再構築する機会が残ります。

3. 常駐メインプロセスはタスクの分配のみを担当し、ロジックがより明確になります

それでは、どうすればいいでしょうか?

次に、PHP が提供する POSIX および Pcntl シリーズ関数を使用して、PHP コマンド パーサーを実装します。メイン プロセスはユーザー入力を受け入れ、子プロセスをフォークして実行し、プロセスの終了ステータスをエコーし​​ます。子プロセス

コードは以下の通りです。分からないことがあれば、マニュアルの該当する機能を読むか、メッセージに返信してください。

#!/bin/env php

/**php

でマルチプロセスアプリケーションを示す例

* @filename fork.php

* @touch date Wed 10 Jun 2009 10:25:51 PM CST

* @著者Laruence

* @license http://www.zend.com/license/3_0.txt PHPライセンス3.0

* @バージョン 1.0.0

  */

/**この関数が SHELL でのみ実行できることを確認してください*/

もしも

(substr(php_sapi_name(), 0, 3) !== 'cli')

{

die("このプログラムは CLI モードでのみ実行できます");

}

/**CLI モードでは、このステートメントは実際には不要です。*/

set_time_limit(0);

$pid = posix_getpid() //メインプロセスIDを取得します

;

$user = posix_getlogin() //ユーザー名を取得します

エコー

<<

使用方法: [コマンド | 式]

新しいプロセスをフォークして実行するphpコードを入力します

終了するには「quit」と入力します

Shell Executor バージョン 1.0.0 by laruence

EOD;

ながら

(本当です)

{

$prompt = "n{$user}$ ";

$input = readline($prompt);

readline_add_history($input);

もしも

($input == '終了')

{

休憩;

}

process_execute($input . ';');

}

exit(0);

機能

process_execute($input)

{

$pid = pcntl_fork() //子プロセスを作成します

もしも

($pid == 0)

{//サブプロセス

$pid = posix_getpid();

エコー

"* プロセス {$pid} が作成され、実行されました:nn";

eval($input); //解析コマンド

退出;

}

その他

{//メインプロセス

$pid = pcntl_wait($status, WUNTRACED) //子プロセスの終了ステータスを取得します

もしも

(pcntl_wifexited($status))

{

エコー

"nn* サブプロセス: {$return['pid']} が {$status} で終了しました";

}

}

}

http://www.bkjia.com/PHPjc/752065.html

www.bkjia.com

tru​​e

技術記事 PHP は、多くの場合、専用の gc ルーチンを持たず、有効なメモリ管理方法を持たないため、常駐 SHELL プロセスとして使用すると、メモリ不足が発生することがよくあります。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。