1

バックグラウンドプロセスを使用する場合、セッション変数は機能しますか?

私は2つのphpスクリプトを持っています-index.php:

session_start();
$_SESSION['test'] = 'test';

$WshShell = new COM("WScript.Shell");
$oExec = $WshShell->Run("C:/xampp/php/php-cgi.exe -f C:/xampp/htdocs/sand_box/background.php".session_id(), 0, false);
/*
continue the program
*/

およびbackground.php:

session_id($argv[1]);
session_start();

sleep(5);

$test = $argvs[1];

$myFile = "myFile.txt";
$fh = fopen($myFile, 'w') or die("can't open file");
fwrite($fh, $test);
fclose($fh);

バックグラウンドプロセスでmyFile.txtが作成されますが、セッション変数は機能しません。私は他のいくつかのテストを行いましたが、どのような場合でも機能しません。誰もが理由を知っていますか?

バックグラウンドプロセスの使用の制限ですか?

コードを編集しましたが、問題は、引数として変数を渡すことができないことです。$argvは常に空です。

私はついにそれを解決しました、register_argc_argvはphp.iniで有効にされなければなりません!

4

3 に答える 3

1

phpは通常、CookieまたはhttpリクエストフィールドからセッションIDを取得します。コマンドラインから直接実行する場合、どちらも使用できません。したがって、コマンドライン引数または環境変数を介してsession_id()を渡すことを検討してから、生成されたスクリプトで次のように指定します。

session_start($the_session_id);

次に、この他のphpインスタンスが同じ構成を使用していることを確認する必要があります。に別の設定を使用できますsession_save_path。phpinfo()で確認し、必要に応じて調整してください。

そして最後に、phpはセッションファイルで排他的ロックモデルを使用します。したがって、特定のセッションIDのセッションファイルを一度に開くことができるプロセスは1つだけです。phpは通常、スクリプトの実行が終了するとセッションファイルのロックを解除しますが、session_write_close()を使用してこれをより早く実行できます。他のスクリプトを生成する前にsession_write_close()を呼び出さないと、他のスクリプトsession_start($the_session_id);が呼び出されたときにデッドロック状態でハングします。

しかし...2番目のスクリプトでセッションを変更する必要がない場合は、気にしないでください。必要な値を渡して、セッションを忘れてください。

于 2012-04-26T04:05:09.480 に答える
1

session_idバックグラウンドスクリプトに渡すことができます:

$oExec = $WshShell->Run("C:/xampp/php/php-cgi.exe -f C:/xampp/htdocs/sand_box/background.php " . session_id(), 0, false);

バックグラウンドスクリプトでは、最初の行として次のように記述します。

session_id($argv[1]);
session_start();

編集:@chrisが述べたように、ロックのため、バックグラウンドスクリプトがindex.php実行の停止を待機していることに注意する必要があります。

于 2012-04-26T04:05:23.520 に答える
0

COMによって呼び出されるPHPプロセスは、ユーザーがすでに確立しているセッションを認識していません。background.php代わりに、セッション値を引数としてスクリプトに渡してみてください。

$oExec = $WshShell->Run(sprintf("C:/xampp/php/php-cgi.exe -f C:/xampp/htdocs/sand_box/background.php %s", $_SESSION['test']) , 0, false);

次に、次の方法background.phpで値にアクセスできるようになります$argv

// You should see the session value as the 2nd value in the array
var_dump($argv);

$myFile = 'myFile.txt';
....

上記は、これまで実行したことがないため、単なる理論ですがCOM、機能するはずです。

argvの詳細はこちら

- アップデート -

session_start();

$WshShell = new COM("WScript.Shell");

// Notice the space between background.php and session_id()
$oExec = $WshShell->Run("C:/xampp/php/php-cgi.exe -f C:/xampp/htdocs/sand_box/background.php " . session_id(), 0, false);
于 2012-04-26T04:03:24.393 に答える