私はSOに関する他の質問を同様のタイトルで読んだことがありますが、それはこの質問の内容ではありません。別のPHPスクリプトからPHPスクリプトを実行する方法を知っています。問題は、そうすると、CPUの使用量が多すぎることです。これを減らす方法を知りたいのですが。
index.phpという単純なフロントコントローラーのようなスクリプトがあります。クライアントからのGETリクエストを処理し、渡された「action」パラメータに応じて、リクエストを適切なファイルに送信して処理します。たとえば、これはクライアント要求です。
xhttp.open("GET", serverURL + "?action=doSomething" + "&userID=" + user.ID + "&time=" + lastServerTime, true);
index.phpには、「action」パラメーターを適切なファイルにマップする配列があります。
exec('php ' . $url_map[$action] . ' "' . $parameter1 . '"' . ' "' . $parameter2 . '" 2>&1', $output, $return_value);
テストの目的で、CPU使用率を測定し、それをログファイルにダンプする以外に何もしないPHPスクリプトを作成しました。
<?php
function varDumpToFile($parameter1) {
$file = 'log.txt';
$dump = $parameter1;
$output = print_r($dump, true);
file_put_contents($file, $output, FILE_APPEND | LOCK_EX);
}
varDumpToFile(`ps -eo pcpu,pid,user,args --no-headers| sort -t. -nk1,2 -k4,4 -r |head -n 5`);
?>
これにより、次のようなログファイルが生成されます。
9.0 3123052 user /opt/cpanel/ea-php56/root/usr/bin/php cputest.php 10 147424 1537625595
明らかに、PHPスクリプトの実行にCPUの9%を費やすべきではありません。比較のために、GETリクエストを介して直接アクセスする同じスクリプトを実行しました。
0.1 3186198 user lsphp:ic_html/dev/php/cputest.php
0.1%はもっと似ています。しかし、なぜこのPHPスクリプトを別のPHPスクリプトから呼び出すと、CPUが大量に使用されるのでしょうか。オーバーヘッドの多いPHPを実行するときにPHPの「新しいインスタンス」を実行する必要があるためですか?もしそうなら、PHPの「すでに実行中の」インスタンスを使用してPHPスクリプトを実行する方法はありますか?または、これを行う別の方法はありますか?
私はいつも「疑わしいときはPHPのソースコードを見てください」と言います。ここでは、例えば。その際exec
、プロセスをフォークしたり、新しいストリームを作成したり、入力バッファから読み取ったりする必要があります。
また、PHPはコンパイル言語ですが、新しくフォークされたプロセスでは、オペコードコンパイラを実行してオペコード(Javaバイトコードと同様の命令)を生成し、それらを実行する必要があります。あなたはそれについてのすべてをここで読むことができます。最後に、フォークごとに別々に、コンパイラを2回実行します。
CPUの9%の価値がありますか?何も思いつきません。多分。そうでないかもしれない。知るか。
「より良い解決策」?PHPの最新バージョンにアップグレードします。PHP 5.6はサポートされなくなり、セキュリティアップデートは3か月で終了します。さらに優れたソリューション-を使用せずに、通常のオブジェクト指向で保守可能なコードを維持しますexec
。IMO、exec
あなたのように遊んでも大丈夫です。しかし、それがあなたの製品コードであるならば、私はあなたの後にあなたのコードを維持するであろう人々の魂のために祈ります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加