1

私はphpコードを「フォーク」して、スクリプトを開始してバックグラウンドで実行し、ブラウザーアプリケーションが応答を待たずに続行できるようにします。

このようなスクリプトにパラメータを渡せるようにしたいと考えています。

問題のスクリプトにアクセスできるようにしたい配列があるとします。どうすればそれを渡すことができますか?

$test = array(1,2,3);

//for windows i do the following which works well enough 
pclose(popen("start php /path/to/script.php ","r"));

または、一部の Linux ディストリビューションの場合:

exec('php -f /path/to/script.php >/dev/null 2>&1 &');

まず、私の配列をそのスクリプトに渡すことは可能ですか? スクリプトにアクセスできるようにすることが可能であれば、そのスクリプトで渡された変数にどのようにアクセスできますか?

(ここに座って、変数を値/参照で渡すことを考えて混乱しています....)

ありがとう!

4

3 に答える 3

2

ニコラス・ブラウンはほぼ正しい。しかし、それはあなたが探しているソリューションの 2 番目の部分になると思います。
すでにご存知かもしれませんが、コンソールからプログラムを呼び出し、プログラムが期待する引数を渡すことができます。

>php -f /path/to/program arg1[ arg2 ... argN] >/dev/null 2>&1 &

文字列を渡しているexec()ので、配列を引数として「挿入」してから実行しないのはなぜ ですか

$test = array(1,2,3);
$args = implode($test, " ");
$prog = 'php -f /path/to/script.php ' . $args . ' >/dev/null 2>&1 &'
exec($prog);

これは、Nicolas Brown が言及したチュートリアルからのものです。あなたscript.phpはからパラメータを取得することができます$argv[]

$myParam1 = $argv[1];
$myParam2 = $argv[2];

argv[0] はプログラムの名前であることに注意してください。これがまさに、チュートリアルでarry_shift($argv)最初の要素 (プログラムの名前とパス) を取り除くために最初に行う理由です。
それが役に立てば幸い!

于 2012-08-23T15:01:57.387 に答える
1

$argv変数を使用します

このチュートリアルから例を見つけることができます

于 2012-08-23T14:44:12.273 に答える
1

@Havelock に +1 して完全な回答を得る - いくつかの追加の実装提案を投稿したかっただけです。

実は最近、まさにこれを実装する必要がありました :) 私が行った実装パスはserialize()、配列へのパスであり、それをコマンドライン引数として PHP スクリプトに渡しました。これにより、引数の解析で多くのメンテナンス作業を行うことなく、任意のパラメーターをスクリプトに渡すことができます。

ただし、json としてシリアライズすることは、PHP シリアライズよりも少し友好的かもしれないと思います。ただし、その方法を使用する場合、およびアプリケーションにとって Windows と Linux の互換性が重要な場合 (ローカル開発環境かどうかにかかわらず) は、シリアル化されたペイロードを両方の環境で必ずテストしてください。

Windows は、ペイロード内の引用符を好まないようです。

ああ、デバッグを容易にするために、PHP スクリプト内で適切なロギングを行うようにしてください。この種のソリューションは、楽しいデバッグ セッションに役立ちます。

于 2012-08-24T04:48:28.823 に答える