ホームページ >php教程 >php手册 >マルチプロセス アプリケーションは PHP の問題解決に役立ちます

マルチプロセス アプリケーションは PHP の問題解決に役立ちます

WBOY
WBOYオリジナル
2016-06-21 08:57:181146ブラウズ

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

PHP は多くの場合、常駐 SHELL プロセスには適していません。専用の gc ルーチンがなく、効果的なメモリ管理方法もありません。そのため、PHP を常駐 SHELL として使用すると、次のような理由で中断されることがよくあります。記憶力の枯渇と不幸。
さらに、入力データが不正で、スクリプトがそれを検出できずに中止された場合も、非常に不幸になります。

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

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

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

利点:

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

2. 複数のプロセスを使用する場合、子プロセスの異常終了によってプロセス スレッド全体が終了することはありません。

3. 常駐メイン プロセス。タスクの分散のみを担当します。ロジックはより明確です。


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

次に、PHP が提供する POSIX および Pcntl シリーズ関数を使用して、PHP コマンド パーサーを実装します。メイン プロセスはユーザー入力を受け入れ、子プロセスをフォークして実行し、終了ステータスをエコーし​​ます。子プロセスの。
コードは次のとおりです。わからない場合は、マニュアルの関連する機能を読むか、メッセージに返信してください。

#!/bin/env php
/**php
でマルチプロセス アプリケーションを示す例 * @ファイル名 fork.php
* @touch 日付 2009 年 6 月 10 日水曜日 10:25:51 PM CST
* @author 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、laruence 作成
EOD;
その間
(本当です)
{
$prompt = "n{$user}$ ";
$input = readline($prompt);

readline_add_history($input);
if
($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} で終了しました";
}
}
}



声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。