2

MySQL DB からクエリされたデータから PHPExcel を使用してレポートを生成する PHP スクリプトがあります。現在、MySQL からデータを取得し、Excel テンプレートを読み取り、データをテンプレートに書き込み、出力するという点で、処理は直線的です。データが 1 回だけ繰り返されるようにコードを最適化し、PHP 側で行われる処理はほとんどありません。クエリは 0.001 秒未満で数百行を返すため、実行速度は十分です。しばらくして、ボトルネックが (驚き、驚き) テンプレートの読み取りと出力の書き込みであることがわかりました。私はこれをしたいと思います:

Spawn a thread/process to read the template
Spawn a thread/process to fetch the data
Return back to parent thread - Parent thread will wait until both are complete
Proceed on as normal

私の主な質問は、これは可能ですか、それは価値がありますか? 両方に「はい」の場合、どのように対処しますか? また、CentOS では PHP 5 です。

4

6 に答える 6

8

通常、Apache プロセスを fork することはお勧めできません。これにより、不確定な結果が生じる可能性があります。代わりに、ある種のキューイングメカニズムを使用することをお勧めします。Gearman は、使用できるオープン ソースのキューイング メカニズムです。Zend Server Job Queue に関するブログ投稿もあり、非同期でタスクを実行することについて説明しています。Zend Server ジョブ キューの紹介

Zend Framework のキューイング クラスのようなものを使用して、非同期作業の一部を実装することもできます。 Zend_Queue

@Swisstack、また、PHPは高性能のために作成されていないというあなたの主張には同意しません。言語機能がパフォーマンス低下の原因となることはほとんどありません。おそらく、異なる言語間で $a++ を比較する生の言語テストを行うことで、それがわかるでしょうが、そのタイプのテストは無関係です。私は数年間 PHP に関するコンサルティングを行ってきましたが、この言語が原因でパフォーマンスの問題が発生したことは一度もありません。

于 2010-04-20T21:49:39.323 に答える
1

マルチスレッドはできませんが、フォークすることはできます(pcntl_forkpcntl_wait)。確かに知っているように、プロセスのスポーン時間を注意深くテストして、これが自分の状況に見合うだけの価値があることを確認する必要があります。

$pid = pcntl_fork();

if ($pid == -1) {
  // fork failed

} elseif ($pid > 0) {
  // we're the parent! Wait for child to finish
  pcntl_waitpid($pid);

} else {
  // we're the child
}
于 2010-04-20T21:33:40.153 に答える
1

テンプレートをより高速に読み取れる形式でキャッシュまたは保存できるかどうかを調べてみます。それが可能かどうかはわかりませんが、PHPExcel フォーラムは非常に優れており、開発者に注目されています。

于 2010-04-20T21:30:32.657 に答える
1

テンプレートの読み取りと db クエリの両方が遅い場合は、タスクを並行して実行することで価値のあるパフォーマンスが得られる可能性が十分にあると言えます。しかし、あなたは自分で言ったように、テンプレートの読み取りは遅く、db クエリは高速です。したがって、タスクを並行して実行するために必要な追加によって生じる追加のオーバーヘッドを無視しても、最良の場合、0.001 秒 (db クエリに必要な時間) を節約できます。

複数のタスクを並行して実行すると、常に最も遅いタスクの時間が必要になります。一連のタスクの実行は、すべてのタスクの合計です。あなたの場合、 templateTime + queryTime(0.001)

それだけの価値はありません。

通常、データベースは方程式のタートルです。あまり労力をかけずに、その部分を非同期に実行できます。新しく追加された mysqli_poll() およびフレンド関数を参照してください。

于 2010-04-20T22:05:45.807 に答える
0

テンプレートを一度読んでから、データから作成する必要のあるワークブックごとにクローンを作成します

于 2010-04-26T18:59:09.097 に答える
0

PHPを使用してCentOSでプロセスを確実に生成できます(http://php.net/manual/en/function.pcntl-fork.php)。ただし、その前に、少なくとも1つのことを検討します...テンプレートの読み取りと出力の書き込みにボトルネックがあると思われる場合は、I / Oバウンドの問題である可能性があるため、複数のプロセスを処理してもあまり役に立たない可能性があります。 ...個人的には、代わりにキャッシュを実行できるかどうかを確認しようと思います...

于 2010-04-20T21:33:13.737 に答える