• ベストアンサー

System関数で変数を受け渡す方法

Apache+PHP+MySQL1でサイトを作っています。 時間がかかる処理をバックグラウンドで処理したいのですが、メイン処理の変数をバックグラウンド処理に受け渡したいのですがうまくいきません。 http://www.stackasterisk.jp/tech/php/php02_02.jsp インターネットで調べたところ上記URLが見つかったので参考にサンプルを作ってみました。 --------sample.php(メイン処理)------- <?php $arg = 123456; System("/usr/local/bin/php bgprog.php $arg &"); ?> --------bgprog.php(バックグラウンド処理)------- <?php sleep(10); echo "読み込み完了<br>"; echo $arg; ?> このサンプルだと10秒スリープした後に「読み込み完了」と表示されるのですが$argが表示されません。 上記URLに「メインの処理から引数を渡したい場合には、bgprog 側できちんと受け取るようにしておかなければなりません」と書かれているのですがその方法がまったくわかりません。 このプログラム自体に無理があるのか、bgprog側でなんらかの処理をすれば解決するのかもわかっていません。 よろしくお願いします。

  • PHP
  • 回答数2
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

コマンドラインで実行する場合、 $argv[1] で一つめの引数を取り込むことができます。 なので echo $arg; を echo $argv[1]; にすればいいと思います。

shioshioshio
質問者

お礼

具体的な回答ありがとうございます。 回答のように記述したところ期待通りに動いてくれました。 これ一発で完全解決です。 ただただ感謝です。

その他の回答 (1)

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

> 上記URLに「メインの処理から引数を渡したい場合には、 > bgprog 側できちんと受け取るようにしておかなければなりません」 > と書かれているのですがその方法がまったくわかりません。 phpでなら、起動時引数は、$_SERVER['argv']で参照できます。 例示されているbgprog.phpは、単に$argを出力しようとしてますが、これは呼び出し元の変数とは、別の変数として扱われますので、$argが表示されないのは、正しい動きです。

参考URL:
http://jp2.php.net/manual/ja/features.commandline.php
shioshioshio
質問者

お礼

PHPの動きまで解説していただき感謝です。 まだまだ勉強不足でこのあたりのPHPの動きに関しては疎いですが、大変ためになりました。これを機会に知識を増やせるようがんばりたいと思います。 ありがとうございました。

