1

会話に追加されたばかりのCLIの質問については、CLIで以下をさらに読んでください。THX!


私は、48.1MBの約160,000エントリのxmlファイルと31.1MBの150,000エントリのテキストファイルを処理するスクリプトを作成しました。これには、外部ファイルのディレクトリ検索、大量の相互リンクと再帰チェック、およびフォーマットされた結果が含まれます。すべてhtmlファイルに保存されます。

確かに、私はプログラムを数回レビューし、私が考えることができる最も効率的なコードに行き着きました。これはローカルプログラムであり、ジェネレーターを定期的に実行する必要はありません。PHP以外の言語を使用する必要があると主張する人もいるかもしれませんが、simplexmlなどを使用したPHPは、私にとって、そしてこの目的のために最適に機能します。また、set_time_limit( '70000')は気になりません。

ここで私の質問ですが、Linuxシステムでapache2を作成することは可能ですか?PHPスクリプトを実行している4つのCPUコアを使用しますか?プロセスを分割して同時に複数のリクエストを行っても、CPU使用率は一度に1CPUを超えることはできません。

私はこのトピックをグーグルで検索しましたが、解決策を見つけることができなかったので、それを一晩実行する必要があるかもしれませんが、それを後押しするためにいくつかの助けをいただければ幸いです!!!

追加情報-そしてここに私のプロセスの写真:ここに画像の説明を入力してください

CLI:実行するには、Linuxターミナルでindex.phpを呼び出す必要があります。ただし、4つの投稿変数($ _POST ['example'])もスクリプトに送信します。その上、出力ファイルにエコーを表示することを探しています。誰かがターミナルコマンドとphpコマンドでこれらの4つの投稿変数を追跡するのを手伝ってくれるでしょうか?

if (PHP_SAPI === 'cli')
{
   // ...
} 

?...申し訳ありませんが、これは私の最初のphp-cliインタラクションです。どうも!

4

4 に答える 4

1

いいえ、単一のPHPスクリプトが複数のスレッドを使用することはないため、常に単一のコアで実行されます。

あなたがすることの程度によっては、お互いに依存しているので、とにかくそれらを複数のスレッドに簡単に分割することはできませんでした。

于 2012-05-24T07:11:55.973 に答える
1

編集:著者の応答

これは解決策ではありませんが、優れた回避策です。linux / apache2インストールを使用して仮想マシンのクローンを作成し、同じプロセスを開始しますが、ファイル/プロセスの異なる部分を異なるvmに配置します。これにより、ホストシステムは仮想システムごとに1つのコアを適用できるため、プロセスを分解できます。ファクター4前後の時間。投稿ありがとうございます。

===============

ローカルであり、時々実行したい場合は、おそらくcronジョブから呼び出す必要があります。そうすれば、実行しているタスクごとにプロセスを生成できます。本当にPHPを使用したい場合は、PHPを呼び出してcron行から使用することもできます。

それでも、とにかく本質的にシングルスレッドのプロセスを実行しているように思われます。より高速にしたい場合は、おそらくPHP以外のものを使用する必要があります。

于 2012-05-24T07:16:53.643 に答える
1

たぶんあなたはSporkを使うことができます!これはphplibであり、phpプロセスを複数のプロセスにフォークすることができます。

<?php

use Spork\Deferred\DeferredFactory;
use Spork\ProcessManager;

$manager = new ProcessManager(new DeferredFactory());
$manager->fork(function() {
    // do something in another process!
})->then(function($output, $status) {
    // do something in the parent process when it's done!
});

https://github.com/kriswallsmith/spork

于 2012-05-24T08:21:21.013 に答える
0

ソリューション、THX TO ThiefMasterとZebediah49は、リンクで私をサポートしてくれたcliと私の友人を推奨しています:http://ch.php.net/manual/en/reserved.variables.argv.php / http://ch.php.net /manual/en/function.getopt.php

そして、ここで私がcliを介してphpを呼び出す方法:

//whenRunFromCLI
//callCLI
//php index.php './data/xyfullFile1.xml' './data/xxfullFile2.utf' 0 60000
//php index.php './data/xyfullFile1.xml' './data/xxfullFile2.utf' 60000 120000
//php index.php './data/xyfullFile1.xml' './data/xxfullFile2.utf' 120000 all
if (PHP_SAPI === 'cli'){
    $_POST['xml'] = $argv[1];
    $_POST['example'] = $argv[2];
    @$_POST['rangeFrom'] = $argv[3];
    @$_POST['rangeTo'] = $argv[4];
}

および3つの端末でphpファイルを呼び出した結果: ここに画像の説明を入力してください

私は知っています、私は仮想マシンにもう少しRAMを与える必要があります、幸運なことに私はまだ8GBのスペアを持っています;-)

乾杯と平和!

于 2012-05-25T01:25:15.767 に答える