1

ステージングマシンで実行するphpスクリプトがあり、xmlファイルをデータベースに処理してから、一連のクエリでデータをクリーンアップするために使用されるいくつかのMySQLプロシージャを呼び出します。

巨大になり、実行に数時間かかるいくつかの手順があります(これがステージングで行われる理由です)。

結果がスクリプトの残りの部分に移動するのを待たずに、PHPにこれらのプロシージャを呼び出させる方法はありますか?

4

2 に答える 2

1

PHPはコアでの並行性をサポートしていません。ただし、次の方法で同様の動作をシミュレートできます。

1. fsockopen()およびignore_user_abort( '1')

その後バックグラウンドで実行される別のスクリプトへのソケット接続を作成できます。次の2つのスクリプトを参照してください。メインスクリプトはサブスクリプトへのソケット接続を作成し、すぐに閉じます。サブスクリプトは、すべてのタスクが終了するまで実行されます。これは、ini値「ignore_user_abort」が1に設定されているためです。

main.php

<?php
$start = microtime(true);
$host = 'localhost';
$target = '/sub.php';
$fp = fsockopen($host, 80);
$request  = "GET $target HTTP/1.1\r\n";
$request .= "Host: $host\r\n";
$request .= "Connection: Close\r\n\r\n";
fwrite($fp, $request);
fclose($fp);
file_put_contents("main", "Script runs " . (microtime(true) - $start) . " seconds");

sub.php

<?php
$start = microtime(true);
ignore_user_abort("1");
sleep(5);
file_put_contents("sub", "Script runs " . (microtime(true) - $start) . " seconds");

2.バックグラウンドでコマンドラインからスクリプトを開始します

unix/linuxまたはwindowsコマンドラインからバックグラウンドでスクリプトを開始できます。次の例は、unix/linuxコマンドライン用です。Windowsコマンドラインからスクリプトを開始するには、PHP.netサイトの次のコメントを参照してください。http://www.php.net/manual/en/function.exec.php#110131

main.php

<?php
$start = microtime(true);
pclose(popen("/usr/bin/php "  . __DIR__ . "/sub.php " . __DIR__ . "//sub.log 2>&1 &", 'r'));
file_put_contents("main", "Script runs " . (microtime(true) - $start) . " seconds");

sub.php

<?php
$start = microtime(true);
sleep(5);
file_put_contents("sub", "Script runs " . (microtime(true) - $start) . " seconds");

次の拡張機能は、PHPで実際の同時実行性を提供します。

pthreadsは、PHPでユーザーランドのマルチスレッド化を可能にするオブジェクト指向APIです。これには、Webまたはコンソールを対象としたマルチスレッドアプリケーションを作成するために必要なすべてのツールが含まれています。PHPアプリケーションは、スレッド、ワーカー、およびスタッカブルを作成、読み取り、書き込み、実行、および同期できます。

http://www.php.net/manual/en/book.pthreads.php

于 2013-03-18T20:09:35.900 に答える
1

Webインターフェースを使用しているため、可能性があります。次のロジックを実装してみてください

  1. 「長いmysql関数」ごとに1つのphpスクリプト
  2. AJAXを使用して各phpスクリプトを処理するため、必要に応じて同時に開始できます。サーバーは負荷を並列化します。

あなたの考えを教えてください。

于 2013-03-18T19:59:55.777 に答える