関連するQ&A

  • system関数の使い方

    PHPでバックグラウンド処理をしたいのですが、うまくいきません。 プログラムは、 system.php <?php $str = "sleep.php"; system($str, $var); echo "$var"; ?> sleep.php <?php sleep(10); ?> ブラウザからsleep.phpにアクセスすると、10秒間フリーズするのですが、 system.phpにアクセスすると、すぐに返値0が表示されてしまいます。 変数の$strに、とんでもないファイル名を入れて実行しても返値が0になります。 何がおかしいのでしょうか。 アドバイス、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 途中経過を表示させる方法は?

    JavaScript(jQuery) から $.ajax() で php の実行結果を受け取る作業をしています。 var msgObj = $("#result"); msgObj.text('処理中 ...'); setTimeout(function(){ $.ajax({ url: "hoge.php",type:"POST", async:true, cache:false, success: function(e){ msgObj.text(e); } }); }, 10); [hoge.php]  (処理1)  echo "処理1完了";  (処理2)  echo "処理2完了";   : hoge.php の処理が時間かかることを想定して、途中経過を表示させたいのですが、どのようにすればよいのでしょうか。 よろしくお願いします。

  • 受け渡した変数が、プログラム実行後に消えてしまう?!

    いつもありがとうございますm(_ _)m。入力画面test1.phpをlocation.replaceを使って[リロードしない為]切り替えて、別の画面test2.phpと連携させています。JSのwindow.openは顧客環境では使えません(大泣) test1.php→test2.php→test1.phpという流れで二つの変数を受け渡ししたいのですが。。。 (1)test1.phpにある変数 $row1[code] $row1[name] inputボタンをクリックすることで、URLを使って次のファイルに渡す <input type="button" value="go2" onClick='location.replace ("http://********/test2.php?row1[code]=<? echo $row1[code];?>&row1[name]=<? echo $row1[name];?>")' name="button"> (2)test2.php フォームのテキストフィールドが用意されている <input name="code" type="text" value="<? echo $row1[code]; ?>"> <input name="name" type="text" value="<? echo $row1[name]; ?>"> test1.phpから、test2.phpの画面に切り替わった瞬間には、2つのの値がキチンと表示されている。 ここでnameに入った値を元に、サブミットボタンで処理。 <input type="submit" name="read" value="読み込み"> この時name部分に関しては、DB読込・結果をname&その他の項目と共にフォーム上にちゃんと再表示できるが、codeの値が消えてしまう。。 PHPの処理部$read部に以下のように2通り、書き加え試しましたが、だめでした。 $row1[code] = $row1[code]; $row1[code] = $_GET['$row1[code]']; なぜ消えてしまうのか? 変数をキープするにはどうしたらいいでしょうか? あるいは、他に良いアイディアなどありましたら、教えて下さい。よろしくお願いいたします。。。

    • ベストアンサー
    • PHP
  • Javascriptの関数をPHPで作りましたが戻値を得る方法がわかりません。

    はじめまして。xpにxamppの環境で利用してます。 PHPをjavascriptの関数に出来ると知り、 geturl.php <?php header("Content-type: application/x-javascript"); echo "function picturl() {"; ~ MySQLを特定の条件で検索し、画像の保存先URLを$urlへ格納 ~ echo "}"; ?> showpict.html <html> <head> <meta http-equiv="content-type" content="text/html;charset=shift_jis"> <title>photo</title> <script type="text/javascript" src="geturl.php"></script> <script type="text/javascript"> ~以下でたとえば、  var url = picturl(); とすれば url に 値が入るかと思って作成して見ました。 PHPの$urlには、 ./data/001.png のような値が入ります。 私が参考にしたPHP文では戻値は変数ではなく生のテキストで echo "document.write(\"文章\")"; となっており、これは実行できました。 変数を使用して上記のような値を求めようとしたところ、 echo "document.write(\"$url\")"; echo "retuen $url"; などを試してみましたがうまくいきません。 この様な方法では利用できないものなのでしょうか?。 それともecho文が以外の方法で行うものなのでしょうか?。 よろしくご協力のほどお願いいたします。

    • ベストアンサー
    • PHP
  • header関数で画面が切り替わらない

    a.phpにボタンがあり、押されるとb.phpに飛んである処理を行い、c.phpで完了メッセージを出す、というようなものを作成しています。 b.phpで処理後、header("Location: end.php");というのを使っているのですが、 ページが切り替わらずに(URLがb.phpのまま)、ページを表示できませんと出てしまいます。 一体何が原因なのでしょうか? これが出来ないと先に進まないので困っています・・・

    • ベストアンサー
    • PHP
  • php ob_flushが全く動作しない

    echo "<p>処理を開始します。しばらくお待ちください…</p>\n"; echo str_pad(" ",4096)."\n"; ob_end_flush(); ob_start("mb_output_handler"); for ( $i = 1; $i <= 3; $i++ ) { sleep( 2 ); // 時間がかかる処理 echo "<p>". $i * 10 ."件の処理を完了しました</p>\n"; ob_flush(); flush(); } echo "処理が完了しました\n"; サンプルのプログラムを記述しておきます。 重要な点として、 1.以前は正常に動作していました。 2.サンプル実行で実際の動きを見せるようなっている他サイトも動作しません。   それらは、おそらく、正常に動作しているのでしょうが・・・・。 このプログラムを実行しているサーバーの問題ではない気がします。 なぜなら、他のサンプルサイトの実行結果も、正常に動作しないからです。 firefox , IE8 どちらも、全ての処理が終わってから、まとめて表示されます。 あらゆる対処方を施しましたが、結果は変わりません。 これは、私のパソコンがおかしいのでしょうか? パソコン側で設定する事など出来るのでしょうか? 原因や対処方が分かる方がいらっしゃいましたらご教示お願い致します。

    • ベストアンサー
    • PHP
  • BCC5.5のMakeFileについて教えてください。

    小生、只今、WinXPSP3上でC言語を使い、BCC5.5.1でコンパイルしながらプログラミングを勉強しています。 今回質問させて頂きたいのがBCCのMakeFileについてです。 http://blog.tomnekosoft.com/tomnekosoft.php?itemid=645 上記のサイトから、BCCのMakeFileというものを始めて知り、 その内容を理解したいと思いました。 以下にそのMakeFileを記述させて頂きます。 # # make -f fb_sample.mak # # ここの箇所は理解できました。 CFLAGS = -c -w- -a4 -DWIN32 -tWC -IC:\bin\bcc55\include LFLAGS = /m /s /Tpe -LC:\bin\bcc55\Lib LIBS = fbclient_bor.lib CC = bcc32 LINK = ilink32 # この.SUFFIXESというのがわかりません。 .SUFFIXES: .c .obj .c.obj: $(CC) $(CFLAGS) $< # この下も一切わかりません。 fb_sample.exe: fb_sample.obj @echo c0x32.obj+ > link.arg @echo $? >> link.arg @echo $@ >> link.arg @echo $(LFLAGS) >> link.arg @echo $(LIBS)+ >> link.arg @echo import32.lib+ >> link.arg @echo cw32.lib >> link.arg $(LINK) @link.arg 以上です。 分からない場所は、.SUFFIXESとfd_sample.exeから始まる箇所です。 お忙しい中、申し訳ございませんが、先輩方ご教授宜しくお願い致します。

  • MFCの関数について

    http://tech.obihiro.ac.jp/~fm/file1/file01.htm 上記のURLのプログラムの折れ線グラフを描く処理の部分を関数化したいのですが うまくいきませんでした。 どうのように書けばよいかわかりやすく教えてください

  • phpのincludeについて

    お世話になります。 Apache/2.2.3 PHP5.1.6 のレンタルサーバを利用しています。 httpdocs   |___lib   |  |___test.php   |___index.php という構造にしています。 -----test.php-------- <?php $a = 'sample'; ?> --------------------- -----index.php------- <?php include_once 'lib/test.php'; echo $a; ?> --------------------- 上記の場合、index.phpには 「sample」と表示されます。 -----index.php------- <?php include_once 'http://example.com/lib/test.php'; echo $a; ?> --------------------- 上記の場合、なぜか表示されません。 そこで「http://~~」はincludeできないのかなと思ったのですが -----test.php-------- <?php $a = 'sample'; echo $a; ?> --------------------- -----index.php------- <?php include_once 'http://example.com/lib/test.php'; ?> --------------------- とすると、なぜか「sample」と表示されました。 この結果から、includeはできているみたいです。 なんとか -----test.php-------- <?php $a = 'sample'; ?> --------------------- -----index.php------- <?php include_once 'http://example.com/lib/test.php'; echo $a; ?> --------------------- で「sample」と表示させたくて試行錯誤してみたのですが どうしても解決できません。 お力添えのほどお願いできればと思います。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • IEのアドレスバー直接入力について

    ご質問があります。 IEのアドレスバーに直接URLを入力すると 入力項目が同じURLがリストで表示されるように なっているのですが、その表示を一部消したり することはできるのでしょうか? たとえば ----------------------------- localhost/←ここまで入力で以下のURLが表示されるとする。 ----------------------------- localhost/sample1/sample.php localhost/sample2/sample.php localhost/sample3/sample.php localhost/sample4/sample.php localhost/sample5/sample.php 上記の場合、sample2とsample4の情報のみよくしようするので、 ----------------------------- localhost/←ここまで入力で以下のURLが表示されるとする。 ----------------------------- localhost/sample2/sample.php localhost/sample4/sample.php と不必要なURLを削除したりできるのでしょうか? それとも一切表示させないようにするのでしょうか? 宜しくお願い致します。

専門家に質問してみよう