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.comtrue